1、介绍
图形处理单元 (GPU) 提供比 CPU 高得多的指令吞吐量和内存带宽 类似的价格和功率范围。 许多应用程序利用这些更高的功能来 在 GPU 上运行比在 CPU 上运行得更快。 其他计算设备,如 FPGA,也非常节能,但提供的能源要少得多 编程灵活性优于 GPU。
GPU 和 CPU 之间存在这种能力差异是因为它们 设计时考虑了不同的目标。 虽然 CPU 旨在擅长执行 一系列操作,称为 线程 ,尽可能快且可以执行 几十个这样的线程并行运行,GPU 旨在擅长执行 数千个并行(分摊较慢的单线程性能以实现更大的吞吐量)。
2. 编程模型
2.1. 内核
CUDA C++ 通过允许程序员定义 C++ 函数来扩展 C++, 称为 kernels ,当被调用时,会在其中执行 N 次 由 N 个不同的 并行 CUDA 线程 ,而不是仅 曾经像普通的 C++ 函数一样。
内核定义为 global 宣言 说明符和执行该内核的 CUDA 线程数 给定的内核调用是使用新的 <<<…>>> 执行 配置 语法(请参阅 C++ 语言扩展 )。 每个执行内核的线程 被赋予一个唯一的 线程 ID ID ,该 可在 内核通过内置变量。
作为说明,以下示例代码,使用内置变量 线程标识符 , 将两个 向量 相加 A 和 B 大小为 N 的 并存储 结果转化为向量 C :
// 内核定义
__global__ void VecAdd( float * A, float * B, float * C)
{
int i = threadIdx .x;
C[i] = A[i] + B[i];
}
int main()
{
...
// 内核调用 N 个线程
VecAdd <<< 1, N >>> (A, B, C);
...
}
这里,每个 的 N 个 执行 线程 向量添加() 执行一对加法。
2.2. 线程层次结构
为了方便, 线程标识符 是一个三分量向量