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

Mar*_*tin 8 c parallel-processing x86 simd openmp

我想测试#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;
}
Run Code Online (Sandbox Code Playgroud)

错误: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

Dan*_*ica 6

从OpenMP 4.5规范:

2.11.4并行循环SIMD构造

并行循环SIMD构造是用于指定包含一个循环SIMD构造而不包含其他语句的并行构造的快捷方式.

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

#pragma omp parallel for simd ...

你也可以写:

#pragma omp parallel
{
   #pragma omp for simd
   for ...
}
Run Code Online (Sandbox Code Playgroud)