我正在使用MATLAB对一些矩阵乘法技术进行原型设计并比较效率 . 最后,我将原型代码移动到C.这是一个家庭作业,我们需要编写一个有效的矩阵乘法例程(通过了解缓存大小,位置等) .
我很好奇这两个非常相似的循环之间的效率差异:
Matrix Multiply Loop 1 - 对B - > C列的A次元素的列求和
function [C] = dgemm_naivepe( A,B,C,n )
for j=1:n
tempcol=zeros(n,1);
for k=1:n
for i=1:n
tempcol(i)=tempcol(i)+A(i+(k-1)*n)*B(k+(j-1)*n);
end
end
for k=1:n
C(k+(j-1)*n)=tempcol(k);
end
end
结束
Matrix Multiply Loop 2 - 对B列的A次元素的总和 - > C列
function [C] = dgemm_naivepe( A,B,C,n )
for j=1:n
for k=1:n
for i=1:n
C(i+(j-1)*n)=C(i+(j-1)*n)+A(i+(k-1)*n)*B(k+(j-1)*n);
end
end
end
end
经过几次不同矩阵大小的测试后,我发现 Loop 1 比 Loop 2 快 . 有人能帮助我理解为什么会这样吗?
编辑:如您所见,矩阵以列主要顺序存储为1D数组 .