2016-07-06 394 views
-3

我有一些CUDA代码我编译成。一个图书馆,以及一些(CUDA相关)常规的C++代码,它使用它的应用程序。一切正在进行中间链接。现在错误与CUDA代码链接:`的多重定义__cudaRegisterLinkedBinary_

,一台机器上(与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。
+1

您可以使用'C++ filt'这样的工具来取消名称的缩小。 –

+0

@JesperJuhl:这个标识符并不是神秘的,因为它们是混杂的。 – einpoklum

回答

2
  • 在什么情况下有可能会发生这种不一致的行为?

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

  • 可这有可能成为“第二个链接”,为库和二进制的结果呢?

几乎毫无疑问。

  • 我能做些什么,以确定到底什么是真正的冲突(例如要寻找什么符号为)?

的冲突是其在设备链路阶段所产生的运行时和其被用于设备的代码加载到运行时API的上下文样板的多个定义。

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

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

+0

你所说的很好地缩小了搜索空间以获得一个MCVE,我将尽快尝试。 – einpoklum

+0

几乎我所做的每一件事都让我置身于“未定义的..fatbin参考”领域。最后,我刚刚关闭了CUDA的CMake单独编译选项,奇怪的是,它现在都以某种方式工作了(尽管我不清楚到底是谁在做设备链接。无论如何,因为这有效地解决了我的问题,所以我接受。 – einpoklum