Я делаю первые попытки создать .so
, полный процедур CUDA. У меня есть matrix_vector_mult.cu
файл, который в данный момент ничего не делает:Компиляция библиотеки CUDA: работает на Mac, а не на Ubuntu
#include <stdio.h>
extern "C"
double *
matrix_vector_mult(const double ** const M,
const double * const v,
const size_t num_rows,
const size_t num_cols)
{
printf("Hello!\n");
double * p = (double *) malloc(num_rows*sizeof(double));
return p;
}
У меня также есть Makefile, содержание которого заключается в следующем:
CC := clang
UNAME := $(shell uname -s)
ifeq ($(UNAME), Darwin)
CUDA_PATH := /Developer/NVIDIA/CUDA-6.5
CUDA_LIB := ${CUDA_PATH}/lib
endif
ifeq ($(UNAME), Linux)
CUDA_PATH := /usr/local/cuda-6.5
CUDA_LIB := ${CUDA_PATH}/lib64
endif
LIBS := -L ${CUDA_LIB} -lcudart -lcudadevrt
NVCC := ${CUDA_PATH}/bin/nvcc -ccbin ${CC}
CFLAGS := -g -std=c11 -Wextra -Wall -I include -rpath ${CUDA_LIB}
NVCCFLAGS := -g -m64 -D__STRICT_ANSI__
vpath %.cu src
vpath %.h include
all: matrix_vector_mult.o
${CC} ${CFLAGS} -o matrix_vector_mult.so -shared -fPIC $^ ${LIBS}
matrix_vector_mult.o: matrix_vector_mult.cu
${NVCC} ${NVCCFLAGS} -o [email protected] -c $^
clean:
rm -f *.o *.so *.pyc
На Mac, это компилируется нормально. Однако в моем поле Ubuntu появляется сообщение об ошибке:
/usr/bin/ld: matrix_vector_mult.o: relocation R_X86_64_32S against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
matrix_vector_mult.o: error adding symbols: Bad value
В чем проблема? (Добавление -fPIC
к линии компиляции не работает.) nvcc --version
дает одинаковую информацию на обоих полях, clang --version
дает
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
на Mac и
Ubuntu clang version 3.4-1ubuntu3 (tags/RELEASE_34/final) (based on LLVM 3.4)
на поле Ubuntu. Я несколько сомневаюсь, что небольшая разница в версии LLVM является проблемой, потому что я уже рассматриваю makefile как беспорядок. Любая помощь оценивается.
Как и ошибка, вам необходимо передать '-fPIC', чтобы скомпилировать независимый код на платформах ELF. Как вы добавили его в компиляцию (и знаете ли вы с директивой nvcc '-Xcompiler'?) – talonmies
Я пробовал' -fPIC', но я никогда не видел переключатель '-Xcompiler'; что решило мою проблему. Благодаря! – user14717