我正在尝试在 cuda 中进行矩阵乘法。我的实现与 cuda 示例不同。
cuda 示例(来自 cuda 样本)通过将第一个矩阵的行中的每个值乘以第二个矩阵的列中的每个值来执行矩阵乘法,然后将乘积相加并将其存储在输出向量中的索引处来自第一个矩阵的行。
我的实现将第一个矩阵的列中的每个值乘以第二个矩阵的行的单个值,其中行索引 = 列索引。然后它在全局内存中有一个输出向量,它的每个索引都更新了。
cuda 示例实现可以有一个线程更新输出向量中的每个索引,而我的实现可以有多个线程更新每个索引。
我得到的结果只显示了一些值。例如,如果我让它执行 4 次更新迭代,它只会执行 2 或 1 次。
我认为线程可能会相互干扰,因为它们都试图写入全局内存中向量的相同索引。所以也许,当一个线程正在写入索引时,另一个可能无法插入它的值并更新索引?
只是想知道这个评估是否有意义。
例如。将以下两个矩阵相乘:
[3 0 0 2 [1 [a
3 0 0 2 x 2 = b
3 0 0 0 3 c
0 1 1 0] 4] d]
Cuda 示例使用 4 个线程以下列方式进行矩阵乘法,其中 a、b、c、d 存储在全局内存中:
Thread 0: 3*1 + 0*2 + 0*3 + 2*4 = a
Thread 1: 3*1 + 0*2 + 0*3 + 2*4 = b
Thread 2: 3*1 + 0*2 + 0*3 + 0*4 = c
Thread 3: 0*1 + 1*2 + 1*3 + 0*4 = d
我的实现如下所示:
a = b = c = d = 0
Thread 0:
3*1 += a
3*1 += b
3*1 += c
0*1 += d
Thread 1:
0*2 += a
0*2 += b
0*2 += c
1*2 += d
Thread 2:
0*3 += a
0*3 += b
0*3 += c
1*3 += d
Thread 3:
2*4 += a
2*4 += b
0*4 += c
0*4 += d
因此,所有四个线程都可能同时尝试更新其中一个索引。