¿Cómo debería verse un Makefile muy simple para la compilación de Cuda en Linux?
-
05-07-2019 - |
Pregunta
Quiero compilar un programa Cuda muy básico de nivel mundial en Linux.Tengo tres archivos:
- el núcleo:holamundo.cu
- método principal:holamundo.cpp
- encabezado común:holamundo.h
¿Podrías escribirme un Makefile simple para compilar esto con nvcc y g++?
Gracias,
gabor
Solución
Por si acaso, aquí está mi variante. Lo uso para compilar proyectos CUDA en Mac, pero creo que también se adaptará a Linux. Requiere 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
Otros consejos
Nunca había oído hablar de Cuda antes, pero según la documentación en línea parece que se supone que X.cu debe compilarse en X.o, por lo que tener helloWorld.cu y helloWorld.cpp no es una buena idea.Con su permiso cambiaré el nombre del "kernel" helloKernel.cu, entonces esto debería funcionar:
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 $@
(Tenga en cuenta que esos espacios iniciales son pestañas).
Si eso funciona, prueba una versión más sencilla:
NVCC = nvcc helloWorld.o: %.o : %.cpp %.h helloKernel.o: %.o : %.cu %.o: $(NVCC) -c %< -o $@ helloWorld: helloWorld.o helloKernel.o $(NVCC) %^ -o $@
Mi versión, detallada pero 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 $<
Aquí hay un ejemplo de cómo se ve mi proyecto actual. Como puede ver, hay algunas bibliotecas 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
luego ejecute make ce
y ./ce