首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >openmp simd失败

openmp simd失败
EN

Stack Overflow用户
提问于 2015-05-17 00:39:02
回答 1查看 526关注 0票数 1

我写了一个简单的测试代码来使用openmp 4.0中的SIMD,但没有得到加速。

代码语言:javascript
复制
#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;
}

在我的SNB上,使用和不使用“#杂注omp声明simd”和“#杂注omp simd”的时间都是2900+。

更重要的是,警告"...\opm2.c(7,30):警告#13401:矢量函数被仿真“出现了……我真的想知道为什么。

同样的问题也出现在下面的代码中(启用c99):

代码语言:javascript
复制
#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“运行良好。我使用的是英特尔c/c++ 2015。

如果你能找到原因,真的谢谢你,ありがとう,多谢啦。

EN

回答 1

Stack Overflow用户

发布于 2015-06-19 01:06:06

虽然我不知道当我使用-O1/O2/O3时,在gcc 4.9上的why...but ...“#杂注omp simd”运行良好,但当我使用-O0时,它不起作用。注:如果你想使用avx而不是上交所,不要忘记"-mavx“。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30278204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档