Отсутствует символ: 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символ, следовательно, неопределенный символ.

Я все еще был бы признателен за помощь в том, как обойти эту проблему, кроме как путем обновления драйвера.

Другие вопросы по тегам