我正在尝试对一些简单的计算进行矢量化,以加快 SIMD 架构的速度。但是,我也想将它们作为内联函数,因为函数调用和非向量化代码也需要计算时间。但是,我不能总是同时实现它们。事实上,我的大多数内联函数都无法自动矢量化。这是一个有效的简单测试代码:
inline void add1(double *v, int Length) {
for(int i=0; i < Length; i++) v[i] += 1;
}
void call_add1(double v[], int L) {
add1(v, L);
}
int main(){return 0;}
在 Mac OS X 10.12.3 上,编译它:
clang++ -O3 -Rpass=loop-vectorize -Rpass-analysis=loop-vectorize -std=c++11 -ffast-math test.cpp
test.cpp:2:5: remark: vectorized loop (vectorization width: 2, interleaved count: 2) [-Rpass=loop-vectorize]
for(int i=0; i < Length; i++) v[i] += 1;
^
但是,非常相似的东西(仅在 call_add1 中移动参数)不起作用:
inline void add1(double *v, int Length) {
for(int i=0; i < Length; i++) v[i] += 1;
}
void call_add1() {
double v[20]={0,1,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9};
int L=20;
add1(v, L);
}
int main(){ return 0;}
使用相同的命令编译不会产生任何输出。为什么会这样?如何确保内联函数中的循环始终自动矢量化?我想矢量化许多函数循环,所以我希望修复不会太复杂。