在矩阵乘法中我们做这样的事情
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];
我们如何增加数据的局部性以优化乘法循环
答案 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稍后在右侧相乘,则原始顺序效果更好。第二个建议将一列的副本保存为连续单词数组,同时计算一个产品总和以充分利用内存读取该副本。