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的内核数相同,则在矩阵中以相等的间距启动线程李>
for (i = 0 to size)
for (j = 0 to size)
array[j][i]