1

cuda 5.0 プレビューを使用して古いプロジェクトを構築しようとしています。リンク時にエラーが発生し、特定の cuda 関数が見つからないというメッセージが表示されます。例えば:

undefined reference to 'cudaMalloc'.

リンク コマンドには、 cuda の次のオプションが含まれています。

-L/usr/local/cuda/lib64 -L/home/myhome/NVIDIA_CUDA_Samples/C/lib -L/home/myhome/NVIDIA_CUDA_Samples/C/common/lib/linux -lcudart

ls -lah /usr/local/cuda/lib64/libcudart.so.5.0.7 を含む 8 つの cuda ライブラリと、.so-file-end のみを使用したシンボリック リンクが提供されます。

ls /home/myhome/NVIDIA_CUDA_Samples/C/lib/空のディレクトリが表示されますが、これは奇妙なことですか?

ls /home/myhome/NVIDIA_CUDA_Samples/C/common/lib/linux/libGLEW.a のみを含む i686 と x86_64 の 2 つのディレクトリが表示されます。

解決策を探す方法がわかりません。どんな助けでも大歓迎です!

編集:

これが私の完全なリンク コマンドです (TARGET_APPLICATION は私のバイナリで、x86_64/Objectfiles.o は nvcc でコンパイルされたオブジェクト ファイルを含むすべての (23) オブジェクト ファイルを表します)。

/home/myhome/nullmpi-0.7/bin/mpicxx -CC=g++ -I. -I/home/myhome/nullmpi-0.7/src -I/usr/lib/openmpi/include -L/usr/local/cuda/lib64 -L/home/myhome/NVIDIA_CUDA_Samples/C/lib -L/home/myhome/NVIDIA_CUDA_Samples/C/common/lib/linux -lcudart -o TARGET_APPLICATION x86_64/Objectfiles.o /usr/lib/liblapack.so /usr/lib/libblas.so /home/myhome/nullmpi-0.7/lib/libnullpmpi.a -lm

コンパイルとリンクにnullmpiを使用します(プロジェクトは MPI と CUDA を使用g++します) -CC=g++

私のcudaオブジェクトファイルのコンパイルコマンド:

/usr/local/cuda/bin/nvcc -c -arch=sm_21 -L/home/myhome/NVIDIA_CUDA_Samples/C/lib -O3 kernelwrapper.cu -o x86_64/kernelwrapper.RELEASE.2.o

echo $LD_LIBRARY_PATH結果:

/usr/local/cuda/lib64:/usr/local/cuda/lib:

echo $PATH結果:

その他のオプション:/usr/local/cuda/bin:/home/myhome/nullmpi-0.7/bin

私は64ビットを構築しています。完全を期すために、Ubuntu 12.04 でビルドしています。(64 ビット)。 CUDA サンプルのビルドは正常に機能します。

解決策(私に指摘してくれたtalonmiesに感謝します):

これは正しいリンク コマンドです。

/home/myhome/nullmpi-0.7/bin/mpicxx -CC=g++ -I. -I/home/myhome/nullmpi-0.7/src -I/usr/lib/openmpi/include -L/usr/local/cuda/lib64 -L/home/myhome/NVIDIA_CUDA_Samples/C/lib -L/home/myhome/NVIDIA_CUDA_Samples/C/common/lib/linux -o TARGET_APPLICATION x86_64/Objectfiles.o /usr/lib/liblapack.so /usr/lib/libblas.so /home/myhome/nullmpi-0.7/lib/libnullpmpi.a -lcudart -lm

4

1 に答える 1

4

リンク ステートメントの順序が正しくありません。次のようになります。

/home/myhome/nullmpi-0.7/bin/mpicxx -CC=g++ -I. -I/home/myhome/nullmpi-0.7/src \
    -I/usr/lib/openmpi/include -L/usr/local/cuda/lib64  \
    -L/home/myhome/NVIDIA_CUDA_Samples/C/lib \ 
    -L/home/myhome/NVIDIA_CUDA_Samples/C/common/lib/linux \ 
    -o TARGET_APPLICATION x86_64/Objectfiles.o \
     /home/myhome/nullmpi-0.7/lib/libnullpmpi.a -llapack -lblas -lm -lcudart

問題の原因は、依存関係を含むオブジェクト ファイルの前にCUDA ランタイム ライブラリを指定したことです。libcudart.soリンカーは、処理される時点で依存関係がないため、リンケージから単純に破棄します。POSIX スタイルのコンパイル ステートメントの黄金律: リンケージ ステートメントは左から右に解析されます。したがって、最初に外部依存関係を含むオブジェクト、その後それらの依存関係を満たすライブラリ。

于 2012-07-11T08:31:31.753 に答える