我希望通过OpenMP将工作转移到GPU上。
以下代码在CPU上可以正确计算sum
的值。
//g++ -O3 -Wall foo.cpp -fopenmp
#pragma omp parallel for reduction(+:sum)
for(int i = 0 ; i < 2000000000; i++) sum += i%11;
使用OpenACC,它也可以在GPU上运行,代码如下:
//g++ -O3 -Wall foo.cpp -fopenacc
#pragma acc parallel loop reduction(+:sum)
for(int i = 0 ; i < 2000000000; i++) sum += i%11;
nvprof
显示它在 GPU 上运行,并且比 CPU 上的 OpenMP 更快。
然而,当我尝试使用 OpenMP 将工作转移到 GPU 上时,像这样:
//g++ -O3 -Wall foo.cpp -fopenmp -fno-stack-protector
#pragma omp target teams distribute parallel for reduction(+:sum)
for(int i = 0 ; i < 2000000000; i++) sum += i%11;
对于sum
,它返回的结果是错误的(仅返回零)。nvprof
显示该代码在GPU上运行,但比CPU上的OpenMP慢得多。
为什么OpenMP在GPU上的reduction操作会失败?
以下是我用来测试的完整代码:
#include <stdio.h>
//g++ -O3 -Wall acc2.cpp -fopenmp -fno-stack-protector
//sudo nvprof ./a.out
int main (void) {
int sum = 0;
//#pragma omp parallel for reduction(+:sum)
//#pragma acc parallel loop reduction(+:sum)
#pragma omp target teams distribute parallel for reduction(+:sum)
for(int i = 0 ; i < 2000000000; i++) {
sum += i%11;
}
printf("sum = %d\n",sum);
return 0;
}
使用GCC 7.2.0、Ubuntu 17.10以及gcc-offload-nvptx。
sudo
运行nvprof
? - cavalcantelucas