为 CUDA 程序创建 makefile
Posted
技术标签:
【中文标题】为 CUDA 程序创建 makefile【英文标题】:Creating a makefile for CUDA programs 【发布时间】:2015-12-05 17:15:34 【问题描述】:我想使用 CUDA 和 C++ 自动编译玩具库。然后我写了一个Makefile如下
CC=g++
NVCC=nvcc
CXXFLAGS= -fopenmp -O3 -Wextra -std=c++11
CUDAFLAGS= -std=c++11 -c -arch=sm_20
LIBS= -lopenblas -lpthread -lcudart -lcublas
LIBDIRS=-L/usr/local/cuda-7.5/lib64
INCDIRS=-I/usr/local/cuda-7.5/include
matrix_cuda.o: marix_cuda.cu
$(NVCC) $(CUDAFLAGS) matrix_cuda.cu
all: matrix_cuda.o
$(CC) -o test matrix_blas.cpp alg.cpp test.cpp matrix_cuda.o $(LIBDIRS) $(INCDIRS) $(LIBS) $(CXXFLAGS)
clean:
rm -rf test *.o
输入make
我明白了
make: *** No rule to make target `marix_cuda.cu', needed by `matrix_cuda.o'. Stop.
我以前从未写过 Makefile。我哪里做错了?
【问题讨论】:
如果不使用 Make,您将如何使用命令行构建库?nvcc -std=c++11 -c -arch=sm_20 matrix_cuda.cu
然后g++ -o test matrix_blas.cpp alg.cpp test.cpp matrix_cuda.o -L/usr/local/cuda-7.5/lib64 -I/usr/local/cuda-7.5/include -lopenblas -lpthread -lcudart -lcublas -fopenmp -O3 -Wextra -std=c++11
请从本教程/示例中尝试:docs.google.com/document/d/e/…
【参考方案1】:
这可能需要多次迭代。
1) 先试试这个:
nvcc -std=c++11 -c -arch=sm_20 matrix_cuda.cu
如果可行(并产生matrix_cuda.o
,我猜),删除matrix_cuda.o
和
2) 试试这个makefile:
matrix_cuda.o: matrix_cuda.cu
nvcc -std=c++11 -c -arch=sm_20 matrix_cuda.cu
如果可行,
3) 试试这个:
g++ -o test matrix_blas.cpp alg.cpp test.cpp matrix_cuda.o -L/usr/local/cuda-7.5/lib64 -I/usr/local/cuda-7.5/include -lopenblas -lpthread -lcudart -lcublas -fopenmp -O3 -Wextra -std=c++11
如果可行,请删除 test
和
4) 试试这个 makefile:
test: matrix_cuda.o
g++ -o test matrix_blas.cpp alg.cpp test.cpp matrix_cuda.o -L/usr/local/cuda-7.5/lib64 -I/usr/local/cuda-7.5/include -lopenblas -lpthread -lcudart -lcublas -fopenmp -O3 -Wextra -std=c++11
matrix_cuda.o: matrix_cuda.cu
nvcc -std=c++11 -c -arch=sm_20 matrix_cuda.cu
如果可行,请删除 test
和 matrix_cuda.o
和
5) 再次尝试该 makefile。
如果可行,我们可以进行进一步的改进。
【讨论】:
它在第 2 步停止)。我输入了make all
,然后输入了make: *** No rule to make target marix_cuda.cu, needed by matrix_cuda.o. Stop.
@pateheo:matrix_cuda.cu
是否存在于工作目录(您所在的目录)中?【参考方案2】:
我认为您的 CUDA 文件名有错字
matrix_cuda.o: marix_cuda.cu
$(NVCC) $(CUDAFLAGS) matrix_cuda.cu
恕我直言,应该是
matrix_cuda.o: matrix_cuda.cu
$(NVCC) $(CUDAFLAGS) matrix_cuda.cu
【讨论】:
【参考方案3】:您的第一个 make 规则也对应于编译目标文件 matrix_cuda.o
。 all
make 规则应该放在第一位,因为 make 文件中的第一条规则是在调用命令 make
时首先更新的规则。 GNU Make 有很好的文档解释如何制作从简单到复杂的 makefile。你可以在这里查看:
https://www.gnu.org/software/make/manual/make.html.
您将遇到的另一个问题是,在您的 all
规则的 make 配方中,您应该只将目标文件链接在一起以创建最终的可执行文件。但是,您尝试在此链接步骤中包含 matrix_blas.cpp alg.cpp test.cpp
。而不是这些文件的.cpp
版本,它们需要是.o
版本(已编译的对象)。 Make
可以为您生成这些目标文件。你只需要为每一个制定规则和配方。例如:
matrix_blas.o: matrix_blas.cpp
$(CC) $(CXXFLAGS) -c matrix_blas.cpp -o matrix_blas.o
【讨论】:
以上是关于为 CUDA 程序创建 makefile的主要内容,如果未能解决你的问题,请参考以下文章
哪些文件需要与包含 CUDA Driver API 的应用程序一起分发?
如何使用 NVIDIA 驱动程序/CUDA(支持 tensorflow-gpu)和带有 pip 的 Python3 为图像制作 Dockerfile?