当前位置: 首页 > 知识库问答 >
问题:

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

韩豪
2023-03-14

我正在尝试创建最基本的 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函数,然后调用主机函数来调用内核。

该库的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)

主.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):错误LNK2001:未解析的外部符号__fatbinwrap_38_cuda_device_runtime_compute_86_cpp1_ii_8b1a5d37

知道为什么会发生这种情况以及如何解决吗?

共有1个答案

段干飞翔
2023-03-14

只要看看这个错误,我就会猜测cuda架构有问题。你用CUDA_ARCHITECTURES52构建你的Lib,但是你没有在秒项目中指定任何一个。

“_ _ fatbinwrap _ 38 _ cuda _ device _ runtime _ compute _ 86 _ CP P1 _ ii _ 8 B1 a5d 37”似乎表明它在寻找一个计算架构为86的符号。我建议你试试这个。

 类似资料:
  • 主要内容:静态链接库,动态链接库,总结我们知道,C、C++程序从源文件到生成可执行文件需经历 4 个阶段,分别为预处理、编译、汇编和链接,本节将重点围绕链接阶段,对静态链接库和动态链接库做详细的讲解。 有关链接操作的具体细节,感兴趣的读者可阅读《 到底什么是链接,它起到了什么作用?》和《 符号——链接的粘合剂》这两节。总的来说链接阶段要完成的工作,就是将同一项目中各源文件生成的目标文件以及程序中用到的库文件整合为一个可执行文件。 通过

  • 静态链接方法:静态链接的时候,载入代码就会把程序会用到的动态代码或动态代码的地址确定下来 静态库的链接可以使用静态链接,动态链接库也可以使用这种方法链接导入库 动态链接方法:使用这种方式的程序并不在一开始就完成动态链接,而是直到真正调用动态库代码时,载入程序才计算(被调用的那部分)动态代码的逻辑地址,然后等到某个时候,程序又需要调用另外某块动态代码时,载入程序又去计算这部分代码的逻辑地址,所以,这

  • 在编译Linux程序时,我们经常会看到动态链接和静态链接这两个术语。这两个术语中是我Linux的共享函数库(shared libraries)相关的。共享函数库就象Windows系统里的.dll文件,它里面包含有很多程序常用的函数。为了方便程序开发和减少程序的冗余,程序当中就不用包含每个常用函数的拷贝,只是在需要时调用系统中共享函数库中常函数功能即可。这种方式我们称之为动态链接(Dynamical

  • 大多数在线来源都表明您可以静态链接glibc,但不鼓励这样做;例如centos包repo: glibc静态包包含用于静态链接的C库静态库。你不需要这些,除非你静态链接,这是非常不鼓励的。 这些消息来源很少(或从未)说明为什么这是个坏主意。

  • 问题内容: 我有一个纯Python脚本,我想分发给具有未知Python配置的系统。因此,我想将Python代码编译为独立的可执行文件。 我奔波没有问题。那我跑 哪里给 并给 通过这种方式,我可以获得一个动态链接的可执行文件,该文件可以正常运行。产量 现在,我尝试将选项添加到gcc,但这会导致错误: 我检查了ldd给定的所有共享库是否也都安装为静态库。 那么,这与python3-config提供的选

  • 问题内容: 我试图将静态库(与gcc一起编译)链接到C 程序,但出现了“未定义引用”。我在ubuntu 12.04服务器计算机上使用了gcc和g 版本4.6.3。例如,这是阶乘方法的简单库文件: mylib.h mylib.c 我使用gcc为此mylib.c创建了对象: 再次使用AR实用工具从目标文件创建了静态库: 我用C程序(test.c)和C ++程序(test.cpp)测试了这个库 C和C