【问题标题】:Compiling CUDA Library: Works on Mac, not on Ubuntu编译 CUDA 库:适用于 Mac,不适用于 Ubuntu
【发布时间】:2015-02-25 04:11:22
【问题描述】:

我正在尝试构建一个充满 CUDA 例程的.so。我有 matrix_vector_mult.cu 文件,目前什么都不做:

#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 $@ -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 指令?)
  • 我尝试了-fPIC,但我从未见过-Xcompiler 开关;这解决了我的问题。谢谢!

标签: c macos ubuntu cuda makefile


【解决方案1】:

构建宿主对象的共享库通常需要编译这些对象,以便它们只包含与位置无关的代码。如错误消息所示,您可以在使用 gcc 的 gnu-linux 系统上使用 -fPIC 主机编译器选项来执行此操作。

nvcc 包含一个选项-XCompiler,可用于将选项传递给主机编译器。因此,将-XCompiler="-fPIC" 添加到用于生成用于构建到共享库的主机代码的编译语句中可用于解决此特定问题。

【讨论】:

    猜你喜欢
    • 2012-01-25
    • 1970-01-01
    • 2020-06-26
    • 2019-12-05
    • 1970-01-01
    • 2021-11-30
    • 2012-02-08
    • 1970-01-01
    相关资源
    最近更新 更多