如何同时使用omp parallel和omp simd?

时间:2018-02-09 17:43:05

标签: c parallel-processing x86 openmp simd

我想测试#pragma omp parallel for#pragma omp simd以获得简单的矩阵添加程序。当我单独使用它们时,我没有错误,看起来很好。但是,我想测试使用它们可以获得多少性能。如果我在外循环之前使用#pragma omp parallel for而在内循环之前使用#pragma omp simd我也没有错误。当我在外部循环之前使用它们时发生错误。我在运行时遇到错误而不是编译时间。 ICCGCC返回错误,但Clang没有。这可能是因为Clang重新定位了并行化。在我的实验中,Clang没有并行化并只用一个线程运行程序。

该计划在这里:

#include <stdio.h>
//#include <x86intrin.h>
#define N 512
#define M N

int __attribute__(( aligned(32))) a[N][M],
    __attribute__(( aligned(32))) b[N][M],
    __attribute__(( aligned(32))) c_result[N][M];

int main()
{
    int i, j;
    #pragma omp parallel for
    #pragma omp simd
    for( i=0;i<N;i++){
        for(j=0;j<M;j++){
            c_result[i][j]= a[i][j] + b[i][j];
        }
    }

    return 0;
}

错误: ICC:

  

IMP1.c(20):错误:omp指令后面没有可并行化的   for循环#pragma omp parallel for ^

     

IMP1.c的编译中止(代码2)

GCC

  

IMP1.c:在函数'main'中:

     

IMP1.c:21:10:错误:声明   预期在'#pragma'#pragma omp simd

之前

因为在我的其他测试pragma omp simd中,外环获得了更好的性能,我需要把它放在那里(不是吗?)。

平台:英特尔酷睿i7 6700 HQ,Fedora 27

经过测试的编译器:ICC 18,GCC 7.2,Clang 5

编译器命令行:

icc -O3 -qopenmp -xHOST -no-vec

gcc -O3 -fopenmp -march=native -fno-tree-vectorize -fno-tree-slp-vectorize

clang -O3 -fopenmp=libgomp -march=native -fno-vectorize -fno-slp-vectorize

1 个答案:

答案 0 :(得分:5)

来自OpenMP 4.5规范:

  

2.11.4并行循环SIMD构造

     

并行循环SIMD构造是指定并行的快捷方式   构造包含一个循环SIMD构造而没有其他语句。

     

并行循环SIMD结构的语法如下:

     

#pragma omp parallel for simd   ...

你也可以写:

#pragma omp parallel
{
   #pragma omp for simd
   for ...
}