我对使用 OpenMP 将工作卸载到 GPU 很感兴趣。
下面的代码给出了sum
CPU 上的正确值
//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 慢得多。
为什么在 GPU 上使用 OpenMP 进行缩减会失败?
这是我用来测试的完整代码
#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