我写了一个简单的测试代码,在openmp 4.0中使用SIMD,但没有加速。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 40000000
#pragma omp declare simd
double am(double a, double b){
return a*b+a*b+a*b+a*b+a*b;
}
int main(){
int i,j,s;
double * a=(double *)malloc(sizeof(double)*N);
double * b=(double *)malloc(sizeof(double)*N);
double * c=(double *)malloc(sizeof(double)*N);
for(i=1;i<N;i++){
a[i]=0.56;
b[i]=0.66;
}
clock_t t1=clock();
#pragma omp simd
for(i=0;i<N;i++){
c[i] = am(a[i], b[i]);
}
clock_t t2=clock();
printf("%d\n",(t2-t1));
scanf("%d",&s);
free(a);
free(b);
free(c);
return 0;
}
时间有无“#pragma omp declare simd”&amp; “#pragma omp simd”在我的SNB上都是2900+。
更重要的是,警告“...... \ opm2.c(7,30):警告#13401:矢量函数被模拟”已经确定......我真的想知道原因。
同样的问题也在后面的代码(启用c99)中得到了证实:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
int n=40000000;
int i,j,s;
double *a,*b,*c;
a=(double *)malloc(sizeof(double)*n);
b=(double *)malloc(sizeof(double)*n);
c=(double *)malloc(sizeof(double)*n);
for(i=1;i<n;i++){
a[i]=0.56;
b[i]=0.66;
}
clock_t t1=clock();
#pragma omp simd
for(i=0;i<n;i++){
c[i]=a[i]*b[i]+a[i]*b[i]+a[i]*b[i]-a[i]*b[i]+a[i]*b[i]+a[i]*b[i];
}
clock_t t2=clock();
printf("%d\n",(t2-t1));
scanf("%d",&s);
free(a);
free(b);
free(c);
return 0;
}
我真的启用了openmp而且“#pragma omp padallel for”运行良好。我使用的是intel c / c ++ 2015。
如果你能找到原因,真的非常感谢,ありがとう,多谢啦。
答案 0 :(得分:0)
虽然我不知道为什么......但是在gcc 4.9上我使用-O1 / O2 / O3时...“#pragma omp simd”运行良好,当我使用-O0时,它不会工作。 Ps:如果你想使用avx而不是sse,请不要忘记“-mavx”。