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_var和cuda_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和我的答案.
我终于让它运行了;)
除了@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)存在未定义的引用。
还在努力
小智 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)
在这个例子中包括以下类:
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)