增加矩阵乘法中的数据局部性

时间:2013-09-13 23:40:09

标签: c optimization matrix-multiplication

在矩阵乘法中我们做这样的事情

 for (i = 0; i < N; i = i + 1)
   for (j = 0; j < N; j = j + 1)
      A[i*N + j] = (double) random() / SOME_NUMBER;     

 for (i = 0; i < N; i = i + 1)
    for (j = 0; j < N; j = j + 1)
       B[i*N + j] = (double) random() / SOME_NUMBER;


 for (i = 0; i < N; i = i + 1)
    for (j = 0; j < N; j = j + 1)
       for (k = 0; k < N; k = k + 1)
            C[i*N + j] = C[i*N + j] + A[i*N + k]*B[k*N + j];

我们如何增加数据的局部性以优化乘法循环

1 个答案:

答案 0 :(得分:1)

以换位形式存储B:

B[j*N + i] = ramdom() / SOME_NUMBER;

您还必须按顺序访问转置数组:

C[i*N + j] = C[i*N + j] + A[i*N + k]*B[j*N + k];

如果那是不可能的,首先重写乘法以循环j,然后重写B的第j列的第一个乘积(使用A的第0行)以将B [*; j]的元素提取为连续的N向量,并在该列的其​​余产品中使用该顺序复制。

这个想法是将B列放入连续的记忆单词中。转置很自然地做到了这一点,但保持这种格式可能并不实际。 (例如,如果B稍后在右侧相乘,则原始顺序效果更好。第二个建议将一列的副本保存为连续单词数组,同时计算一个产品总和以充分利用内存读取该副本。