Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 使用CUDA对矩阵的行或列求和是否更快?_Performance_Matrix_Cuda_Sum_Gpgpu - Fatal编程技术网

Performance 使用CUDA对矩阵的行或列求和是否更快?

Performance 使用CUDA对矩阵的行或列求和是否更快?,performance,matrix,cuda,sum,gpgpu,Performance,Matrix,Cuda,Sum,Gpgpu,我想计算一个mn矩阵a,的行和,或者等价地其转置a'的列和(我在内存中都有,所以a'不需要额外的计算)。我计划启动m线程,每个线程可以循环A的n列,或者n行A'。如果我们假设矩阵以列主格式存储(即与CUBLAS类似),那么哪种方法更快 我目前的想法(关于合并内存访问): 如果我是行和,那么同一块中的线程将在每次迭代时从相邻的内存位置读取。同样地,如果改为使用列和,则每个线程将在连续的内存块上迭代。因此,如果在同一块中有线程1、2和3,则它们的内存访问看起来是这样的(假设列主存储): 但这并没有

我想计算一个
mn
矩阵
a
的行和,或者等价地其转置
a'
的列和(我在内存中都有,所以
a'
不需要额外的计算)。我计划启动
m
线程,每个线程可以循环
A
n
列,或者
n
A'
。如果我们假设矩阵以列主格式存储(即与CUBLAS类似),那么哪种方法更快

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

如果我是行和,那么同一块中的线程将在每次迭代时从相邻的内存位置读取。同样地,如果改为使用列和,则每个线程将在连续的内存块上迭代。因此,如果在同一块中有线程
1
2
3
,则它们的内存访问看起来是这样的(假设列主存储):

  • 但这并没有告诉我哪个会更快
  • 它也不考虑块级别的行为(即,如果第一个启动的块与行
    1-32
    相加,那么第二个启动的块是否保证与行
    33-64
    相加?)
“同一块中的线程将在每次迭代时从相邻内存位置读取”

速度更快。这几乎就是联合访问的定义。

对于单个线程:

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个线程,那么谁知道会发生什么呢。您的一级缓存将是特定于核心的,但如果您的总体矩阵大于缓存的大小,那么您的三级共享缓存可能不会有很大帮助。我认为说有太多的可能性来做出一个明确的答案是不正确的。一些想法:

  • 在您的机器上产生的线程数超过了内核数,这可能会对您造成更大的伤害
  • 相反,如果您的线程数与CPU的内核数相同,则在矩阵中以相等的间距启动线程
谢谢,但我是在GPU上进行计算的,我的矩阵被存储在内存中,使每个列在内存中连续排列。关于m核CPU,这个问题不是以一般方式提出的。对于CUDA GPU,在多个线程处于活动状态的情况下,通过合并访问实现内存带宽的最佳利用。带宽有限的代码的最佳总体吞吐量将出现在内存带宽的最佳使用情况下。多个元素的总和将是一个带宽有限的代码。所以我认为一个明确的答案是可能的。当应用于CUDA GPU时,您的其他一些评论不适用或错误,例如“产生的线程数超过了内核数…”这通常是您希望对CUDA GPU执行的操作。我想您没有注意到这是CUDA GPU编程问题吧?
for (i = 0 to size)
   for (j = 0 to size)
      array[j][i]