2014-12-28 2 views
0

Я делаю первые попытки создать .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 как беспорядок. Любая помощь оценивается.

+1

Как и ошибка, вам необходимо передать '-fPIC', чтобы скомпилировать независимый код на платформах ELF. Как вы добавили его в компиляцию (и знаете ли вы с директивой nvcc '-Xcompiler'?) – talonmies

+0

Я пробовал' -fPIC', но я никогда не видел переключатель '-Xcompiler'; что решило мою проблему. Благодаря! – user14717

ответ

1

Создание общей библиотеки объекта-объекта обычно требует компиляции этих объектов, чтобы они содержали только независимый от позиции код. Как указывает сообщение об ошибке, вы делаете это, используя опцию компилятора хоста -fPIC в системе gnu-linux с использованием gcc.

nvcc включает в себя опцию -XCompiler, которая может использоваться для передачи параметров компилятору хоста. Поэтому добавление -XCompiler="-fPIC" к операторам компиляции, используемым для генерации кода хоста, используемого для сборки в общую библиотеку, может быть использовано для решения этой конкретной проблемы.

Смежные вопросы