使用CUDA对矩阵的行或列求和更快吗?

时间:2013-05-06 20:48:35

标签: performance matrix cuda sum gpgpu

我想计算m x n矩阵A的行和,或等效其转置A'的列总和(我有两者)在内存中所以A'在计算中没有花费额外费用。我计划启动m个主题,每个主题都可以循环遍历n AnA'行。如果我们假设矩阵以列主要格式存储(即与CUBLAS一样),哪种方法会更快?

到目前为止我的想法(关于合并内存访问):

如果我是行和,那么同一块中的线程将在每次迭代时从相邻的内存位置读取。然而,同样,如果我对列进行求和,那么每个线程将迭代一个连续的内存块。因此,如果我有相同块的线程123,那么它们的内存访问将如此(假设列主要存储):< / p>

1 2 3 ... 1 2 3 ... 1 2 3 ... for row-sums
1 1 1 ... 2 2 2 ... 3 3 3 ... for column-sums
  • 但这并没有告诉我哪个会更快。
  • 它也没有考虑块级的行为(即,如果第一个块启动了对行1-32的求和,第二个块是否会保证在行33-64上求和? )

2 个答案:

答案 0 :(得分:4)

“同一个块中的线程将在每次迭代时从相邻的存储器位置读取”

更快。这几乎是合并访问的定义。

答案 1 :(得分:-1)

对于单个线程:

for (i = 0 to size)
   for (j = 0 to size)
      array[i][j]

会比

更快
for (i = 0 to size)
   for (j = 0 to size)
      array[j][i]

因为内存中的每一行都是连续排列在内存中的。

但是对于多线程而言,它并不是那么明确。如果你在M核CPU上产生M个线程,那么谁知道会发生什么。您的L1缓存将是特定于核心的,但假设您的整体矩阵大于缓存大小,则您的L3共享密钥可能不会非常有用。我认为有太多的可能性可以做出明确的答案。一些想法: