новая линия
нтересован в разгрузке работы на GPU с помощью OpenMP.
Код ниже дает правильное значениеsum
на процессоре
//g++ -O3 -Wall foo.cpp -fopenmp
#pragma omp parallel for reduction(+:sum)
for(int i = 0 ; i < 2000000000; i++) sum += i%11;
Это также работает на GPU с OpenACC, как это
//g++ -O3 -Wall foo.cpp -fopenacc
#pragma acc parallel loop reduction(+:sum)
for(int i = 0 ; i < 2000000000; i++) sum += i%11;
nvprof
показывает, что он работает на GPU, а также быстрее, чем OpenMP на CPU.
Однако, когда я пытаюсь разгрузить GPU с OpenMP, как это
//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, но намного медленнее, чем OpenMP на CPU.
Почему сокращение не удается с OpenMP на GPU?
Вот полный код, который я использовал, чтобы проверить это
#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