2009-10-22 8 views
10

Voglio compilare un programma CUD di base a livello mondiale molto semplice sotto Linux. Ho tre file:Come dovrebbe apparire un semplice Makefile per la compilazione di Cuda con linux

  • il kernel: helloWorld.cu
  • principale metodo: helloWorld.cpp
  • di intestazione comune: helloWorld.h

Mi può scrivere un semplice Makefile per la compilazione questo con nvcc e g ++?

Grazie,
Gabor

+0

prega, taggare le vostre domande make-correlati con tag [fare]. Razionale: http://meta.stackexchange.com/questions/24030/why-do-the-specify-makefile-tag-instead-of-make/26567#26567 –

risposta

4

Nel caso, ecco la mia variante. Lo uso per compilare progetti CUDA su Mac, ma penso che sia adatto anche a Linux. Richiede CUDA SDK.

BINDIR = ./ # places compiled binary in current directory 
EXECUTABLE := helloWorld 

CCFILES := helloWorld.cpp 
CUFILES := helloWorld.cu 

# an ugly part - setting rootdir for CUDA SDK makefile 
# look for common.mk - I don't know where SDK installs it on Linux - 
# and change ROOTDIR accordingly 
ROOTDIR := /Developer/GPU\ Computing/C/common 

include $(ROOTDIR)/../common/common.mk 
+0

Hrmm cerca la strana cutil.h che non uso .. – Nils

+1

Conosco l'età di questo post, ma questa informazione potrebbe rivelarsi utile per chi inizia a lavorare con CUDA <5.x. In realtà, la risposta accettata si basa sul file common.mk che sta inserendo la dipendenza cutil come "-lcutil". Ad ogni modo, per CUDA> = 5.x, l'uso di common.mk non è più richiesto/incoraggiato, poiché tutti i Makefile sono considerati autonomi (come pure il Changelog) – Shadow

8

non ho mai sentito parlare di Cuda prima, ma dalla documentazione in linea sembra come se si suppone X.cu essere compilato in Xo, in modo da avere helloWorld.cu e helloWorld. cpp non è una buona idea. Con il vostro permesso io rinominare il "kernel" helloKernel.cu, allora questo dovrebbe funzionare:

 
NVCC = nvcc 

helloWorld.o: helloWorld.cpp helloWorld.h 
    $(NVCC) -c %< -o [email protected] 

helloKernel.o: helloKernel.cu 
    $(NVCC) -c %< -o [email protected] 

helloWorld: helloWorld.o helloKernel.o 
    $(NVCC) %^ -o [email protected] 

(. Si noti che questi spazi iniziali sono schede)

Se funziona, provare una versione impermeabile:

 
NVCC = nvcc 

helloWorld.o: %.o : %.cpp %.h 
helloKernel.o: %.o : %.cu 

%.o: 
    $(NVCC) -c %< -o [email protected] 

helloWorld: helloWorld.o helloKernel.o 
    $(NVCC) %^ -o [email protected] 
+0

Puoi usare nvcc nei normali file cpp? – teeks99

+0

Non ho accesso a nvcc, quindi non posso esserne certo, ma secondo la documentazione, sì. Per le normali attività del compilatore, nvcc consegna il lavoro a un compilatore standard come g ++. – Beta

+0

@ teeks99 sì, ho accesso a nvcc e funziona perfettamente. –

2

La mia versione, ma verbose trasparente:

 
myapp: myapp.o 
    g++ -fPIC -o [email protected] $< -L /usr/local/cuda/lib -lcudart 

myapp.o: myapp.cu 
    /usr/local/cuda/bin/nvcc --compiler-options -fno-strict-aliasing \ 
    -I/usr/local/cuda/include \ 
    -DUNIX -O2 -o [email protected] -c $< 

matrixMul: matrixMul.o 
    g++ -fPIC -o [email protected] $< -L /usr/local/cuda/lib -lcudart 

# It MUST be named .cu or nvcc compiles as regular C !!! (no __global__) 
matrixMul.o: matrixMul.cu 
    /usr/local/cuda/bin/nvcc --compiler-options -fno-strict-aliasing \ 
    -I/usr/local/cuda/include \ 
    -DUNIX -O2 -o [email protected] -c $< 
1

Ecco un esempio ciò che il mio progetto attuale assomiglia. Come potete vedere c'è un paio di librerie OpenGL

ce : cudaExample.c cudaExample.h 
    cp cudaExample.c cudaExample.cu 
    /usr/local/cuda/bin/nvcc -arch=sm_20 -o ce -lglut -lGL -lGLU -lXext -lXmu -lX11 -lm cudaExample.cu 

quindi eseguire make ce e ./ce

Problemi correlati