Search code examples
macoscudamakefilempinvcc

CUDA, OSX, MPI symbol(s) not found for architecture x86_64


Helllo, I have some code, that I'm trying to compile. The code runs well on Linux but I can't compile it on OSX.

In the makefile I use for Linux:

LD_FLAGS    = -lcudart -L$(CUDA_HOME)/lib64

For Mac I try to use these flags:

LD_FLAGS    = -lcudart -L$(CUDA_HOME)/lib
LD_FLAGS    = -lm  -F/Library/Frameworks -framework CUDA

CXXFLAGS    = -O3 -g -m32 -I$(CUDA_HOME)/include
NVCC_FLAGS  = -O3 -g -G -I$(CUDA_HOME)/include -arch=sm_11

This is the make output file:

mpic++ -c -o main.o main.cpp -O3 -m32 -I/Developer/NVIDIA/CUDA-5.0/include

/Developer/NVIDIA/CUDA-5.0/bin/nvcc -c -o kernel.o kernel.cu -O3 -I/Developer/NVIDIA/CUDA-5.0/include -arch=sm_11
ptxas /tmp/tmpxft_000026f4_00000000-5_kernel.ptx, line 146; warning : Double is not supported. Demoting to float
/Developer/NVIDIA/CUDA-5.0/bin/nvcc -c -o support.o support.cu -O3 -I/Developer/NVIDIA/CUDA-5.0/include -arch=sm_11
mpic++ main.o kernel.o support.o -o stencil-mpi -lcudart -L/Developer/NVIDIA/CUDA-5.0/lib
ld: warning: ld: warning: ignoring file kernel.o, file was built for i386 which is not the architecture being linked (x86_64): kernel.o
ignoring file main.o, file was built for i386 which is not the architecture being linked (x86_64): main.o

ld: warning: ignoring file support.o, file was built for i386 which is not the architecture being linked (x86_64): support.o
Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [stencil-mpi] Error 1

Solution

  • This problem was caused by trying to mix 32 and 64 bit compilation between the CUDA and MPI toolchains. It was noted in comments that adding -m64 instead of -m32 for LD_FLAGS, CXXFLAGS, and NVCC_FLAGS produced a working 64 bit build.