MATLAB 矩阵乘法效率

计算科学 线性代数 matlab 矩阵 效率
2021-11-29 12:53:28

我正在使用 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 1Loop 2快。有人可以帮我理解为什么会这样吗?

PS:我在一般的编码堆栈交换上发布了这个,但没有得到太多回应,所以我想我也可以在这里发布。

2个回答

您的循环 2 没有预先分配 C. 因此它被调整大小n次,这需要多次重新分配。尝试C = zeros(n, n)在 for 循环之前添加。

[编辑:第一个也是,所以这可能不是真正的原因。]

(也就是说,我赞同 ChrisRackauckas 的评论--- 在这个级别的 Matlab 下测试时序没有什么意义。)

也许 C 的大小与 tempcol 的大小有什么不同?
如果它将 C 矩阵拉入缓存,则它必须为 tempcol 腾出更多空间,可能会从 A 和/或 B 中删除对于较小的 tempcol 不会删除的数据。