3

我正在使用 CUDA 5.0 开发 Visual Studio 2008。我使用 CUDA Runtime API 作为构建规则。
我正在尝试编译一个包含 main 函数和一个全局内核的 test.cu 文件。主函数和内核都包含我使用相同的 CUDA 环境编译的外部库函数调用,启用了可重定位设备代码标志,NVCC 编译类型为 -c。test.cu 编译良好,但在链接过程中输出以下错误:

1>Linking...
1>test.cu.obj : error LNK2019: unresolved external symbol ___cudaRegisterLinkedBinary_43_tmpxft_00001888_00000000_8_test_cpp1_ii_98e63e3a referenced in function "void __cdecl __sti____cudaRegisterAll_43_tmpxft_00001888_00000000_8_test_cpp1_ii_98e63e3a(void)" (?__sti____cudaRegisterAll_43_tmpxft_00001888_00000000_8_test_cpp1_ii_98e63e3a@@YAXXZ)

我搜索了__cudaRegisterLinkedBinary,发现它是在CUDA v5.0的crt/host_rintime.h中定义的,但是在v4.2中并没有这样的东西。

crt/host_runtime.h:#define __REGISTERFUNCNAME_CORE(X) __cudaRegisterLinkedBinary##X 
crt/host_runtime.h:#define ____cudaRegisterLinkedBinary(X)

所以我怀疑它可能与 v5.0 添加的单独编译功能有关,对吗?

谁能帮我解决错误?如果是单独编译 .cu 文件导致的问题,那么是否意味着我必须将所有内核放在一个 .cu 文件中才能解决?

4

2 回答 2

2

这个问题已经在以下两个线程中遇到过:

关于函数_ _cudaRegisterAll中引用的cudaRegisterLinkedBinary的问题

device-link.obj / cudaRegisterLinkedBinary 错误

于 2013-09-13T08:14:24.943 回答
1

我遇到了同样的错误。看来我的问题与单独编译有关。(我是 CUDA 的新手,所以如果有人可以确认或提供更好的解释,我将不胜感激。)

首先,我对 Visual Studio 的修复是转到属性 -> CUDA C/C++ -> 通用并将“是”切换为“生成可重定位设备代码”。根据https://forums.developer.nvidia.com/t/how-to-separately-compile-a-kernel-in-visual-studio/80385,您还需要确保“ NVCC 编译类型”是“生成混合目标文件”。

根据 NVCC 文档,与第一个修复相关的问题是 NVCC 将可重定位设备代码嵌入到主机对象中,并调用 nvlink 链接设备 cade,然后将其与主机对象链接以形成最终程序。第二个修复的问题是从“.cu”文件隐式生成了 CUDA 主机代码。此主机代码需要传递给主机链接器。

文档链接是:https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#nvcc-options-for-separate-compilationhttps://docs.nvidia.com/cuda /cuda-compiler-driver-nvcc/index.html#implicit-cuda-host-code

于 2020-08-15T22:56:25.377 回答