Makefile для создания файла cuda .so (общая библиотека) - PullRequest
0 голосов
/ 17 июня 2020

Я использовал следующий Makefile для создания файла my_kernel.so. Kernel.cuh содержит только объявление функции:

void call_kernel(float *flattened_arr, float *out_arr_2, const int x_size, const int y_size, const int kernal_width);

Однако при вызове функции call_kernel из другой программы произошла ошибка неопределенной функции call_kernel.

Мой вопрос: правильные ли строки генерируют файлы .o и .so?

$(OUT): $(OBJ)
    $(CC) $(LDFLAGS) -shared $(LIBRARIES) -fpic -o $@

$(ODIR)/%.o: $(SDIR)/%.cu $(DEPS)
    $(NVCC) $(NVCC_FLAGS) $(INCLUDES) -c $< -o $@

Вот весь Makefile:

CC=g++-8
DEBUG=no

ifeq ($(DEBUG),yes)
    CXXFLAGS=-Wall -g
    LDFLAGS=-Wall -g
else
    CXXFLAGS=-Wall -g
    LDFLAGS=-Wall -g
endif

NVCC=nvcc
NVCC_FLAGS=
NVCC_LIBS=

INCPATH=inc
SRCPATH=src
OBJPATH=obj
LIBPATH=lib

# CUDA directory:
CUDA_INC = /usr/include
CUDA_LIB = /usr/lib/x86_64-linux-gnu

DIR=/home/lee/Downloads/my_project

IDIR=$(DIR)/inc
_DEPS = kernel.cuh
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

SDIR=$(DIR)/src
_SRC = kernel.cu
SRC = $(patsubst %,$(SDIR)/%,$(_SRC))

ODIR=$(DIR)/obj
_OBJ = kernel.o 
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))

OUT=$(DIR)/lib/libmy_kernel.so

INCLUDES=-I$(CUDA_INC) -I$(IDIR)
LIBRARIES=-L$(CUDA_LIB) -lcudart_static -L$(CUDA_LIB) -lcudadevrt

default: $(OUT)

$(OUT): $(OBJ)
    $(CC) $(LDFLAGS) -shared $(LIBRARIES) -fpic -o $@

$(ODIR)/%.o: $(SDIR)/%.cu $(DEPS)
    $(NVCC) $(NVCC_FLAGS) $(INCLUDES) -c $< -o $@

.PHONY: clean cleanall

clean:
    rm -f $(ODIR)/*.o

cleanall: clean
    rm -f $(OUT)

Большое спасибо

1 Ответ

1 голос
/ 18 июня 2020

Нашел решение из другого источника для устранения проблемы в Makefile, и файл .so теперь работает нормально. Вот правильный Makefile:

CC=g++-8
DEBUG=no

ifeq ($(DEBUG),yes)
    CXXFLAGS=-Wall -g
    LDFLAGS=-Wall -g
else
    CXXFLAGS=-Wall -g
    LDFLAGS=-Wall -g
endif

NVCC=nvcc
NVCC_FLAGS=--compiler-options -fPIC
NVCC_LIBS=

INCPATH=inc
SRCPATH=src
OBJPATH=obj
LIBPATH=lib

# CUDA directory:
CUDA_INC = /usr/include
CUDA_LIB = /usr/lib/x86_64-linux-gnu

DIR=/home/lee/Downloads/add_number

IDIR=$(DIR)/inc
_DEPS = kernel.cuh
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

SDIR=$(DIR)/src
_SRC = kernel.cu
SRC = $(patsubst %,$(SDIR)/%,$(_SRC))

ODIR=$(DIR)/obj
_OBJ = kernel.o 
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))

OUT=$(DIR)/lib/libmy_kernel.so

INCLUDES=-I$(CUDA_INC) -I$(IDIR)
LIBRARIES=-L$(CUDA_LIB) -lcudart_static -L$(CUDA_LIB) -lcudadevrt

# This will achieve the same thing!
# $(OUT): $(OBJ)
#   $(CC) $(LDFLAGS) -shared -Wl,--export-dynamic $(LIBRARIES) -o $@ $^


default: $(OUT)

$(OUT): $(OBJ)
    $(CC) $(LDFLAGS) -shared -Wl,--export-dynamic $(OBJ) $(LIBRARIES) -o $@

$(ODIR)/%.o: $(SDIR)/%.cu $(DEPS)
    $(NVCC) $(NVCC_FLAGS) $(INCLUDES) -c $< -o $@

.PHONY: clean cleanall

clean:
    rm -f $(ODIR)/*.o

cleanall: clean
    rm -f $(OUT)
...