CUDA 基础

最后更新: 2023-12-20 00:50:48 +0800 +0800
原文以英文撰写。您正在阅读AI翻译版本。

CUDA 是 NVIDIA 用于通用 GPU 计算的平台。CUDA C++ 通过用于在 GPU 上启动工作负载的构造扩展了 C++,而 nvcc 编译器负责协调主机编译和设备代码编译。它不是独立的 C++ 替代品,而是围绕 NVIDIA GPU 构建的编程模型和工具链。

执行模型 #

称为主机代码的 CPU 程序会在 GPU 上启动一个内核。内核会运行大量轻量级线程。线程被分组为线程块,线程块组成网格。同一线程块中的线程可以通过高速共享内存和同步机制协作;线程块被设计为彼此独立运行,以便 GPU 将它们调度到各个多处理器上。

cpp
vector_add<<<grid_size, block_size>>>(a, b, result, count);

正确的启动维度、内存访问模式和传输成本,与算术运算本身同样重要。在主机与设备之间反复传输少量数据,可能会抵消 GPU 并行性的收益。

内存与同步 #

全局内存对所有线程可见,但延迟相对较高。共享内存属于线程块本地内存,适合用于数据复用。寄存器属于线程私有资源。合并的全局内存访问,即相邻线程访问相邻地址,通常可以提高吞吐量。

默认情况下,内核启动相对于主机是异步的。检查 CUDA 错误,并且仅在需要结果时进行同步;不必要的同步会减少 CPU 工作、数据传输和 GPU 执行之间的重叠。

多实例 GPU #

多实例 GPU(MIG)可用于部分 NVIDIA 数据中心 GPU 架构。它会将一块物理 GPU 划分为相互隔离的 GPU 实例,并为每个实例分配专用的计算资源和内存资源。CUDA 应用程序会将分配到的实例视为独立设备,从而实现比普通进程共享更强的工作负载隔离。MIG 支持情况和可用配置取决于具体的 GPU 型号和驱动程序栈。

评论

在 GitHub 上阅读或评论(发表评论需要登录)