новая линия

нтересован в разгрузке работы на 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

Ответы на вопрос(1)

Ваш ответ на вопрос