为什么量化代码的运行速度比在MATLAB循环更快?(Why does vectorized code

2019-07-17 13:37发布

我读过这个 ,但我还是不明白,为什么量化代码更快。

在for循环中,我可以使用PARFOR用于并行计算。 如果量化代码是快,不就意味着它是自动并行化?

Answer 1:

号你混合两个重要概念:

  • 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上的总和上面的例子)的工具。 并非所有的维权可以parfored。 PARFOR被设计用于的问题,其中循环的每次迭代是相互独立迭代的任务并行类型。 这是使用PARFOR循环的关键要求。

虽然在很多情况下PARFOR可以有很大的帮助,可以parfored非常大的收益循环的类型罕发生。



Answer 2:

我同意他的回答carlosdc。 然而,要记住,Matlab的自6.5版本已经包含了JIT编译器加快for循环和喜欢它是非常重要的。

我做了你和示例的快速测试,在一百万个元素v ,得到了以下结果:

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

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

feature accel off
feature accel on

通过矢量化码的因素4的改进当然仍常值得的,但因为他们曾经是的,他们是另有一个很好的解决问题的for循环不应该担心。 时常想起,一块好量化代码往往可以更简单,更容易出错,速度更快的同时。



Answer 3:

在现代计算机中,寄存器(临时存储器用于数学,其他用途)有许多位,并可以操纵多个号码一起。 例如,如果你的数据是UINT8(8位),您可以在一个CPU时钟将号码添加到每个人,或者你可以把8人一起在寄存器和一个数字都掌握在一个CPU时钟。 这样,你的工作比for循环快8倍。

这在某种意义上是并行的,但不喜欢PARFOR。 PARFOR使用CPU的多个核,和在上述方法中一个芯被更有效地使用。 如果你使用他们两个,你甚至可以达到更高的速度。



文章来源: Why does vectorized code run faster than for loops in MATLAB?