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

elw*_*lwc 23 parallel-processing matlab for-loop vectorization

我读过这篇文章,但我仍然不明白为什么矢量化代码更快.

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

car*_*sdc 19

不,你要混合两个重要概念:

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

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

s=0;
for i=1:length(v),
    s = s+v(i);
end
Run Code Online (Sandbox Code Playgroud)

sum(v)
Run Code Online (Sandbox Code Playgroud)

你应该使用tic和toc来计算这两个函数的时间来说服自己在运行时的差异.有迹象表明,在载体操作约10类似常用的功能,实例是:bsxfun,repmat,length,find.矢量化是有效使用MATLAB的标准部分.除非你能有效地矢量化代码,否则你只是MATLAB世界的游客而不是公民.

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

虽然在很多情况下parfor可以帮助很多,但很少会出现非常大的增益.

  • 你错过了一件重要的事情 - **matlab是一种解释性语言**.这就是循环如此缓慢的原因.特别是与高度优化的矩阵运算相比,matlab被设计用于. (3认同)
  • 您可能还想在解释语言中添加原因循环很慢,因为每个函数调用都会带来一些开销.因此,当你使用一百万个元素的数组调用一次函数时,你比使用标量调用一百万次要快得多. (2认同)

Kla*_*CPH 15

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

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

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

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

feature accel off
feature accel on
Run Code Online (Sandbox Code Playgroud)

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