我正在使用 MATLAB 对一些矩阵乘法技术进行原型设计并比较效率。最终,我会将原型代码移到 C 中。这是一个家庭作业,我们需要编写一个高效的矩阵乘法例程(通过了解缓存大小、位置等)。
我很好奇这两个非常相似的循环之间的效率差异:
矩阵乘法循环 1 - 将 A 的列乘以 B 的元素 -> C 的列
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
结尾
矩阵乘法循环 2 - 将 A 的列乘以 B 的元素 -> 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快。有人可以帮我理解为什么会这样吗?
PS:我在一般的编码堆栈交换上发布了这个,但没有得到太多回应,所以我想我也可以在这里发布。