2014-12-28 35 views
0

我在建立一個完整的CUDA程序的.so使我第一次嘗試。我有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

構建宿主對象的共享庫通常需要編譯那些對象,使它們只包含與位置無關的代碼。如錯誤消息所示,您可以使用gcc的gnu-linux系統上的-fPIC主機編譯器選項來執行此操作。

NVCC包括一個選項-XCompiler,其可用於將選項傳遞給主機編譯器。因此增加-XCompiler="-fPIC"用於生成用於構建共享庫的主代碼的編譯語句可以用來解決這個特定的問題。