[英]Relocatable Code for a CMake/CUDA shared library
我偶然发现了一些我以前从未遇到过的笨拙的编译错误。 无法共享确切的代码,所以我将呈现一个类似的情况。 我有一个正在开发的共享库,它编译__device__
标记的设备代码。 这些设备函数必须能够被用户编写的__global__
函数使用。 这是一组简化的代码,可重新创建引发的错误:
共享库的源代码: device_function.cu
__device__ int deviceFunction()
{
return 1;
}
用于调用设备 function 的可执行文件的源代码: soure.cu
#include <stdio.h>
__device__ int deviceFunction();
__global__ void globalFunction()
{
printf("%i", deviceFunction());
}
int main()
{
globalFunction<<<1,1>>>();
cudaDeviceSynchronize();
return 0;
}
我尝试使用以下命令编译所有内容的 CMakeLists.txt 文件:
cmake_minimum_required(VERSION 3.21)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR})
project(test)
find_package(CUDA REQUIRED)
enable_language(CUDA)
add_library(device_function SHARED device_function.cu)
add_executable(cu_test source.cu)
target_link_libraries(cu_test device_function)
在(尝试)编译后,我收到了这样的问候:
[main] Building folder: relocatable-code
[build] Starting build
[proc] Executing command: /snap/cmake/current/bin/cmake --build /home/legayone/Documents/research-pathfinding-projects/cuda-programming/relocatable-code/build --config Debug --target all -j 18 --
[build] Consolidate compiler generated dependencies of target device_function
[build] [ 50%] Built target device_function
[build] Consolidate compiler generated dependencies of target cu_test
[build] [ 75%] Building CUDA object CMakeFiles/cu_test.dir/source.cu.o
[build] ptxas fatal : Unresolved extern function '_Z14deviceFunctionv'
[build] make[2]: *** [CMakeFiles/cu_test.dir/build.make:76: CMakeFiles/cu_test.dir/source.cu.o] Error 255
[build] make[1]: *** [CMakeFiles/Makefile2:111: CMakeFiles/cu_test.dir/all] Error 2
[build] make: *** [Makefile:91: all] Error 2
[build] Build finished with exit code 2
我试过的我已经搜索了 web 并找到了最终归结为CUDA_SEPARABLE_COMPILATION ON
或某种形式的解决方案-rdc=true
或-dc
。 我尝试在device_function
和cu_test
的 3 种可能组合中添加可分离编译,并且我对-rdc=true
和-dc
做了同样的事情,我先试了一个,然后试了另一个,然后两个都试了。 这是我将-rdc=true
和-dc
添加到以下内容的格式:
target_compile_options(cu_test PRIVATE $<$<COMPILE_LANGUAGE:CUDA>:-c "-lcudart -lcudadevrt -lcuda -rdc=true">)
〜或〜
target_compile_options(device_function PRIVATE $<$<COMPILE_LANGUAGE:CUDA>:-c "-lcudart -lcudadevrt -lcuda -rdc=true">)
我的问题我错过了什么或我做错了什么? 我真的希望任何可执行文件都能够将共享库device_function
链接到它,并让它能够在该共享库中调用 function。 在这适用的实际库中,当然有标题,但我已经整理了包含:) 它只是链接。
我怀疑问题是我怀疑问题是代码可重定位性。 我知道必须做一些特殊的事情才能允许来自不同编译单元的设备功能被可执行文件(或另一个库)使用? 但那些东西是什么,我如何在 CMake 中做到这一点?
一种解决方案
因此,似乎不可能由__global__
函数从单独的编译单元调用基于共享库的__device__
函数。 我应该注意到,有大量相互矛盾的信息,特别是来自这篇文章: https://developer.nvidia.com/blog/building-cuda-applications-cmake/ ,这似乎表明这是可能的,但是它提出的解决方案不起作用。 这对我有用:
CMakeLists.txt
cmake_minimum_required(VERSION 3.21)
set(CMAKE_CUDA_SEPARABLE_COMPILATION ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
project(test LANGUAGES CXX CUDA)
include(CTest)
add_library(device_function STATIC device_function.cu)
add_library(shared_function SHARED shared_device_function.cu)
target_link_libraries(shared_function PUBLIC device_function)
add_executable(cu_test source.cu)
target_link_libraries(cu_test shared_function)
什么有效
什么不起作用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.