c - openmp simd 失败

标签 c openmp vectorization simd

我写了一个简单的测试代码来在 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;
}

在我的 SNB 上有和没有“#pragma omp declare simd”和“#pragma omp simd”的时间都是 2900+。

此外,警告“...\opm2.c(7,30): warning #13401: vector function was emulated”是准确的....我真的很想知道为什么。

同样的问题也出现在后面的代码中(启用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。

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

最佳答案

虽然我不知道为什么……但是在 gcc 4.9 上,当我使用 -O1/O2/O3 时……“#pragma omp simd”运行良好,而当我使用 -O0 时,它却不行工作。 ps:如果你想使用avx而不是sse,不要忘记“-mavx”。

关于c - openmp simd 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30278204/

相关文章:

c++ - 为什么 uint8_t 在分配给取消引用的 uint32_t 指针时用完 4 个字节?

c - 就 cpu 而言,coSTLy 如何成为低争用互斥体

c++ - CMake错误: Could NOT find OpenMP_C (missing: OpenMP_C_FLAGS) using clang on Mac OS

c++ - 在 C++ 中使用 OpenMP 并行化算法

python - Numpy:将行值广播到 channel

c - 为什么不能将 c 指针视为数组?

c - 尝试做一些 C 编程作业并需要一些指导

c++ - openmp 程序卡在 block 的末尾

r - 向量化简单格式化函数以处理带有 NA 的向量

python - 如何矢量化这个 python 代码?