2015-12-05 3 views
0

Я хочу автоматизировать сборку библиотеки игрушек с использованием CUDA и C++. Тогда я пишу Makefile следующимСоздание make-файла для программ CUDA

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 

Typing make Я получаю

make: *** No rule to make target `marix_cuda.cu', needed by `matrix_cuda.o'. Stop. 

Я никогда не писал Makefile раньше. Где я неправ?

+0

Как вы построите библиотеку с помощью командной строки без Make? – Beta

+0

'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' – pateheo

ответ

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 снова ,

Если это работает, мы можем внести дальнейшие уточнения.

+0

Он останавливается на шаге 2). Я набрал 'make all', а затем' make: *** Нет правила для make target marix_cuda.cu, необходимого для matrix_cuda.o. Stop.' – pateheo

+0

@pateheo: присутствует ли 'matrix_cuda.cu' в рабочем каталоге (каталог, в котором вы находитесь)? – Beta

1

Я думаю, что у вас есть опечатка в имени файла CUDA

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

ИМХО это должно быть

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

Кроме того, ваше первое правило делает соответствует компиляции файла объект matrix_cuda.o. Правило make all должно быть первым, поскольку первое правило в файле make является первым, которое сначала обновляется при вызове команды make. GNU Make имеет отличную документацию, объясняющую, как сделать простые сложные программные файлы. Вы можете это проверить здесь:

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

Еще одна проблема, с которой вы столкнулись, заключается в том, что в вашем рецепте make для правила all вы должны связывать только файлы объектов, чтобы создать окончательный исполняемый файл. Однако вы пытаетесь включить matrix_blas.cpp alg.cpp test.cpp на этом этапе связывания. Вместо .cpp версий этих файлов они должны быть .o версий (скомпилированные объекты). Make может генерировать эти объектные файлы для вас. Вам просто нужно иметь правило make и рецепт для каждого из них.Например:

matrix_blas.o: matrix_blas.cpp 
    $(CC) $(CXXFLAGS) -c matrix_blas.cpp -o matrix_blas.o 
Смежные вопросы