问题描述
我的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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!