与 CUDA 代码链接时出错:__cudaRegisterLinkedBinary_的多个定义

Error linking with CUDA code: multiple definitions of `__cudaRegisterLinkedBinary_

本文关键字:cudaRegisterLinkedBinary 定义 代码 CUDA 链接 出错      更新时间:2023-10-16

我有一些 CUDA 代码正在编译成一个 .a 库,还有一些(与 CUDA 相关的)常规C++代码用于使用它的应用程序。一切都在进行中间链接。

现在,在一台机器(使用 CUDA 8.0 RC)上构建成功,但在另一台机器上(使用麦克斯韦而不是开普勒卡,以防万一),我得到:

/tmp/tmpxft_00001796_00000000-2_ktkernels_intermediate_link.reg.c:25: multiple definition of `__cudaRegisterLinkedBinary_66_tmpxft_00007a5f_00000000_16_cuda_device_runtime_compute_52_cpp1_ii_8b1a5d37'
CMakeFiles/tester.dir/tester_intermediate_link.o:/tmp/tmpxft_0000180b_00000000-2_tester_intermediate_link.reg.c:4: first defined here
collect2: error: ld returned 1 exit status
CMakeFiles/tester.dir/build.make:1766: recipe for target 'bin/tester' failed
make[2]: *** [bin/tester] Error 1

我实际上开始从编译到调用库代码的二进制文件中删除文件 - 只有当我删除所有这些文件时,链接才会成功。

我的问题:

  • 在什么情况下可能发生这种不一致的行为?
  • 这可能是库和二进制文件"第二次链接"的结果吗?
  • 我该怎么做才能准确确定实际冲突的内容(例如,要查找哪些符号)?
  • 如果实际上没有任何冲突,我应该怎么做才能避免这种情况?

笔记:

  • 在一台机器上,我使用的是 CUDA 7.5,在另一台机器上是 CUDA 8.0 RC。
  • 在什么情况下可能发生这种不一致的行为?

如果在单个应用程序中尝试多个设备链接。

  • 这可能是库和二进制文件的"第二次链接"的结果吗?

几乎毫无疑问。

  • 我该怎么做才能准确确定实际冲突的内容(例如,要查找哪些符号)?

冲突是运行时在设备链接阶段生成的样板的多个定义,用于通过运行时 API 将设备代码加载到上下文中。

  • 如果实际上没有任何冲突,我应该怎么做才能避免这种情况?

冲突是真实存在的。避免涉及正确链接单独编译的设备代码。除此之外,我无法确切地告诉您如何解决它,因为您选择不确切告诉我们您在做什么。

相关文章:
  • 没有找到相关文章