矢量化是啥意思?

Posted

技术标签:

【中文标题】矢量化是啥意思?【英文标题】:What does vectorization mean?矢量化是什么意思? 【发布时间】:2010-12-03 17:59:40 【问题描述】:

矢量化代码是个好主意吗?在什么时候做这件事上有什么好的做法?下面会发生什么?

【问题讨论】:

另见:***.com/questions/1422149/what-is-vectorization 【参考方案1】:

向量化意味着编译器检测到你的独立指令可以作为一条SIMD指令执行。通常的例子是,如果你做类似的事情

for(i=0; i<N; i++)
  a[i] = a[i] + b[i];

它将被矢量化为(使用矢量符号)

for (i=0; i<(N-N%VF); i+=VF)
  a[i:i+VF] = a[i:i+VF] + b[i:i+VF];

基本上,编译器会选择一个可以同时对数组的 VF 元素执行的操作,然后执行 N/VF 次,而不是执行单个操作 N 次。

它提高了性能,但对架构提出了更高的要求。

【讨论】:

那么程序员可以做些什么来确保矢量化(除了打开优化)? 据我所知,编译器在自动矢量化方面是有限的,所以最好的办法是让你的代码尽可能的简单。您还可以检查生成的汇编代码以查看编译器是否矢量化。 @jacob:你不能真正“确保”它,你可能想看看openmp.org 的明确告诉编译器向量化的方法。 向量化并不意味着编译器会这样做,只是使用了 SIMD 指令。当编译器生成 SIMD 代码时,通常称为自动矢量化。【参考方案2】:

如上所述,向量化用于利用 SIMD 指令,该指令可以对打包到大寄存器中的不同数据执行相同的操作。

使编译器能够自动向量化循环的一般准则是确保在循环的不同迭代中没有流依赖和反依赖 b/w 数据元素。

http://en.wikipedia.org/wiki/Data_dependency

英特尔 C++/Fortran 编译器等一些编译器能够自动矢量化代码。如果它无法向量化循环,英特尔编译器能够报告它为什么不能这样做。有报告可用于修改代码,使其变得可矢量化(假设它是可能的)

“为现代架构优化编译器:基于依赖的方法”一书中深入介绍了依赖关系

【讨论】:

【参考方案3】:

向量化不必局限于可以保存大数据的单个寄存器。就像使用“128”位寄存器来保存“4 x 32”位数据一样。这取决于架构限制。一些架构有不同的执行单元,它们有自己的寄存器。在这种情况下,可以将部分数据馈送到该执行单元,并且可以从对应于该执行单元的寄存器中获取结果。

例如,考虑以下情况。

for(i=0; i a[i] = a[i] + b[i];

如果我正在研究具有两个执行单元的架构,那么我的向量大小定义为两个。上面提到的循环将被重新定义为

for(i=0; i a[i] = a[i] + b[i] ; a[i+1] = a[i+1] + b[i+1];

注意:for 语句中的 2 是从向量大小得出的。

由于我有两个执行单元,循环内的两个语句将被输入到两个执行单元中。总和将分别在执行单元中累加。最后将执行累加值的总和(来自两个执行单元)。 好的做法是 1. 在对循环进行矢量化之前,需要检查依赖关系等约束(循环的不同迭代之间)。 2. 需要防止函数调用。 3. 指针访问会产生别名,需要防止。

【讨论】:

【参考方案4】:

这是 SSE 代码生成。

您有一个循环,其中包含浮点矩阵代码 matrix1[i][j] + matrix2[i][j],编译器生成 SSE 代码。

【讨论】:

SEE 不是唯一的向量指令集。 PPC 有 Altivec,其他架构也有自己的向量指令。【参考方案5】:

也许还可以看看 libSIMDx86(源代码)。

一个很好解释的例子是:

Choosing to Avoid Branches: A Small Altivec Example

【讨论】:

以上是关于矢量化是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

scipy中的这个稀疏矩阵是啥意思?

interpreter.get_input_details() 中的“量化”是啥意思?

grad是啥意思啊(数学类)

sop是啥意思

Ai是啥意思

arcgis 中feature 是啥意思