用于加速的并行矩阵乘法序列

时间:2016-06-18 05:22:05

标签: performance matlab matrix-multiplication

在我的函数中,有很多元素明智的矩阵乘法是独立的。有没有办法同时计算它们?

所有这些都是非常简单的操作,但是我运行时间的70%用于代码的这些部分,因为这个函数被调用了数百万次。

function [r1,r2,r3]=backward(A,B,C,D,E,F,r1,r2,r3)
r1=A.*B;
r2=C.*D;
r3=E*F;
end

for i=1:300

[r1,r2,r3]=backward(A,B,C,D,E,F,r1,r2,r3)

end

2 个答案:

答案 0 :(得分:0)

编辑:在写完答案后,我发现你没有通过矩阵乘法将所有输入矩阵相乘。其中一些是元素乘法。如果这是您的意图,则以下答案将不适用。

您正在寻找用于计算多个矩阵的乘积的最优算法。人们很久以前就研究过这个问题,他们提出了动态编程算法来决定最优顺序。

例如,如果A的大小为10000 x 1B的大小为1 x 10000C的大小为10000 x 1,则为如果我们将A*B*C计算为A*(B*C)而不是(A*B)*C,那么效率会更高。这种技术的正确性证明在于矩阵乘法是相关的。您可以阅读有关此on Wikipedia的更多信息。 如果你想要一个高质量的MATLAB实现,你可以找到它here。它将矩阵作为输入并给出产品。看起来这个实现在寻找计算“最多”10个矩阵的最佳方法方面做得不错。

答案 1 :(得分:0)

首先要注意的是:您提供的最后3个变量不会被使用。我不认为这会很重要,但清理它会更好。

现在的答案是:

MATLAB是关于矩阵运算的,它已经过高度优化。即使使用C ++,您也不会期望显着的加速(并且对减速保持警惕)。因此,根据问题中提供的信息,结论是您无法做任何事情来加速独立矩阵计算。

话虽如此:如果你可以减少顺序函数调用的次数,可能会有所收获。

一般来说很难说如何做到这一点,但有两个想法:

  1. 如果你在for循环中调用函数,请使用parfor循环(假设你有并行处理工具箱,否则手动拆分循环并打开4个matlab实例以对循环进行并行化) (如果需要,可以是automated。)
  2. 看看你是否真的需要这么多函数调用小矩阵运算。如果你可以改进你的算法,这可以提供一个巨大的改进,但你可能仍然能够组合多个矩阵(例如A的多个版本与多个版本的B)并做一次大的乘法,而不是100个小的矩阵)。