对于代码进行向量化是一个好的想法吗?在何时进行向量化方面有哪些良好的实践经验?底层会发生什么?
对于代码进行向量化是一个好的想法吗?在何时进行向量化方面有哪些良好的实践经验?底层会发生什么?
向量化意味着编译器会检测到您的独立指令可以作为一个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次。
这增加了性能,但对架构提出了更多要求。
如上所述,向量化被用于利用SIMD指令,这些指令可以对不同数据打包到大型寄存器中的相同操作进行操作。
使编译器能够自动向量化循环的一般准则是确保不会在不同迭代的循环中存在数据元素之间的流和反依赖性。
http://zh.wikipedia.org/wiki/数据依赖
像英特尔C++/Fortran编译器等一些编译器能够自动向量化代码。如果它无法向量化一个循环,英特尔编译器能够报告为什么不能这样做。这些报告可以用来修改代码,使其变得可向量化(假设可能)
依赖关系在书籍“Optimizing Compilers for Modern Architectures: A Dependence-based Approach”中有详细讲解。
这是SSE代码生成。
您有一个循环,其中包含浮点矩阵代码matrix1[i][j] + matrix2[i][j],编译器会生成SSE代码。