Проблемы с gcc 7 и 8 (debian) при разгрузке OpenMP в nvptx

Я установил оба gcc-7, gcc-8, gcc-7-offload-nvptx а также gcc-8-offload-nvptx

Я попытался с обоими компилировать простой код OpenMP с разгрузкой:

#include <omp.h>
#include <stdio.h>

int main(){
    #pragma omp target
    #pragma omp teams distribute parallel for
    for (int i=0; i<omp_get_num_threads(); i++)
        printf("%d in %d of %d\n",i,omp_get_thread_num(), omp_get_num_threads());
}

Со следующей строкой (с gcc-7 тоже):

gcc-8 code.c -fopenmp -foffload=nvptx-none

Но он не компилируется, выдавая следующую ошибку:

/tmp/ccKESWcF.o: In function "main":
teste.c:(.text+0x50): undefined reference to "GOMP_target_ext"
/tmp/cc0iOH1Y.target.o: In function "init":
ccPXyu6Y.c:(.text+0x1d): undefined reference to "GOMP_offload_register_ver"
/tmp/cc0iOH1Y.target.o: In function "fini":
ccPXyu6Y.c:(.text+0x41): undefined reference to "GOMP_offload_unregister_ver"
collect2: error: ld returned 1 exit status

какие-то подсказки?

1 ответ

Вы код компилируется и запускается для меня, используя -foffload=disable -fno-stack-protector с gcc7 а также gcc-7-offload-nvptx и Ubuntu 17.10.

Но на ГПУ (без -foffload=disable) он не компилируется. Ты не можешь позвонить printf из ГПУ. Вместо этого вы можете сделать это:

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>

int main(){
  int nthreads;
  #pragma omp target teams map(tofrom:nthreads)
  #pragma omp parallel
  #pragma omp single
  nthreads = omp_get_num_threads();

  int *ithreads = malloc(sizeof *ithreads *nthreads);

  #pragma omp target teams distribute parallel for map(tofrom:ithreads[0:nthreads])
  for (int i=0; i<nthreads; i++) ithreads[i] = omp_get_thread_num();

  for (int i=0; i<nthreads; i++)
    printf("%d in %d of %d\n", i, ithreads[i], nthreads);

  free(ithreads);  
}

Для меня это выводы

0 in 0 of 8
1 in 0 of 8
2 in 0 of 8
3 in 0 of 8
4 in 0 of 8
5 in 0 of 8
6 in 0 of 8
7 in 0 of 8
Другие вопросы по тегам