c++ - 为什么我无法链接到使用动态并行和可分离编译的 CUDA 静态库?
问题描述
我正在尝试创建最基本的 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.h
让device_launch_parameters.h
Visual Studio 开心。
main.cpp就是#includes
mylib.h,调用initCUDA函数,然后调用host函数调用内核。
该库的 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,但您没有在 seconds 项目中指定任何内容。
“__fatbinwrap_38_cuda_device_runtime_compute_86_cpp1_ii_8b1a5d37”似乎表明它正在寻找具有计算架构 86 的符号。我建议玩弄它。
推荐阅读
- javascript - Javascript:网页中与脚本相关的 HTML 标签的不正确中和(基本 XSS)
- jquery - 使用 jquery animate 方法在容器 div 周围移动框 div
- postgresql - Postgres 将列出我的数据库,但当我尝试连接它时它不存在
- html - 为 a 设置垂直对齐
- swift - 如何在 Swift 中使用调用者的类型推断静态泛型方法中的类型
- javascript - Dialogflow - Hangouts Chat 负载示例
- laravel - Laravel 宅基地忽略要安装的功能
- python - 如何使用 Python 在 txt 文件中设置支出和描述?
- django - 当我定义 AUTH_USER_MODEL 时,Django 无法识别关系
- sql - 根据条件更新表