我想计算m x n
矩阵A
的行和,或等效其转置A'
的列总和(我有两者)在内存中所以A'
在计算中没有花费额外费用。我计划启动m
个主题,每个主题都可以循环遍历n
A
行n
行A'
行。如果我们假设矩阵以列主要格式存储(即与CUBLAS一样),哪种方法会更快?
到目前为止我的想法(关于合并内存访问):
如果我是行和,那么同一块中的线程将在每次迭代时从相邻的内存位置读取。然而,同样,如果我对列进行求和,那么每个线程将迭代一个连续的内存块。因此,如果我有相同块的线程1
,2
和3
,那么它们的内存访问将如此(假设列主要存储):< / 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
上求和? )
答案 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共享密钥可能不会非常有用。我认为有太多的可能性可以做出明确的答案。一些想法: