A quoi devrait ressembler un Makefile très simple pour Cuda compiler sous linux
-
05-07-2019 - |
Question
Je souhaite compiler un programme Cuda de niveau mondial Hello très basique sous Linux. J'ai trois fichiers:
- le noyau: helloWorld.cu
- méthode principale: helloWorld.cpp
- en-tête commun: helloWorld.h
Pourriez-vous m'écrire un Makefile simple pour le compiler avec nvcc et g ++?
Merci,
Gabor
La solution
Juste au cas où, voici ma variante. Je l’utilise pour compiler des projets CUDA sur Mac, mais je pense que cela conviendra également à Linux. CUDA SDK est nécessaire.
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
Autres conseils
Je n'ai jamais entendu parler de Cuda auparavant, mais d'après la documentation en ligne, il semble que X.cu soit censé être compilé dans X.o. Il n'est donc pas judicieux d'avoir helloWorld.cu et helloWorld.cpp. Avec votre permission, je renommerai le & Quot; noyau & Quot; helloKernel.cu, cela devrait alors fonctionner:
NVCC = nvcc helloWorld.o: helloWorld.cpp helloWorld.h $(NVCC) -c %< -o $@ helloKernel.o: helloKernel.cu $(NVCC) -c %< -o $@ helloWorld: helloWorld.o helloKernel.o $(NVCC) %^ -o $@
(Notez que ces espaces sont des tabulations.)
Si cela fonctionne, essayez une version plus astucieuse:
NVCC = nvcc helloWorld.o: %.o : %.cpp %.h helloKernel.o: %.o : %.cu %.o: $(NVCC) -c %< -o $@ helloWorld: helloWorld.o helloKernel.o $(NVCC) %^ -o $@
Ma version, commentée mais transparente:
myapp: myapp.o g++ -fPIC -o $@ $< -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 $@ -c $< matrixMul: matrixMul.o g++ -fPIC -o $@ $< -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 $@ -c $<
Voici un exemple de mon projet actuel. Comme vous pouvez le constater, il existe 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