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/给了我 8 个 cuda 库,包括 libcudart.so.5.0.7 以及仅使用 .so 文件结尾的符号链接。

ls /home/myhome/NVIDIA_CUDA_Samples/C/lib/给了我一个空目录,这有点奇怪?

ls /home/myhome/NVIDIA_CUDA_Samples/C/common/lib/linux/给了我两个目录: i686 和 x86_64 都只包含 libGLEW.a

我不知道以哪种方式寻找解决方案。任何帮助表示赞赏!

编辑:

这是我的完整链接命令(TARGET_APPLICATION 是我的二进制文件,x86_64/Objectfiles.o 代表所有(23)个目标文件,包括用 nvcc 编译的目标文件):

/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 回答