问题描述
我已经阅读了这个,但我仍然没有了解为什么矢量化代码更快.
I've read this but I still don't understand why vectorized code is faster.
在 for 循环中,我可以使用 parfor 进行并行计算.如果向量化代码更快,是否意味着它会自动并行化?
In for loops, I can use parfor to for parallel computation. If vectorized code is faster, does it means that it is automatically parallelized?
推荐答案
没有.您混淆了两个重要概念:
No. You're mixing two important concepts:
- MATLAB 旨在非常快速地执行向量运算.MATLAB 是一种解释型语言,这就是为什么它的循环如此缓慢的原因.MATLAB 通过提供极快的(通常用 C 编写,并针对特定架构进行优化)和经过良好测试的函数来对向量进行操作来回避这个问题.这里真的没有魔法,它只是一堆努力工作和多年不断的小改进.
例如,考虑一个像下面这样的小案例:
Consider for example a trivial case such as the following:
s=0;
for i=1:length(v),
s = s+v(i);
end
和
sum(v)
您可能应该使用 tic 和 toc 为这两个函数计时,以说服自己在运行时上存在差异.类似的常用的对向量进行运算的函数大概有10个,例子有:bsxfun
、repmat
、length
、find
.矢量化是有效使用 MATLAB 的标准部分.在您可以有效地矢量化代码之前,您只是 MATLAB 世界中的一名游客,而不是公民.
you should probably use tic and toc to time these two functions to convince yourself of the difference in runtime. There are about 10 similar commonly used functions that operate on vectors, examples are: bsxfun
, repmat
, length
, find
. Vectorization is a standard part of using MATLAB effectively. Until you can vectorize code effectively you're just a tourist in the world of MATLAB not a citizen.
- 最新版本的 MATLAB 提供了 parfor.parfor 不是灵丹妙药,它是一种可以使用和误用的工具(在上面的 sum 示例中尝试 parfor).并非所有 fors 都可以解析.parfor 是为任务并行类型的问题设计的,其中循环的每次迭代都独立于其他迭代.这是使用 parfor 循环的关键要求.
虽然在许多情况下 parfor 可以提供很大帮助,但可以为非常大的收益进行 parfor 的循环类型很少发生.
While in many cases parfor can help a lot the type of loops that can be parfored for very large gains occur seldomly.
这篇关于为什么矢量化代码比 MATLAB 中的 for 循环运行得更快?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!