【发布时间】:2020-08-12 00:01:09
【问题描述】:
考虑以下 CUDA 程序,在一个名为 foo.cu 的文件中:
#include <cooperative_groups.h>
#include <stdio.h>
__global__ void my_kernel() {
auto g = cooperative_groups::this_grid();
g.sync();
}
int main(int, char **) {
cudaLaunchCooperativeKernel( (const void*) my_kernel, 2, 2, nullptr, 0, nullptr);
cudaDeviceSynchronize();
}
这个程序需要用-rdc=true编译(见this question);并且需要与libcudadevrt 明确链接。好的,没问题……是吗?
$ nvcc -rdc=true -o foo -gencode arch=compute_61,code=sm_61 foo.cu -lcudadevrt
nvlink error : Undefined reference to 'cudaCGGetIntrinsicHandle' in '/tmp/tmpxft_000036ec_00000000-10_foo.o'
nvlink error : Undefined reference to 'cudaCGSynchronizeGrid' in '/tmp/tmpxft_000036ec_00000000-10_foo.o'
只有当我使用-L/usr/lib/x86_64-linux-gnu 明确添加库的文件夹时,它才愿意构建我的程序。
这很奇怪,因为我系统上的所有 CUDA 库都在那个文件夹中。为什么 NVCC/nvlink 没有进去看?
注意事项:
- 我正在使用 Devuan GNU/Linux 3.0。
- CUDA 10.1 作为分发包安装。
- 带有 GeForce 1050 Ti 卡的 x86_64 机器。
【问题讨论】:
-
Devuan 不是 CUDA 开发支持的发行版。在 Ubuntu(例如)上,使用 packages for installation directly from NVIDIA,我无需添加此处指示的
-L开关即可使其正常工作。 -
@RobertCrovella:仍然 - nvlink 搜索的路径是什么?有没有我可以设置的环境变量?
-
即使我能回答这样的问题,我认为这样做也是不明智的。它可以与其他未来的读者交流,这可能是安全或明智的做法。我不认为它是。我的建议是切换到受支持的开发环境。
-
@RobertCrovella:我现在在 Ubuntu Bionic 上see this link failure,是受支持的发行版。
-
我刚刚在 Ubuntu 20.04 上尝试了 CUDA 11.2。使用您指定的命令,您在这个问题中的代码可以干净地编译。然后我尝试了this container。它也可以干净地编译。所以我无法重现那个观察结果。我无法根据该 travis 输出进行调试。这显然是某种环境问题。如果您可以从干净的操作系统安装中开发出一套简洁的说明来显示问题,也许可以提交一个错误
标签: cuda linker-errors