Выгрузка OpenMP с G CC завершается неудачно с сообщением «Сборка Ptx прервана из-за ошибок» - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь скомпилировать следующую простую программу разгрузки GPU OpenMP с G ++ 9.3.0

#include <iostream>

int main(){
  const int N=1000;
  int d[N];

  for(auto i=0;i<N;i++)
    d[i] = 1;

  #pragma omp target teams distribute parallel for map(tofrom:d[0:N])
  for(size_t i=0;i<N;i++){
    d[i] *= 3*i+1;
  }

  for(int i=0;i<N;i++)
    std::cout<<d[i]<<" ";
  std::cout<<std::endl;
}

Используя команду:

g++ -fopenmp -O3 gpu_test.cpp

Но это не удается:

ptxas /tmp/ccq6t6e2.o, line 189; error   : Illegal operand type to instruction 'ld'
ptxas /tmp/ccq6t6e2.o, line 246; error   : Illegal operand type to instruction 'ld'
ptxas /tmp/ccq6t6e2.o, line 189; error   : Unknown symbol '__stack_chk_guard'
ptxas /tmp/ccq6t6e2.o, line 246; error   : Unknown symbol '__stack_chk_guard'
ptxas fatal   : Ptx assembly aborted due to errors
nvptx-as: ptxas returned 255 exit status
mkoffload: fatal error: x86_64-linux-gnu-accel-nvptx-none-gcc-9 returned 1 exit status
compilation terminated.
lto-wrapper: fatal error: /usr/lib/gcc/x86_64-linux-gnu/9//accel/nvptx-none/mkoffload returned 1 exit status
compilation terminated.
/usr/bin/ld: error: lto-wrapper failed
collect2: error: ld returned 1 exit status

Как это исправить?

1 Ответ

0 голосов
/ 12 июля 2020

Компиляция с помощью следующей команды решит эту проблему:

g++ -fopenmp -fno-stack-protector -O3 gpu_test.cpp

Если вы выполняете разгрузку на Nvidia, вы можете проверить, была ли разгрузка успешной, запустив вашу программу следующим образом:

nvprof ./a.out

Это должно вернуть, например,

==61495== NVPROF is profiling process 61495, command: ./a.out
...
...
Program output
...
...
==61495== Profiling application: ./a.out
==61495== Profiling result:
            Type  Time(%)      Time     Calls       Avg       Min       Max  Name
 GPU activities:   98.52%  173.09us         1  173.09us  173.09us  173.09us  main$_omp_fn$0
                    0.84%  1.4720us         1  1.4720us  1.4720us  1.4720us  [CUDA memcpy DtoH]
                    0.64%  1.1200us         1  1.1200us  1.1200us  1.1200us  [CUDA memcpy HtoD]

Копирование на хост и с хоста вместе с вызовом функции в main указывает, что разгрузка была успешной.

...