2009-10-22 12 views
10

Quiero compilar un programa de Cuda hola de nivel mundial muy básico en Linux. Tengo tres archivos:¿Cómo debería ser un archivo Makefile muy simple para la compilación de Cuda en Linux?

  • el núcleo: helloWorld.cu
  • principal método: helloWorld.cpp
  • cabecera común: HelloWorld.h

¿Me podría escribir un sencillo Makefile para compilar esto con nvcc y g ++?

Gracias,
Gabor

+0

Por favor, etiquetar sus preguntas relacionadas con maquillaje con la etiqueta [hacer]. Justificación: http://meta.stackexchange.com/questions/24030/why-do-they-specify-makefile-tag-instead-of-make/26567#26567 –

Respuesta

4

Por las dudas, 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 
+0

Hrmm busca el extraño cutil.h que no uso ... – Nils

+1

Conozco la edad de esta publicación, pero esta información puede ser útil para las personas que comienzan a trabajar con CUDA <5.x. En realidad, la respuesta aceptada se basa en el archivo common.mk que está extrayendo la dependencia de cutil como "-lcutil". De todos modos, para CUDA> = 5.x, el uso de common.mk ya no es obligatorio ni recomendable, ya que se dice que todos los Makefiles son autónomos (también el Changelog) – Shadow

8

que nunca han oído hablar de Cuda antes, pero a partir de la documentación en línea, parece como si se supone X.cu que se recopilarán en Xo, por lo que tener helloWorld.cu y helloWorld. cpp no ​​es una buena idea. Con su permiso voy a cambiar el nombre del "núcleo" helloKernel.cu, entonces esto debería funcionar:

 
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] 

(. Tenga en cuenta que los espacios iniciales son pestañas)

Si funciona, intente una versión más pulido:

 
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

¿Se puede usar nvcc en los archivos cpp normales? – teeks99

+0

No tengo acceso a nvcc, por lo que no puedo estar seguro, pero de acuerdo con la documentación, sí. Para las tareas normales del compilador, nvcc entrega el trabajo a un compilador estándar como g ++. – Beta

+0

@ teeks99 sí, tengo acceso a nvcc y funciona perfectamente. –

2

Mi versión, prolijo, pero transparente:

 
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

Este es un ejemplo de lo que mi proyecto actual se parece. Como se puede ver que hay un par de librerías 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 

continuación, ejecute make ce y ./ce

Cuestiones relacionadas