CUDA 5.0用cmake单独编译库

sor*_*iak 11 cuda compilation cmake

我的cuda库的构建时间正在增加,所以我认为在CUDA 5.0中引入的单独编译可能对我有所帮助.我无法弄清楚如何用cmake实现单独的编译.我查看了NVCC文档并找到了如何编译设备对象(使用-dc选项)以及如何链接它们(使用-dlink).我尝试使用cmake运行它失败了.我正在使用cmake 2.8.10.2和FindCUDA.cmake主干的头部.然而,我无法找到如何指定应编译哪些文件以及如何将它们链接到库中.特别的语法function(CUDA_LINK_SEPARABLE_COMPILATION_OBJECTS output_file_var cuda_target options object_files source_files) 我不清楚,因为我不知道是什么的output_file_varcuda_target是.在这里我的尝试的不工作结果:

cuda_compile(DEVICEMANAGER_O devicemanager.cu OPTIONS -dc)
cuda_compile(BLUB_O blub.cu OPTIONS -dc)
CUDA_LINK_SEPARABLE_COMPILATION_OBJECTS(TEST_O gpuacceleration
                                          ""  DEVICEMANGER_O BLUB_O)
set(LIB_TYPE SHARED)
#cuda_add_library(gpuacceleration ${LIB_TYPE} 
  #${gpuacc_SRCS} 
  #devicemanager.cu
  # blub.cu
  #DEVICEMANAGER_O
#  TEST_O
#)
Run Code Online (Sandbox Code Playgroud)

有谁知道如何使用cmake编译和链接cuda库?提前致谢.

编辑: 在朋友咨询FindCUDA.cmake的开发人员后,FindCUDA.cmake提供的示例中修复了一个错误(https://gforge.sci.utah.edu/gf/project/findcuda/scmsvn/?action= browse&path =%2F checkout%2Ftrunk%2FFindCuda.html).我现在能够构建这个例子.在我的项目中,我可以根据需要使用以下内容构建库(需要cmake 2.8.10):

set(LIB_TYPE SHARED)
set(CUDA_SEPARABLE_COMPILATION ON)
cuda_add_library(gpuacceleration ${LIB_TYPE} 
 blub.cu
 blab.cu
)
Run Code Online (Sandbox Code Playgroud)

但是: 我无法链接到这个库.当我在没有单独编译的情况下构建lib时,我能够链接它.现在收到以下错误:

 undefined reference to `__cudaRegisterLinkedBinary_53_tmpxft_00005ab4_00000000_6_blub_cpp1_ii_d07d5695'
Run Code Online (Sandbox Code Playgroud)

对于具有接口中使用的功能的每个文件.看似奇怪,因为它建立没有任何警告等任何想法如何使这工作?

编辑: 我终于想出了如何做到这一点.有关详细信息,请参阅@ PHD和我的答案.

sor*_*iak 5

我终于让它运行了;)

除了@PHD的答案,我对此有何评论我修改:set(BUILD_SHARED_LIBS OFF)在我CMakeLists.txt,因为共享库根据NVCC手动5.0版第40页不支持单独的编译。

除此之外,使用存储库中的最新版本 (1223) 而不是 rev 1221。我联系了开发人员,他解决了一些阻止此问题的问题。此修订版未nvcc -arch=sm_xx正确设置标志,因此我为我的项目手动添加了该标志,并通知了 FindCUDA.cmake 的开发人员。所以这可能会在未来得到解决。

不要忘记让 cmake > 2.8.10 让它工作。

希望这可以帮助除我以外的任何人;)

这是我的 CMakeLists.txt:

#Required for CUDA-Check
cmake_minimum_required(VERSION 2.8.10)

project(gpulib)

set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMake/cuda" ${CMAKE_MODULE_PATH})
# ============================================
# === Target
# ============================================
file(GLOB_RECURSE gpuacc_SRCS "*.cu")
include_directories(.)

# ---------------------------------------
# Find Cuda
find_package(CUDA REQUIRED)

set(CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE ON)

set(BUILD_SHARED_LIBS OFF)

set(CUDA_SEPARABLE_COMPILATION ON)
#list(APPEND CUDA_NVCC_FLAGS -arch=sm_20)

set(LIB_NAME "gpuacceleration")
cuda_add_library(${LIB_NAME}
  ${gpuacc_SRCS} 
  OPTIONS -DSTUFF="blah blah"
  RELEASE -DNDEBUG
  DEBUG -g -DDEBUG
)

set(PUBLIC_HEADERS "myheader1.h;myheader2.h")

INSTALL(FILES ${PUBLIC_HEADERS} DESTINATION include)
INSTALL(FILES "${CMAKE_BINARY_DIR}/src/lib${LIB_NAME}.a" DESTINATION lib)
Run Code Online (Sandbox Code Playgroud)

编辑:这不起作用!问题是在主项目中构建可执行文件时链接生成的库时,对所有 cuda 函数(例如 cudaMalloc)存在未定义的引用。

还在努力

  • 你终于找到解决这个问题的方法了吗? (3认同)

小智 2

使用nvcc版本进行测试:

nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2012 NVIDIA
Corporation Built on Fri_Sep_21_17:28:58_PDT_2012 Cuda compilation
tools, release 5.0, V0.2.1221
Run Code Online (Sandbox Code Playgroud)

和 svn 修订版:

URL: https://gforge.sci.utah.edu/svn/findcuda/trunk
Repository Root: https://gforge.sci.utah.edu/svn/findcuda
Repository UUID: 81322f20-870f-0410-845c-a4cd4664c908
Revision: 1221
Node Kind: directory
Schedule: normal
Last Changed Rev: 1221
Last Changed Date: 2013-01-28 22:31:07 +0100 (Mon, 28 Jan 2013)
Run Code Online (Sandbox Code Playgroud)

在这个例子中包括以下类:

  • lib.h / lib.cu
  • 内核.h/内核.cu

kernel.cu包含一个简单的 CUDA 内核和一个带有公共方法来调用 CUDA 内核的类。类库包含类内核的实例和调用类内核的公共方法的方法。

以下CMakeLists.txt适用于此配置:

cmake_minimum_required(VERSION 2.6.2)

project(Cuda-project)

set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMake/cuda" ${CMAKE_MODULE_PATH})

find_package(CUDA QUIET REQUIRED)

set(CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE OFF)

set(BUILD_SHARED_LIBS ON)

list(APPEND CUDA_NVCC_FLAGS -DBLAH="he he" -DTEST1="this is a test")

CUDA_ADD_LIBRARY(test_lib
  kernel.cu
  lib.cu
  # SHARED
  # STATIC
  OPTIONS -DSTUFF="blah blah"
  RELEASE --use_fast_math -DNDEBUG
  DEBUG -g -DDEBUG
  )


INSTALL(FILES lib.h kernel.h
  DESTINATION include)
INSTALL(FILES "${CMAKE_BINARY_DIR}/libtest_lib.so" 
  DESTINATION lib)
Run Code Online (Sandbox Code Playgroud)