我有兴趣使用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;
Run Code Online (Sandbox Code Playgroud)
它也适用于像OpenACC这样的GPU
//g++ -O3 -Wall foo.cpp -fopenacc
#pragma acc parallel loop reduction(+:sum)
for(int i = 0 ; i < 2000000000; i++) sum += i%11;
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
它得到了错误的结果 …