我得到了以下设置.我将使用CUDA使用MPI和其他Stuff扩展用C++编写的框架.该项目使用cmake进行建设.我想避免使用库来扩展我的cuda源代码文件.之后我想链接这些对象对象文件和其他编译器编译的其他文件.有没有人对hwo有所了解?
我查看了http://code.google.com/p/cudpp/wiki/BuildingCUDPPwithCMake,了解如何使用cmake使用CUDA,但此解决方案也使用了库.
我的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和我的答案.
我找不到CUDA 5.0支持哪个版本/哪个c ++概念.我在CUDA 5.0 RC随附的"编程指南"或"参考指南"中找不到任何信息.特别是我想知道CUDA 5.0是否支持C++ 11.有人能指点我到一个地方寻找这些信息吗?
我有一个循环,我使用一个函数将std :: unique_ptr返回给抽象类的对象.我想通过push_back将这些对象存储到std :: vector中.但由于对象是抽象类型,我得到以下错误:
error: cannot allocate an object of abstract type
Run Code Online (Sandbox Code Playgroud)
为线
cells.push_back(std::move(*cell));
Run Code Online (Sandbox Code Playgroud)
其中,cell是std::vector抽象类型的类型,并且cell是类型
std::unique_ptr<AbstractType>&& cell
Run Code Online (Sandbox Code Playgroud)
(我实际上传递cell给一个处理程序类)我知道一个人不能实例化一个抽象类型,因为我理解std:move操作符需要以某种方式实例化对象?
任何人都可以帮我解决问题吗?或者函数(不是我的项目部分)是否应该返回一个指向抽象类型对象的唯一指针?