我想测试#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;
}
错误: 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
答案 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 ...
}