cuDevicePrimaryCtxRetain возвращает CUDA_ERROR_INVALID_DEVICE после acc_init
Я пробовал новую версию сообщества PGI (17.4) на игрушечном примере (см. Ниже), и я получаю сообщение об ошибке внутри API драйвера CUDA при вызове acc_init
,
Код для воспроизведения ошибки:
#include <openacc.h>
#include <cuda_runtime_api.h>
#include <stdio.h>
int main()
{
acc_init( acc_device_nvidia );
int ndev = acc_get_num_devices( acc_device_nvidia );
printf("Num OpenACC devices: %d\n", ndev);
cudaGetDeviceCount(&ndev);
printf("Num CUDA devices: %d\n", ndev);
return 0;
}
Составлено с:/usr/local/pgi/linux86-64/17.4/bin/pgcc -acc -ta=tesla -Mcuda ./test.c -o oacc_test.pgi
вывод CUDA Memcheck:
$ cuda-memcheck ./oacc_test.pgi
========= CUDA-MEMCHECK
========= Program hit CUDA_ERROR_INVALID_DEVICE (error 101) due to "invalid device ordinal" on CUDA API call to cuDevicePrimaryCtxRetain.
========= Saved host backtrace up to driver entry point at error
========= Host Frame:/usr/lib/x86_64-linux-gnu/libcuda.so (cuDevicePrimaryCtxRetain + 0x15c) [0x1e8d1c]
========= Host Frame:/usr/local/pgi/linux86-64/17.4/lib/libaccnc.so (__pgi_uacc_cuda_initdev + 0x80b) [0x6f0b]
========= Host Frame:/usr/local/pgi/linux86-64/17.4/lib/libaccg.so (__pgi_uacc_enumerate + 0x148) [0x11388]
========= Host Frame:/usr/local/pgi/linux86-64/17.4/lib/libaccg.so (__pgi_uacc_initialize + 0x5b) [0x117ab]
========= Host Frame:/usr/local/pgi/linux86-64/17.4/lib/libaccapi.so (acc_init + 0x22) [0xe4f2]
========= Host Frame:./oacc_test.pgi [0xbc4]
========= Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main + 0xf1) [0x202b1]
========= Host Frame:./oacc_test.pgi [0xaca]
=========
Num OpenACC devices: 1
Num CUDA devices: 1
========= ERROR SUMMARY: 1 error
По-видимому __pgi_uacc_cuda_initdev
передает '-1' в качестве второго параметра (CUdevice dev) cuDevicePrimaryCtxRetain
(Ошибка?):
Breakpoint 1, 0x00007ffff4ab0bc0 in cuDevicePrimaryCtxRetain () from /usr/lib/x86_64-linux-gnu/libcuda.so
(cuda-gdb) p /x $rsi
$7 = 0xffffffff
Я полагаю, это не нормально. Это ошибка 17.4 или моя установка не работает?
1 ответ
Это нормально и доброкачественная ошибка. По сути, происходит то, что среда выполнения PGI запрашивает, создан ли уже контекст CUDA. Но так как нет вызова CUDA во время выполнения для простого запроса на существование контекста, мы вызываем "cuDevicePrimaryCtxRetain". Если это ошибка, то мы знаем, что нам нужно создать новый контекст.
Обратите внимание, что в выпуске PGI 17.7 мы немного изменили этот вызов, поэтому вы больше не увидите ошибку при запуске cuda-memcheck.