为CUDA程序创建一个makefile

时间:2015-12-05 17:15:34

标签: makefile nvcc

我想使用CUDA和C ++自动编译玩具库。然后我按如下方式编写Makefile

tokenUnikWeight = sortHashMap();

for (String key5 : tokenUnikWeight.keySet()) {
   System.out.printf("%s - %d - %d - %f\n", key5, tokenUnikTF.get(key5), tokenUnikDF.get(key5), tokenUnikWeight.get(key5));
 }

键入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

我以前从未写过Makefile。我哪里出错了?

3 个答案:

答案 0 :(得分:3)

我认为您的CUDA文件名中有拼写错误

matrix_cuda.o: marix_cuda.cu
     $(NVCC) $(CUDAFLAGS)   matrix_cuda.cu

恕我直言,它应该是

matrix_cuda.o: matrix_cuda.cu
     $(NVCC) $(CUDAFLAGS)   matrix_cuda.cu

答案 1 :(得分: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 :(得分:0)

此外,您的第一个制作规则对应于编译目标文件matrix_cuda.o。由于make文件中的第一个规则是在调用命令all时首先更新的规则,因此make make规则应该首先出现。 GNU Make有很好的文档说明如何制作简单到复杂的makefile。你可以在这里查看:

https://www.gnu.org/software/make/manual/make.html

您要遇到的另一个问题是,在all规则的make recipe中,您应该只将目标文件链接在一起以创建最终的可执行文件。但是,您尝试在此链接步骤中包含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