繁体   English   中英

为什么我无法链接到使用动态并行和可分离编译的 CUDA 静态库?

[英]Why can't I link to my CUDA static library that uses Dynamic Parallelism and Separable Compilation?

我正在尝试创建最基本的 CUDA 应用程序来演示动态并行、单独编译和链接、静态库中的 CUDA 内核,并且我正在尝试使用 CMake 生成 Visual Studio 解决方案。 我使用的是 CMake 3.21.3、CUDA 11.4 和 Visual Studio 2019 (16.11.5)。

我有一个 .h 和一个 .cu 文件,我正在将它们编译成一个静态库。 我还有一个 main.cpp 文件,其中包含我的库中的标题和指向它的链接。 该文件被编译为可执行文件。 我的库和可执行文件的代码位于不同的文件夹中,如下所示:

src
 |-MyLib
 |  |-mylib.h
 |  |-mylib.cu
 |  |-CMakeLists.txt
 |
 |-MyMain
 |  |-main.cpp
 |  |-CMakeLists.txt
 |
 |-CMakeLists.txt

mylib.h 和 mylib.cu 包含一个用于初始化 CUDA 的函数、两个内核:一个父内核和一个子内核,以及一个调用父内核的主机函数。 mylib.h #includes cuda_runtime.hdevice_launch_parameters.h以使 Visual Studio 满意。

main.cpp 简单地#includes mylib.h,调用initCUDA 函数,然后调用宿主函数来调用内核。

库的 CMakeLists 文件如下所示:

cmake_minimum_required(VERSION 3.17 FATAL_ERROR)
project(MyLib LANGUAGES CXX CUDA)

find_package(CUDAToolkit REQUIRED)

add_library(${PROJECT_NAME} STATIC mylib.h mylib.cu)

target_compile_options(${PROJECT_NAME} PRIVATE "$<$<AND:$<CONFIG:Debug>,$<COMPILE_LANGUAGE:CUDA>>:-G;-src-in-ptx>") # enable device debug flags

set_target_properties(${PROJECT_NAME} PROPERTIES CUDA_ARCHITECTURES "52") # this is to make CMake happy
set_target_properties(${PROJECT_NAME} PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
set_target_properties(${PROJECT_NAME} PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS ON)  # this is required for some reason

target_link_libraries(${PROJECT_NAME} ${CUDAToolkit_LIBRARY_DIR}/cudart.lib)

main.cpp 的 CMakeLists 文件如下所示:

cmake_minimum_required(VERSION 3.17 FATAL_ERROR)

project(CUDA_Dynamic_Parallelism)

add_executable(${PROJECT_NAME} main.cpp)
set_target_properties(${PROJECT_NAME} PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
target_link_libraries(${PROJECT_NAME} MyLib)

CMake配置并生成解决方案,没问题。 但是,当我尝试构建时,库似乎构建正常,但是当可执行文件链接时,出现以下错误: MyLib.lib(MyLib.device-link.obj) : error LNK2001: unresolved external symbol __fatbinwrap_38_cuda_device_runtime_compute_86_cpp1_ii_8b1a5d37

任何想法为什么会发生这种情况以及如何解决它?

单看错误,我猜cuda架构有问题。 您使用 CUDA_ARCHITECTURES 52 构建您的 Lib,但您没有在秒项目中指定任何内容。

“__fatbinwrap_38_cuda_device_runtime_compute_86_cpp1_ii_8b1a5d37”似乎表明它正在寻找具有计算架构 86 的符号。我建议使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM