gpt4 book ai didi

matlab - MATLAB 矢量化代码如何工作 "under the hood"?

转载 作者:太空宇宙 更新时间:2023-11-03 19:16:32 27 4
gpt4 key购买 nike

我了解在 MATLAB 等语言中使用矢量化如何通过消除维护循环变量的开销来加速代码,但矢量化实际上是如何在汇编/机器代码中发生的?我的意思是在某处仍然必须有一个循环,对吧?

最佳答案

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 的“向量化”不等同于使用 CPU 向量指令。它只是一个词,用来表示缺少在 MATLAB 中实现的循环。更让人困惑的是,有时人们甚至用这个词来表示某个循环是使用内置函数实现的,例如 arrayfun 或 bsxfun。这更具误导性,因为这些功能可能是 significantly slower than native matlab loops .正如 robince 所说,如今 matlab 中并非所有循环都很慢,尽管您确实需要知道它们何时有效,何时无效。

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

关于matlab - MATLAB 矢量化代码如何工作 "under the hood"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12615309/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com