为什么矢量化代码比MATLAB中的循环运行得更快?

时间:2012-12-26 02:18:19

标签: matlab for-loop parallel-processing vectorization

我已阅读this但我仍然不明白为什么矢量化代码更快。

在for循环中,我可以使用parfor进行并行计算。如果矢量化代码更快,是否意味着它会自动并行化?

3 个答案:

答案 0 :(得分:19)

没有。你混合了两个重要的概念:

  • MATLAB旨在快速执行矢量运算。 MATLAB是一种解释型语言,这就是循环如此慢的原因。 MATLAB通过提供极快的速度(通常用C编写,针对特定架构进行优化)和经过良好测试的函数来回避这个问题。这里真的没有什么魔力,它只是一堆艰苦的工作和多年不断的小改进。

例如考虑一个简单的案例,如下所示:

s=0;
for i=1:length(v),
    s = s+v(i);
end

sum(v)

你应该使用tic和toc来计时这两个函数来说服自己在运行时的差异。大约有10个类似的常用函数对向量进行操作,例如:bsxfunrepmatlengthfind。矢量化是有效使用MATLAB的标准部分。除非你能有效地矢量化代码,否则你只是MATLAB世界的游客而不是公民。

  • 最新版本的MATLAB提供了parfor。 parfor不是一个银弹,它是一个可以使用和误用的工具(在上面的例子中尝试parfor)。并非所有的人都可以参加。 parfor设计用于任务并行类型的问题,其中循环的每次迭代独立于彼此的迭代。这是使用parfor-loop的关键要求。

虽然在许多情况下parfor可以帮助很多,但很少会出现非常大的增益循环类型。

答案 1 :(得分:15)

我同意carlosdc的回答。 但是,重要的是要记住,自6.5版开始以来,Matlab已经包含了一个JIT编译器,用于加速for循环等。

我使用v中的一百万个元素对您的总和示例进行了快速测试,得到了以下结果:

  • sum(v):4.3 ms
  • for-loop version:16 ms
  • for-loop version, no JIT:966 ms

可以像这样打开和关闭JIT:

feature accel off
feature accel on

通过矢量化代码改进的因子4当然仍然值得,但for循环不应该被担心,因为它们曾经是针对问题,否则它们是一个很好的解决方案。通常,一段很好的矢量化代码通常可以更简单,更不容易出错并且同时更快。

答案 2 :(得分:2)

在现代计算机中,寄存器(用于数学的临时存储器以及其他用途)具有许多位并且可以一起操作多个数字。例如,如果您的数据是uint8(8位),您可以在一个CPU时钟中为每个数据添加一个数字,或者您可以将其中的8个放在寄存器中,并将一个数字放在一个CPU时钟中的所有数据中。这样你的工作速度比for-loop快8倍。

这在某种意义上是并行化,但不像parfor。 Parfor使用CPU的多个内核,在上面的方法中,可以更有效地使用一个内核。如果你同时使用它们,你可以达到更高的速度。