MATLAB矢量化代码如何在“引擎盖下”工作?

时间:2012-09-27 06:24:36

标签: matlab vectorization

我理解在MATLAB这样的语言中使用矢量化是如何通过消除维护循环变量的开销来加速代码的,但是矢量化实际上是如何在汇编/机器代码中进行的?我的意思是在某个地方仍然必须有一个循环,对吗?

2 个答案:

答案 0 :(得分:8)

Matlab'矢量化'概念与矢量指令概念完全不同,例如SSE。这是两组人之间的常见误解:matlab程序员和C / asm程序员。 Matlab的“矢量化”,就像这个词一样常用,只有 关于以(矢量)矩阵索引的形式表达循环,有时候用基本矩阵/矢量运算来表达事物(BLAS) ),而不是写循环本身。 Matlab'矢量化'代码不一定表示为矢量化CPU指令。请考虑以下代码:

A = rand(1000);
B = (A(1:2:end,:)+A(2:2:end,:))/2;

此代码计算两个相邻矩阵行的平均值。它是一个'矢量化'的matlab表达式。但是,由于matlab按列存储矩阵(列在内存中是连续的),因此这个操作不会简单地改为对SSE向量的操作:因为我们按行执行操作,所以需要加载到向量中的数据不是连续存储的在记忆中。

另一方面,这段代码

A = rand(1000);
B = (A(:,1:2:end)+A(:,2:2:end))/2;

可以利用SSE指令和流指令,因为我们一次操作两个相邻的列。

因此,matlab'vectorization'并不等同于使用CPU向量指令。它只是一个词,用于表示在MATLAB中实现的循环不足。为了增加混淆,有时人们甚至使用这个词来表示已经使用内置函数实现了一些循环,例如arrayfun或bsxfun。这更具误导性,因为这些功能可能是significantly slower than native matlab loops。正如robince所说,现在matlab并不是所有循环都很慢,尽管你确实需要知道它们何时工作,何时不知道。

以任何方式你总是需要一个循环,它只是在matlab内置函数/ BLAS而不是用户matlab代码中实现。

答案 1 :(得分:7)

是的还有一个循环。但是它能够直接在编译的代码中循环。 Fortran中的循环(Matlab最初的基础)C或C ++本身并不慢。它们在Matlab中很慢是动态运行时的属性(在Python等其他动态语言中它们也较慢)。

由于Matlab引入了Just-In-Time编译器循环性能实际上已经大大增加 - 因此,对于最新版本而言,避免循环的旧指南并不像以前那样重要。