假设我们有两个矩阵,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 类型变量,定义每个网格的块数和每个块的线程数。