Отсутствует символ: cuDevicePrimaryCtxRelease vs cuDevicePrimaryCtxRelease_v2
Я пытаюсь создать следующую программу:
#include <iostream>
#include <cuda.h>
int main() {
const char* str;
auto status = cuInit(0);
cuGetErrorString(status, &str);
std::cout << "status = " << str << std::endl;
int device_id = 0;
CUcontext primary_context_id;
status = cuDevicePrimaryCtxRetain(&primary_context_id, device_id);
cuGetErrorString(status, &str);
std::cout << "status = " << str << std::endl;
status = cuDevicePrimaryCtxRelease(device_id);
cuGetErrorString(status, &str);
std::cout << "status = " << str << std::endl;
}
Компиляция всегда проходит нормально; но с CUDA 10.2 связывание работает, а с CUDA 11.2 я получаю:
/usr/bin/ld: a.o: in function `main':
a.cpp:(.text+0xcc): undefined reference to `cuDevicePrimaryCtxRelease_v2'
collect2: error: ld returned 1 exit status
Почему это происходит и как я могу это исправить?
Примечание. Я использую Devuan Beowulf с версией драйвера 440.82 (не устанавливал новый драйвер для CUDA 11.2).
1 ответ
Ну, я думаю, у меня есть идея, почему это происходит.
Это о том, как
cuDevicePrimaryCtxRelease()
определено. Давайте работать:
grep PrimaryCtxRelease /usr/local/cuda/include/cuda.h | grep -v "^ "
В CUDA 10.2 мы получаем:
CUresult CUDAAPI cuDevicePrimaryCtxRelease(CUdevice dev);
а в CUDA 11.2 получаем:
#define cuDevicePrimaryCtxRelease cuDevicePrimaryCtxRelease_v2
CUresult CUDAAPI cuDevicePrimaryCtxRelease(CUdevice dev);
То есть имя API изменилось, но заголовочный файл оставляет псевдоним для нового имени. (И я бы сказал, что это запутанный фрагмент кода.)
Теперь давайте посмотрим на объектные файлы, которые я получаю в двух разных версиях CUDA, используя
objdump -t | c++filt | grep cu
. С CUDA 10.2 это:
0000000000000000 *UND* 0000000000000000 cuInit
0000000000000000 *UND* 0000000000000000 cuGetErrorString
0000000000000000 *UND* 0000000000000000 cuDevicePrimaryCtxRetain
0000000000000000 *UND* 0000000000000000 cuDevicePrimaryCtxRelease
а с CUDA 11.2 это:
0000000000000000 *UND* 0000000000000000 cuInit
0000000000000000 *UND* 0000000000000000 cuGetErrorString
0000000000000000 *UND* 0000000000000000 cuDevicePrimaryCtxRetain
0000000000000000 *UND* 0000000000000000 cuDevicePrimaryCtxRelease_v2
(Обратите внимание ).
так что, вероятно, дело в том, что установленный драйвер содержит только не-
_v2
символ, следовательно, неопределенный символ.
Я все еще был бы признателен за помощь в том, как обойти эту проблему, кроме как путем обновления драйвера.