我想测试一个简单的矩阵加法程序,使用
#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): error: omp指令后面没有可并行化的for循环 #pragma omp parallel for ^
IMP1.c编译失败 (code 2)
GCC:
IMP1.c: 在函数‘main’中:
IMP1.c:21:10: error: 缺少for循环 #pragma omp simd
因为在我的其他测试中,对于外循环而言,pragma omp simd
可以获得更好的性能,所以我需要将其放在那里(不是吗?)。
平台:Intel Core 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
#pragma omp parallel for simd
吗? - Daniel Langr#define M N
这段代码实际上是您的代码中的一部分,还是在这里提问时打错了? - Christian Gibbons