2

from PGI でmain.cppコンパイルされた私の C++ プロジェクトは、 でコンパイルされた別のファイルに CUDA コードを含む関数を呼び出します。関数宣言と共通ヘッダー ファイルで関数をラップしないと、リンク エラー (未定義の参照) が発生します。pgcppcuda()cuda.cunvcccuda()extern "C"

なしextern "C"(シンボル名の不一致 => 未定義参照):

$ nm main.o | grep -y cuda
U cuda__FPfPiT2iN32
$ nm cuda.o | grep -y cuda
T _Z13cudaPfPiS0_iS0_S0_S0_

extern "C"(シンボル名の一致 => リンクは正常に動作します) :

$ nm main.o | grep -y cuda
U cuda
$ nm cuda.o | grep -y cuda
T cuda

nvccホスト コードにホスト C++ コンパイラを使用したため、C++ のようにシンボル名をマングルするというのが私の印象でした。私は何を間違っていますか?

編集:これは、ホスト コードにnvccGNU コンパイラgccを実際に使用し、このコンパイラが名前を異なる方法でマングルするという事実によるものpgcppでしょうか?

EDIT2:私のシステムにはpgcpp 14.9、gcc 4.4.7、nvcc/CUDA 6.5があります

4

1 に答える 1

2

nvcc(Linux では) ホスト gcc/g++ (gnu) ツールチェーンをデフォルトで使用します。

PGI は、C++ コードをコンパイルするためのわずかに異なる 2 つのツールチェーンを提供します。ツールを使用して 1 つのツールチェーンが呼び出されpgcppます。このツールチェーンはgnu 互換ではなく、必ずしも gnu 互換の名前マングリングを生成するとは限りません。他のツールチェーンはツールを使用して呼び出されpgc++、gnu 互換としてアドバタイズされ、gnu 互換の名前マングリングを生成する必要があります。

nvccと PGI ツールによって生成されたオブジェクト間のこのタイプのリンクの問題は、pgc++ツールを使用して解決する必要があります。

余談ですが、CUDA 7 では、PGI コンパイラ ( pgc++) を のホスト コンパイラとして使用できるようになりましたnvcc。ただし、これはここでの問題の核心ではありませんが、そのホスト コンパイラに切り替えると、同様の方法でリンクの問題が修正されます。

pgcppとの違いはpgc++、現在のバージョンのPGI ユーザー ガイド(xv ページなど) とPGI 2015 リリース ノートで参照されています。

PGI 2015 の機能とパフォーマンス

•PGI C++ コンパイラ

◦ PGC++ (pgc++) が Linux および OS X のデフォルトになりました。機能には、GNU 互換の名前マングリングと、g++ バージョン 4.2-4.8 をサポートする言語機能が含まれます。

...

◦ pgc++ は、Linux の NVCC ホスト コンパイラとしてもサポートされるようになりました。

pgc++現在 (2015 年) は「デフォルト」と見なされpgcpp、「非推奨」としてリストされていることに注意してください。

于 2015-03-01T20:35:03.923 に答える