Как должен выглядеть очень простой Makefile для компиляции Cuda под Linux

Я хочу скомпилировать очень простую программу приветствия мирового уровня Cuda под Linux. У меня есть три файла:

  • ядро: helloWorld.cu
  • основной метод: helloWorld.cpp
  • общий заголовок: helloWorld.h

Не могли бы вы написать мне простой Makefile для компиляции с помощью nvcc и g++?

Спасибо,
Габор


person Vereb    schedule 22.10.2009    source источник
comment
Пожалуйста, отмечайте вопросы, связанные с make, тегом [make]. Обоснование: meta.stackexchange.com/questions/24030/   -  person P Shved    schedule 24.10.2009


Ответы (4)


На всякий случай вот мой вариант. Я использую его для компиляции проектов CUDA на Mac, но я думаю, что он подойдет и для Linux. Требуется 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
person fjarri    schedule 13.11.2009
comment
Я знаю возраст этого поста, но эта информация может пригодиться людям, начинающим работать с CUDA ‹ 5.x. На самом деле принятый ответ основан на файле common.mk, который использует зависимость cutil как -lcutil. В любом случае, для CUDA ›= 5.x использование common.mk больше не требуется/рекомендуется, поскольку все файлы Makefile считаются автономными (см. также журнал изменений) - person Shadow; 30.10.2012

Я никогда раньше не слышал о Cuda, но из онлайн-документации кажется, что X.cu должен быть скомпилирован в X.o, поэтому иметь helloWorld.cu и helloWorld.cpp не очень хорошая идея. С вашего позволения переименую "ядро" в helloKernel.cu, тогда должно работать:

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 $@

(Обратите внимание, что эти начальные пробелы являются вкладками.)

Если это сработает, попробуйте более гладкую версию:

NVCC = nvcc

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

%.o:
    $(NVCC) -c %< -o $@

helloWorld: helloWorld.o helloKernel.o
    $(NVCC) %^ -o $@
person Beta    schedule 22.10.2009
comment
Можете ли вы использовать nvcc для обычных файлов cpp? - person teeks99; 23.10.2009
comment
У меня нет доступа к nvcc, поэтому я не могу быть уверен, но согласно документации да. Для обычных задач компиляции nvcc передает работу стандартному компилятору, такому как g++. - person Beta; 23.10.2009

Моя версия, многословная, но прозрачная:

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 $<
person keraba    schedule 09.01.2010

Вот пример того, как выглядит мой текущий проект. Как видите, есть несколько библиотек 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

затем запустите make ce и ./ce

person John Riselvato    schedule 03.05.2012