考虑以下 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();
}
这个程序做的不多——但它是一个有效的程序(如果你的计算能力足够高,可以支持整个网格作为一个合作组)。它应该编译链接并运行。但是,我明白了:
$ nvcc -o foo -gencode arch=compute_61,code=sm_61 foo.cu
ptxas fatal : Unresolved extern function 'cudaCGGetIntrinsicHandle'
奇怪!如果我添加一些特定-l
的-L
标志并没有帮助,例如:
$ nvcc -o foo -gencode arch=compute_61,code=sm_61 foo.cu -L"/usr/lib/x86_64-linux-gnu/" \
-L"/usr/lib/x86_64-linux-gnu/stubs" -lcudadevrt -lcudart_static -lrt -lpthread -ldl
ptxas fatal : Unresolved extern function 'cudaCGGetIntrinsicHandle'
为什么会这样?我应该如何修改 nvcc 命令行以使其找到未解析的符号?
笔记:
- 我正在使用 Devuan GNU/Linux 3.0。
- CUDA 10.1 作为分发包安装,因此其库位于
/usr/lib/x86_64-linux-gnu
. - 带有 GeForce 1050 Ti 卡的 x86_64 机器。