2016-07-06 27 views
-3

私はいくつかのCUDAコードを持っています。私は.aライブラリとそれを使用するアプリケーション用の(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 

私は実際にライブラリコードを呼び出すバイナリにコンパイルされたファイルからファイルを削除し始めました。そして、それらのファイルをすべて削除するとリンクが成功します。

私の質問:どのような状況下では

  • は、そのような一貫性のない動作が発生することは可能でしょうか?
  • これは、ライブラリとバイナリ両方の "2番目のリンク"の結果かもしれませんか?
  • 実際に何が衝突しているかを正確に判断するにはどうすればよいですか(たとえば、どのようなシンボルを探すか)
  • 実際に何も衝突していない場合は、これを避けるために何をすべきですか?

注:私は他のマシン上で、CUDA 7.5使用してい

  • マシン1上では、CUDA 8.0 RCです。
+1

'C++ filt'のようなツールを使用して名前をデマングルすることができます。 –

+0

@ JesperJuhl:その識別子はmanglingのために謎めいたものではありません。 – einpoklum

答えて

2
  • どのような状況下では、このような一貫性のない動作が発生することは可能ですか?

1つのアプリケーション内で複数のデバイスリンケージを試行する場合。

  • これは、おそらくライブラリのバイナリのための「第2連結」の結果であることはできますか?

ほとんど間違いありません。

  • 私は(例えば何のシンボルで探すために)紛争に実際にあるまさに決定するために何ができますか?

競合がランタイムがデバイスリンクフェーズ中に生成及びランタイムAPIによってコンテキストにデバイス・コードをロードするために使用される定型の複数の定義です。

  • 何が実際に競合していない場合、私はこれを避けるために何をすべきでしょうか?

矛盾は本物です。また、回避するには、個別に遵守したデバイスコードを適切にリンクする必要があります。それを超えて、あなたがしていることを正確に教えないことを決めたので、それを修正する方法を正確に伝えることはできません。

+0

あなたが言ったことは、すぐにやろうとしているMCVEを得るために、検索スペースをうまく狭めることです。 – einpoklum

+0

私がやることのほとんどは、 "定義されていない"への未定義の参照です。最終的に、私はCakeのためのCMakeの別のコンパイルオプションを無効にしました。そして、奇妙なことに、それは何とか今何とか働いています(私はデバイスのリンケージを正確に行っている人はいません。受け入れる – einpoklum