【发布时间】:2017-02-24 16:14:59
【问题描述】:
我正在尝试在集群上构建我的项目,所以我对环境没有任何影响(即没有 sudo)。在我的本地机器上,我可以让它工作。
这里的问题: 我的项目包含 cuda 文件以及 c++ 代码。后者需要一个需要 gcc/g++ >6 的库(也许 >5 也可以,afaik std=c++14)。另一方面,从 cuda 7.5 开始,cuda 代码需要 gcc
我已经通过使用 g++ 6.2.0 作为标准编译器完成了这个问题,并使用 -ccbin /path/to/gcc-4.x 传递了另一个 gcc。
所以我的代码编译得很好,但问题是它还使用了 boost 库,它需要是集群上的更新版本才能与我本地使用的 gcc 6.2.0 一起使用。这本身也不是问题,因为链接正确的确实有效,但是这样做时,nvcc 仍然链接旧版本的 boost(与 gcc-4.x 兼容)和从而导致链接了多个boost库版本。每当使用旧的 boost 库的函数时,这都会导致运行时出现分段错误。
所以我考虑的一个解决方案是首先编译 c++ 文件,然后只编译 cuda 文件,有点像一个简单的 makefile 目标:
foo: foo-class.o
nvcc foo-class.o foo.cu -o foo
我目前不确定这是否能解决问题以及是否可以通过 cmake 来解决,但如果不是这样,是否有可能处理双重链接?
我的当前外观的最小 cmake 文件示例:
cmake_minimum_required(VERSION 3.2)
project(foo)
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
set(LINKER_FLAGS "-lboost_program_options -lboost_regex -lSDL2 -lSDL2main -lboost_system -lboost_filesystem")
set(ADDITIONAL_FLAGS "-g -Wno-error=switch")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 ${LINKER_FLAGS} ${ADDITIONAL_FLAGS}")
set(SOURCE_FILES
runtime/main.cpp
foo.cpp)
set(CUDA_FILES cuda/food.cu)
set(CUDA_ADDITIONAL_FLAGS "-ccbin /usr/bin/gcc --Wno-deprecated-gpu-targets")
set(CUDA_SDK_ROOT_DIR "/afs/crc.nd.edu/x86_64_linux/c/cuda/8.0/")
find_package(CUDA QUIET REQUIRED)
set(CUDA_PROPAGATE_HOST_FLAGS OFF)
set(CUDA_NVCC_FLAGS -g ${CUDA_ADDITIONAL_FLAGS})
FIND_PACKAGE(Boost COMPONENTS program_options filesystem system regex REQUIRED)
cuda_add_executable(isosurfaces ${SOURCE_FILES} ${CUDA_FILES})
include_directories(~/lib/include)
include_directories(${BOOST_ROOT}/incldue)
target_link_libraries(foo ~/lib/lib/libThorSerialize17.so)
感谢您的帮助,我真的很感激。
【问题讨论】:
-
也许我在这里遗漏了一些完全明显的东西,但是你为什么要尝试将任何主机代码与 nvcc 链接呢?
-
有没有办法用cmake构建一个可执行文件,允许一部分用nvcc编译,一部分用gcc/g++编译?