【问题标题】:Missing symbol: cuDevicePrimaryCtxRelease vs cuDevicePrimaryCtxRelease_v2缺少符号:cuDevicePrimaryCtxRelease 与 cuDevicePrimaryCtxRelease_v2
【发布时间】:2021-05-08 03:50:00
【问题描述】:

我正在尝试构建以下程序:

#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

为什么会发生这种情况,我该如何解决?

注意:我正在使用驱动程序版本 440.82 的 Devuan Beowulf(尚未为 CUDA 11.2 安装新驱动程序)。

【问题讨论】:

  • 发布失败的确切 CMake 输出
  • @talonmies:查看我的编辑和部分答案。

标签: linux cuda linker-errors cuda-context cuda-driver


【解决方案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)。

所以可能是安装的驱动只包含非_v2符号,因此是未定义的符号。

我仍然希望得到帮助的是如何解决这个问题,而不是通过更新驱动程序。

【讨论】:

  • 链接到 CUDA 11.2(在该机器/设置上)提供的 libcuda 存根,而不是 440.xx 驱动程序提供的实际 libcuda
  • @RobertCrovella: 1. 你的意思是lib64/stubs/libcuda.so? 2. 有没有办法让 CMake 更喜欢该存根而不是系统驱动程序? 3. 这样做会有性能损失吗?
  • 1.是的。 2.不知道。 3. 不可以。另请注意,针对 CUDA 11.2 构建的此类二进制文件不会在您的具有 440.xx 驱动程序的机器上运行。
  • @RobertCrovella:哦 :-(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 2017-04-15
  • 2019-12-16
  • 1970-01-01
相关资源
最近更新 更多