为 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

如果可行,请删除 testmatrix_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.oall 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的主要内容,如果未能解决你的问题,请参考以下文章

在Windows上创建CUDA C程序

哪些文件需要与包含 CUDA Driver API 的应用程序一起分发?

如何使用 NVIDIA 驱动程序/CUDA(支持 tensorflow-gpu)和带有 pip 的 Python3 为图像制作 Dockerfile?

CUDA 结果使用非常大的数组返回垃圾,但不报告错误

我应该现在创建 CUDA 应用程序,还是等待 DirectX 11? [关闭]

CUDA 编程:第一个CUDA程序