CUDAのプロジェクトのMakefile
消えたCUDA関連の旧ブログ記事を復元するひとり Advent Calendar 2024の記事です。
最近CUDAのテンプレートを整備し直していたのでその備忘録を.
やりたいこと
コンパイル時間が長引くのが嫌なので分割コンパイル.オブジェクトファイルがソースコードと同じディレクトリにできるのは嫌なのでobjディレクトリに出力.
- cppやcuを別々にobj/~.oにコンパイルする
- obj/~.oをまとめる
.SUFFIXES: .o .cpp .cu
.cu.o:
$(NVCC) ...
.cpp.o:
$(CXX) ...
どう書いたか
nvccコマンドには--cudaというオプションがあり,cuコードをcppコードに変換する. これを使えば- nvcc --cudaでcuをcppに変換する
- g++等でcppをobj/~.oにコンパイル
普段使っているMakefile
CXX=g++
CXXFLAGS=-std=c++11
NVCC=nvcc
NVCCFLAGS= -arch=sm_61 -lcurand -lcublas $(CXXFLAGS) --compiler-bindir=$(CXX)
SRCDIR=src
SRCS=$(shell find $(SRCDIR) -name '*.cu' -o -name '*.cpp')
OBJDIR=objs
OBJS=$(subst $(SRCDIR),$(OBJDIR), $(SRCS))
OBJS:=$(subst .cpp,.o,$(OBJS))
OBJS:=$(subst .cu,.o,$(OBJS))
TARGET=hoge
$(TARGET): $(OBJS)
$(NVCC) $(NVCCFLAGS) $+ -o $@
$(SRCDIR)/%.cpp: $(SRCDIR)/%.cu
$(NVCC) $(NVCCFLAGS) --cuda $< -o $@
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
[ -d $(OBJDIR) ] || mkdir $(OBJDIR)
$(CXX) $(CXXFLAGS) $< -c -o $@
clean:
rm -rf $(OBJS)
rm -rf $(TARGET)