本文介绍了CUDA 5.0库单独编译与cmake的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

The buildtime of my cuda library is increasing and so I thought that separate compilation introduced in CUDA 5.0 might help me. I couldn't figure out how to achieve separate compilation with cmake. I looked into the NVCC documentation and found how to compile device object (using the -dc option) and how to link them (using the -dlink). My attempts to get it running using cmake failed. I'm using cmake 2.8.10.2 and the head of the trunk of the FindCUDA.cmake. I couldn't however find out how to specify which files should be compiled and how to link them into a library.Especially the syntax of the function(CUDA_LINK_SEPARABLE_COMPILATION_OBJECTS output_file_var cuda_target options object_files source_files) is unclear to me because I don't know what the output_file_var and the cuda_target are.Here the not working results of my attemps:

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
#)

有没有人知道如何使用cmake编译和链接cuda库?
提前感谢。

Does anyone know how to compile and link a cuda library using cmake?Thanks in advance.

编辑:
在朋友咨询了FindCUDA.cmake的开发人员之后,在FindCUDA.cmake提供的示例中得到修复( 结帐%2Ftrunk%2FFindCuda.html)。
现在我可以构建这个例子了。
在我的项目中,我可以根据需要使用以下内容构建库(需要cmake 2.8.10):

After a friend consulted the developer of the FindCUDA.cmake, a bug got fixed in the example provided with FindCUDA.cmake (https://gforge.sci.utah.edu/gf/project/findcuda/scmsvn/?action=browse&path=%2Fcheckout%2Ftrunk%2FFindCuda.html).I'm now able to build the example.In my project I can build the library as needed using the following (cmake 2.8.10 required):

set(LIB_TYPE SHARED)
set(CUDA_SEPARABLE_COMPILATION ON)
cuda_add_library(gpuacceleration ${LIB_TYPE}
 blub.cu
 blab.cu
)

但是:
我无法链接到此库。当我构建lib没有单独的编译,我能够链接到它。
现在得到以下错误:

BUT:I cannot link against this library. When I builded the lib without separate compilation i was able to link against it.Now getting the following error:

 undefined reference to `__cudaRegisterLinkedBinary_53_tmpxft_00005ab4_00000000_6_blub_cpp1_ii_d07d5695'

用于接口中使用的函数。似乎很奇怪,因为它建立没有任何警告等
任何想法如何让这个工作?

for every file with a function used in the interface. Seems strange since it builds without any warning etc.Any ideas how to get this working?

编辑:
我终于找到了如何做到这一点。详情请参阅@ PHD和我的答案。

I finally figured out how to do this. See @PHD's and my answer for details.

推荐答案

我终于开始运行了)

@PHD的答案和我的意见我修改:设置(BUILD_SHARED_LIBS关闭)在我的 CMakeLists.txt 共享库不支持单独的编译根据nvcc手动v5.0第40页。

In Addition to the answer of @PHD and my comment on it I modified: set(BUILD_SHARED_LIBS OFF) in my CMakeLists.txt since shared libs are not supported for separate compilation according to the nvcc manually v5.0 page 40.

除了使用最新的rev(1223)从存储库,而不是我联系了开发商,他解决了一些阻塞这个问题。
此版本没有正确设置 nvcc -arch = sm_xx 标志,因此我手动添加为我的项目,并通知FindCUDA.cmake的开发人员。

In addition to that use the latest rev (1223) from the repository instead of rev 1221. I contacted the developer and he fixed some issue blocking this.This revision doesn't set the nvcc -arch=sm_xx flag correctly, so I added this manually for my project and informed the developer of FindCUDA.cmake. So this might get fixed in the future.

不要忘记获取cmake> 2.8.10才能正常工作。

Don't forget to get cmake > 2.8.10 for this to work.

希望这有助于除我之外的任何人)

Hope this helps anyone but me ;)

这是我的CMakeLists.txt:

Here is my 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)

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

this is not working!The problem is that there are undefined references to all cuda functions (eg. cudaMalloc) when linking the generated library when building a executable in the main project.

仍在继续工作

这篇关于CUDA 5.0库单独编译与cmake的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-05 02:41