CUDA联动误差

CUDA联动误差,cuda,linker,nvcc,Cuda,Linker,Nvcc,这些命令是由一个Makefile按程序生成的,我基本上是从NVIDIA的教程页面复制的;它的长度超过100行,如果您认为有必要,它会发布,但是这些命令足以重现错误 g++ -m64 -I/usr/local/cuda/include -I. -I.. -I../../common/inc -I/usr/local/cuda/lib64 -o shallowwater.o -c shallowwater.cpp /usr/local/cuda/bin/nvcc -m64 -gencode a

这些命令是由一个Makefile按程序生成的,我基本上是从NVIDIA的教程页面复制的;它的长度超过100行,如果您认为有必要,它会发布,但是这些命令足以重现错误

g++ -m64  -I/usr/local/cuda/include -I. -I.. -I../../common/inc -I/usr/local/cuda/lib64 -o shallowwater.o -c shallowwater.cpp

/usr/local/cuda/bin/nvcc -m64  -gencode arch=compute_10,code=sm_10 -gencode arch=compute_20,code=sm_20 -I/usr/local/cuda/include -I. -I.. -I../../common/inc -I/usr/local/cuda/lib64 -o shallowwatercudamain.o -c shallowwatercudamain.cu

g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L -lcudart 
前两项工作;两个源文件都没有编译错误,但是当运行第三个命令时,我得到以下错误:

shallowwatercudamain.o: In function `__cudaUnregisterBinaryUtil()':
tmpxft_00004e70_00000000-4_shallowwatercudamain.compute_20.cudafe1.cpp:(.text+0x36): undefined reference to `__cudaUnregisterFatBinary'
shallowwatercudamain.o: In function `__sti____cudaRegisterAll_66_tmpxft_00004e70_00000000_6_shallowwatercudamain_compute_20_cpp1_ii_runIt()':
tmpxft_00004e70_00000000-4_shallowwatercudamain.compute_20.cudafe1.cpp:(.text+0x46): undefined reference to `__cudaRegisterFatBinary'
collect2: ld returned 1 exit status
make: *** [shallowwater] Error 1
以下是一些相关的系统信息:

[foo@bar code]$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2012 NVIDIA Corporation
Built on Thu_Apr__5_00:24:31_PDT_2012
Cuda compilation tools, release 4.2, V0.2.1221
[foo@bar code]$ uname -a
Linux intel19 2.6.32-71.el6.x86_64 #1 SMP Wed Sep 1 01:33:01 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux
我在这里发现有人犯了类似的错误,如下所示: 我很难为情地说,我发现了这个,做了相同的更改,除了g++而不是gfortran,它成功了。后来,我又试了一次,但没有成功。我得到了与以下相同的错误:

g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L -L/usr/local/cuda/lib64

我意识到你没有在最后一行写“-lcudart”。您在实际编译时是否链接到cudart?

我意识到您在最后一行中没有添加“-lcudart”。您在进行实际编译时是否链接到cudart?

我认为该命令不正确:

g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L -lcudart 
g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L -L/usr/local/cuda/lib64
g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L/usr/local/cuda/lib64 -lcudart
我觉得这个命令不对:

g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L -lcudart 
g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L -L/usr/local/cuda/lib64
g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L/usr/local/cuda/lib64 -lcudart
此命令在我看来是正确的:

g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L -lcudart 
g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L -L/usr/local/cuda/lib64
g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L/usr/local/cuda/lib64 -lcudart

您需要告诉g++在哪里查找cudart库,这就是
-L/usr/local/cuda/lib64
开关的作用(因此它需要一个路径,您不能单独使用
-L
),您需要告诉g++要使用的库的名称,这就是
-lcudart
的作用。

我看这个命令不对:

g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L -lcudart 
g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L -L/usr/local/cuda/lib64
g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L/usr/local/cuda/lib64 -lcudart
我觉得这个命令不对:

g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L -lcudart 
g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L -L/usr/local/cuda/lib64
g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L/usr/local/cuda/lib64 -lcudart
此命令在我看来是正确的:

g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L -lcudart 
g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L -L/usr/local/cuda/lib64
g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L/usr/local/cuda/lib64 -lcudart

您需要告诉g++在哪里查找cudart库,这就是
-L/usr/local/cuda/lib64
开关的用途(因此它需要一个路径,您不能只使用
-L
),您需要告诉g++要使用的库的名称,这就是
-lcudart
的用途。

这就做到了。谢谢我想当我试图复制它时,我只是看错了补丁。我正在修复我的Makefile以使其正常工作。它成功了。谢谢我想当我试图复制它时,我只是看错了补丁。我正在修复我的Makefile以使其正常工作。