soriak
soriak

Reputation: 672

Cuda 5.0 Linking Issue

I'm just trying to build an old project of mine using cuda 5.0 preview. I get an Error when linking, telling me that certain cuda functions can not be found. For example:

undefined reference to 'cudaMalloc'.

My linking command includes the following options for 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/ gives me 8 cuda libraries including libcudart.so.5.0.7 with symlinks using only the .so-file-ending.

ls /home/myhome/NVIDIA_CUDA_Samples/C/lib/ gives me an empty directory, which is kind of strange?

ls /home/myhome/NVIDIA_CUDA_Samples/C/common/lib/linux/ gives me two directories: i686 and x86_64 both containing only libGLEW.a

I have no idea which way to look for a solution. Any help is appreciated!

EDIT:

Here is my complete linking command (TARGET_APPLICATION is my binary and x86_64/Objectfiles.o stands for all (23) object files including the object file compiled with 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

I use nullmpi for compilation and linking (project uses MPI and CUDA), which internally uses g++ as can be seen by -CC=g++, i wanted to keep this stuff out.

The compilation command for my cuda object file:

/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 results in:

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

echo $PATH results in:

otherOptions:/usr/local/cuda/bin:/home/myhome/nullmpi-0.7/bin

I'm building 64-bit. For the sake of completeness I'm building on Ubuntu 12.04. (64bit). Building the CUDA Samples works fine.

SOLUTION (thanks to talonmies for pointing me to it):

This is the correct linking command:

/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

Upvotes: 1

Views: 3001

Answers (1)

talonmies
talonmies

Reputation: 72350

You have your linking statements in the incorrect order. It should be something more like this:

/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

The source of your problem is that you have specified the CUDA runtime library before the object file that contains a dependency to it. The linker simply discards libcudart.so from the linkage because there are no dependencies to it at the point when it is processed. Golden rule in POSIX style compilation statements: linkage statements are parsed left-to-right; so objects containing external dependencies first, libraries satisfying those dependencies afterwards.

Upvotes: 4

Related Questions