异步拷贝概念

  • 从全局内存加载数据到共享内存 [global mem] -> [L2 cache] -> [L1 cache] -> [register] -> [shared mem]
  • cp.copy.cg [global mem] -> [L2 cache] -> [shared mem]
  • cp.copy.ca [global mem] -> [L2 cache] -> [L1 cache] -> [shared mem]

不同架构下内存拷贝

Ampere(SM80)

  • cp.async
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    cp.async.ca.shared{::cta}.global{.level::cache_hint}{.level::prefetch_size}
    [dst], [src], cp-size{, src-size}{, cache-policy} ;
    cp.async.cg.shared{::cta}.global{.level::cache_hint}{.level::prefetch_size}
    [dst], [src], 16{, src-size}{, cache-policy} ;
    cp.async.ca.shared{::cta}.global{.level::cache_hint}{.level::prefetch_size}
    [dst], [src], cp-size{, ignore-src}{, cache-policy} ;
    cp.async.cg.shared{::cta}.global{.level::cache_hint}{.level::prefetch_size}
    [dst], [src], 16{, ignore-src}{, cache-policy} ;

    .level::cache_hint = { .L2::cache_hint }
    .level::prefetch_size = { .L2::64B, .L2::128B, .L2::256B }
    cp-size = { 4, 8, 16 }

    TS const* gmem_ptr = &gmem_src;
    uint32_t smem_int_ptr = cast_smem_ptr_to_uint(&smem_dst);
    asm volatile("cp.async.ca.shared.global.L2::128B [%0], [%1], %2;\n"
    :: "r"(smem_int_ptr),
    "l"(gmem_ptr),
    "n"(sizeof(TS)));
  • 同步机制
    同步机制有两种:Async Group; mbarrier
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // Establishes an ordering w.r.t previously issued cp.async instructions. Does not block.
    cp_async_fence()
    {
    #if defined(CUTE_ARCH_CP_ASYNC_SM80_ENABLED)
    asm volatile("cp.async.commit_group;\n" ::);
    #endif
    }

    // /// Blocks until all but N previous cp.async.commit_group operations have committed.
    template <int N>
    CUTE_HOST_DEVICE
    void
    cp_async_wait()
    {
    if constexpr (N == 0) {
    asm volatile("cp.async.wait_all;\n" ::);
    } else {
    asm volatile("cp.async.wait_group %0;\n" :: "n"(N));
    }
    }
    cp.async.wait_all = cp.async.commit_group + cp.async.wait_group 0

async group是per thread的。一个async group内的异步操作完成顺序是无序的,async group之间完成顺序取决于提交顺序。

https://www.zhihu.com/column/c_1669290006261825536

深度学习相关论文列表,涵盖推理优化、分布式训练、通信压缩、量化技术等领域的重要论文,包括PipeDream、梯度压缩、量化算法等核心技术。
Read more »

性能优化技术总结,涵盖CPU和GPU的理论峰值计算性能、内存带宽计算方法,以及深度学习模型优化策略,包括算子优化、图优化、算子融合等技术。
Read more »

MLIR编译器基础设施介绍,包括Dialect设计(类型、属性、操作、接口)、Dialect转换、代码转换、变换、翻译和Pass优化等编译器技术。
Read more »

性能分析工具使用指南,包括PyTorch Profiler和NVIDIA Nsight等工具的使用方法,帮助开发者进行代码性能分析和优化。
Read more »

Paddle Lite移动端推理框架深度解析,包括OpLite、OpParam、Kernel、MIR、TypeSystem、KernelContext等核心模块设计,以及硬件后端扩展方法和优化策略。
Read more »

UML设计模式基础概念详解,包括依赖、泛化、实现、关联、聚合、组合等关系的定义、表示方法和C++代码示例,帮助理解面向对象设计原则。
Read more »

CUDA开发环境配置指南,包括nvcc编译器安装、NVIDIA容器镜像使用、网络仓库安装方法,以及nsys性能分析工具的安装配置步骤。
Read more »

Linux环境下Python 3.12安装配置指南,包括从源码编译安装、使用deadsnakes PPA安装、pip配置以及设置Python 3.12为默认版本的完整步骤。
Read more »
0%