矢量化是什么意思?

veh*_*zzz 28 c c++ compiler-construction gcc vectorization

向量化代码是一个好主意吗?在什么时候这样做有什么好的做法?下面会发生什么?

Zed*_*Zed 44

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

for(i=0; i<N; i++){
  a[i] = a[i] + b[i];
}
Run Code Online (Sandbox Code Playgroud)

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

for (i=0; i<(N-N%VF); i+=VF){
  a[i:i+VF] = a[i:i+VF] + b[i:i+VF];
}
Run Code Online (Sandbox Code Playgroud)

基本上,编译器选择一个可以同时在阵列的VF元素上完成的操作,并执行N/VF次,而不是单次操作N次.

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

  • 那么程序员可以做些什么来确保矢量化(除了开启优化之外)? (6认同)
  • Vectorization并不意味着编译器会这样做,只是使用了SIMD指令.当编译器生成SIMD代码时,它通常称为自动向量化. (6认同)
  • @jacob:您不能真正“确保”它,您可能想看一下http://openmp.org/,以了解明确告诉编译器进行矢量化的方法。 (2认同)

Gau*_*thy 13

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

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

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

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

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