Проблемы с 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