Mar*_*tin 8 c parallel-processing x86 simd openmp
我想测试#pragma omp parallel for和#pragma omp simd一个简单的矩阵追加程序.当我单独使用它们时,我没有错误,看起来很好.但是,我想测试使用它们可以获得多少性能.如果我#pragma omp parallel for在外循环#pragma omp simd之前和内循环之前使用,我也没有错误.当我在外部循环之前使用它们时发生错误.我在运行时遇到错误而不是编译时间.ICC并GCC返回错误,但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
从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)