我已阅读this但我仍然不明白为什么矢量化代码更快。
在for循环中,我可以使用parfor进行并行计算。如果矢量化代码更快,是否意味着它会自动并行化?
答案 0 :(得分:19)
没有。你混合了两个重要的概念:
例如考虑一个简单的案例,如下所示:
s=0;
for i=1:length(v),
s = s+v(i);
end
和
sum(v)
你应该使用tic和toc来计时这两个函数来说服自己在运行时的差异。大约有10个类似的常用函数对向量进行操作,例如:bsxfun
,repmat
,length
,find
。矢量化是有效使用MATLAB的标准部分。除非你能有效地矢量化代码,否则你只是MATLAB世界的游客而不是公民。
虽然在许多情况下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的多个内核,在上面的方法中,可以更有效地使用一个内核。如果你同时使用它们,你可以达到更高的速度。