我写了一个非常简单的代码,用于添加剂量。源代码是
#include <iostream>
#include <vector>
#include <ctime>
using namespace std;
int main(int argc, const char * argv[]) {
long int n=10000;
vector<double> a(n,0.0),b(n,0.0),c(n,0.0);
for (int i=0; i<n; i++){
a[i]=i;
b[i]=2*i;
}
for (int i=0; i<n; i++){
c[i]=a[i]+b[i];
}
return 0;
}
此代码中有两个循环。第一个循环(第21-24行)将值赋给向量a
和b
。第二个循环(第26-28行)执行向量加法。在两个循环中,迭代彼此独立。根据我的理解,这两个循环应该很容易由编译器自动矢量化。
但是,我用带有标志-opt-report
icpc -opt-report main.cpp
我收到了一份优化报告main.optrpt
。但是,在本报告中,它表明两个循环都没有矢量化。报告中的详细信息是
LOOP BEGIN at main.cpp(21,3)
remark #15344: loop was not vectorized: vector dependence prevents vectorization. First dependence is shown below. Use level 5 report for details
remark #15346: vector dependence: assumed ANTI dependence between line 22 and line 23
remark #25438: unrolled without remainder by 2
LOOP END
LOOP BEGIN at main.cpp(26,3)
remark #15344: loop was not vectorized: vector dependence prevents vectorization. First dependence is shown below. Use level 5 report for details
remark #15346: vector dependence: assumed FLOW dependence between line 27 and line 27
remark #25438: unrolled without remainder by 2
LOOP END
有谁知道为什么这两个循环没有被编译器矢量化?