如何解决在获取 OptiX 的 CUDA 上下文时未定义对 `cuCtxGetCurrent` 的引用
我正在尝试学习如何将 OptiX 实现到我的 C++ 项目中。第一步是使用 cuCtxGetCurrent(&some_CUcontext_variable)
获取当前的 CUDA 上下文,但是我收到一个编译时错误,提示我对 cuCtxGetCurrent
进行了未定义的引用。
这是我所拥有的:
- 我正在关注 this repo 中的代码以了解 OptiX,我正在使用示例 2(您可以从中获取 CUDA 上下文)。
- 在我的代码 (
main.cpp
) 中,我包含了cuda_runtime.h
、device_launch_parameters.h
、optix.h
和optix_stubs.h
,但我仍然在编译时间。 - 有趣的是,我的 IDE,JetBrains 的 CLion,没有内联显示任何未定义的参考错误/警告。错误仅在我编译时出现。
- 在我的
CMakeLists.txt
中,我使用find_package(CUDAToolkit REQUIRED)
来获取 CUDA。然后我使用target_link_libraries{ ... CUDA::cudart}
在 CUDA 中链接。
我相信此错误与链接器有关,因此我假设我的 CMakeLists 中缺少某些内容,但我不知道是什么。请告诉我如何解决这个问题!
提前感谢您的帮助!
更新 #2:已解决
这样的时刻让我感到很沮丧:我所做的一切都是将 cuda
字面意义地放在我的目标链接库中。不是-lcuda
或CUDA::cuda
,只是cuda
。以某种方式链接到驱动程序中,现在看起来正在编译。
[旧的,但保留以供参考] 更新 #1:这是我的 CMakeLists.txt
。
很抱歉我的原始帖子中缺少代码。我试图避免粘贴大量的任意代码。
cmake_minimum_required(VERSION 3.17)
project(My_Project_Name CUDA CXX)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_MODULE_PATH
"${CMAKE_SOURCE_DIR}/cmake"
${CMAKE_MODULE_PATH})
find_package(CUDAToolkit REQUIRED)
find_package(OptiX REQUIRED VERSION 7.0)
add_executable(
${PROJECT_NAME}
main.cpp [and other cpp and cu files])
# For project
set_target_properties(
${PROJECT_NAME}
PROPERTIES
CUDA_SEPARABLE_COMPILATION ON
)
target_compile_options(
${PROJECT_NAME}
PRIVATE
$<$<COMPILE_LANGUAGE:CUDA>:
-arch=sm_61
-gencode arch=compute_52,code=sm_52>
)
target_include_directories(
${PROJECT_NAME}
PRIVATE
include
${OptiX_INCLUDE}
)
target_link_libraries(
${PROJECT_NAME}
PRIVATE
CUDA::cudart
CUDA::cublas
)
解决方法
正如@talonmies 所指出的,CUDA 有两个(官方)主机端 API:“CUDA Runtime API”和“CUDA Driver API”;您可以阅读它们之间的区别here。
您提到了与 Runtime API 相关的文件和 CMake 标识符:cuda_runtime.h
、CUDA::cudart
。但是 - “CUDA 上下文”是驱动程序 API 的概念,cuCtxGetCurrent()
等是驱动程序 API 调用。
具体来说,“未定义的引用”确实是链接器错误。在您的情况下,您需要与 CUDA 驱动程序链接。作为一个库,在 Linux 系统上,它被称为 libcuda.so
。为此,对于名为 ERPT_Render_Engine
的可执行文件,您需要添加以下命令:
target_link_libraries(ERPT_Render_Engine cuda)
我还要说你上面列出的 CMakeLists.txt
看起来很奇怪,因为它定义了一个不存在的目标的依赖项 - 项目名称;您的相关目标是您的可执行文件。
此外 - CUDA 上下文不仅仅因为您创建流程而存在。在使用 cuCtxGetCurrent()
获取当前上下文之前,您需要初始化驱动程序、创建上下文并使其成为当前上下文 - 或者让其他东西为您执行此操作(例如库)。
最后,如果您有兴趣,我将开发一个 C++ 包装库,它涵盖了驱动程序和运行时 API 的(大部分)主机端功能。一些示例代码:
cuda::initialize_driver();
(cuda::device::count() > 0) or die_("No CUDA devices on this system") {}
auto device_id = cuda::device::default_device_id;
auto device = cuda::device::get(device_id);
auto context = cuda::context::create(device);
//etc. etc.
但同样 - 您真的不必使用它,它只是可选的并且仍在 dvelopmenr 中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。