要点

  1. GPU对比CPU计算正弦和:使用单CPU、使用OpenMP库和CUDA
  2. CUDA并行计算:3D网格运行内核:线程块,线程线性处理3D数组,并行归约,共享内存,矩阵乘法/平铺矩阵乘法,基本线性代数子程序
  3. 平铺分区,矢量加载,warp级内在函数和子 warp,线程发散和同步,联合组
  4. 使用 2D 和 3D 模板,迭代求解偏微分方程和图像处理
  5. 使用 GPU 纹理硬件执行快速插值,图像配准
  6. 蒙特卡洛模拟3D伊辛模型
  7. CUDA 流
  8. CUDA正电子发射断层扫描仪校准和图像重建
  9. GPU扩展

矩阵乘法示例

假设我们有两个矩阵,A 和 B。假设A是一个$n \times m$矩阵,这意味着它有n行和m列。还假设 B 是 $m \times w$ 矩阵。乘法A * B(与B * A不同)的结果是一个$n \times w$矩阵,我们称之为M。也就是说,结果矩阵的行数等于第一个矩阵 A 的行数和第二个矩阵 B 的列数。

为什么会发生这种情况以及它是如何运作的?这里两个问题的答案是相同的。我们以 M 的单元格 1,1(第一行,第一列)为例。运算 M=A * B 后其中的数字是 A 第 1 行中的数字与 B 第 1 列中的数字的所有逐元素乘法之和。也就是说,在 M 的单元格 i, j 中,我们得到了 A 中第 i 行和 B 中第 j 列中所有数字的逐元素乘法之和。

下图直观地解释了这个想法:

现在应该很清楚为什么矩阵-矩阵乘法是并行计算的一个很好的例子了。我们必须计算 C 中的每个元素,并且每个元素彼此独立,因此我们可以有效地并行化。

我们将看到实现这一目标的不同方法。我们的目标是在本文中添加新概念,最终形成一个 2D 内核,它使用共享内存来有效地优化操作。

网格和块

当我们使用指令 <<< >>> 调用内核时,我们自动定义一个 dim3 类型变量,定义每个网格的块数和每个块的线程数。