2009-10-22 15 views
10

Je veux compiler un programme Cuda de niveau mondial très basique sous Linux. J'ai trois fichiers:Comment devrait ressembler un Makefile très simple pour Cuda compiler sous linux

  • le noyau: helloWorld.cu
  • méthode principale: helloWorld.cpp
  • tête commune: helloWorld.h

Pourriez-vous me écrire un Makefile simple pour compiler ceci avec nvcc et g ++?

Merci,
Gabor

+0

S'il vous plaît, marquer vos questions relatives à make-avec le tag [faire]. Justification: http://meta.stackexchange.com/questions/24030/why-do-they-specify-makefile-tag-instead-of-make/26567#26567 –

Répondre

4

Juste au cas, voici ma variante. Je l'utilise pour compiler des projets CUDA sur Mac, mais je pense que ça va convenir à Linux aussi. Il nécessite 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 il cherche l'étrange cutil.h que je n'utilise pas .. – Nils

+1

Je connais l'âge de ce post, mais cette information pourrait être utile pour les personnes commençant à travailler avec CUDA <5.x. En fait, la réponse acceptée se base sur le fichier common.mk qui place la dépendance cutil sous la forme "-lcutil". Quoi qu'il en soit, pour CUDA> = 5.x, l'utilisation de common.mk n'est plus nécessaire/encouragée, car tous les Makefiles sont supposés être autonomes (aussi le Changelog) – Shadow

8

Je n'ai jamais entendu parler de Cuda avant, mais à partir de la documentation en ligne, il semble que X.cu est censé être compilé dans Xo, afin d'avoir helloWorld.cu et helloWorld. cpp n'est pas une bonne idée. Avec votre permission, je vais renommer le « noyau » helloKernel.cu, alors cela devrait fonctionner:

 
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] 

(. Notez que ces espaces sont grands onglets)

Si cela fonctionne, essayez une version Slicker:

 
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

Pouvez-vous utiliser nvcc sur les fichiers cpp normaux? – teeks99

+0

Je n'ai pas accès à nvcc, donc je ne peux pas en être certain, mais d'après la documentation, oui. Pour les tâches de compilateur ordinaires, nvcc confie le travail à un compilateur standard comme g ++. – Beta

+0

@ teeks99 oui, j'ai accès à nvcc et ça marche parfaitement. –

2

Ma version, bavard mais transparent:

 
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

Voici un exemple ce que mon projet actuel ressemble. Comme vous pouvez le voir il y a quelques bibliothèques 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 

puis exécutez make ce et ./ce