0

我正在尝试学习如何在我的 C++ 项目中实现 OptiX。第一步是获取当前的 CUDA 上下文cuCtxGetCurrent(&some_CUcontext_variable),但是我收到一个编译时错误,说我对cuCtxGetCurrent.

这是我所拥有的:

  • 我正在关注此 repo中的代码以了解 OptiX,并且我在示例 2 中(您可以在其中获得 CUDA 上下文)。
  • 在我的代码 ( main.cpp) 中,我包含了cuda_runtime.hdevice_launch_parameters.hoptix.hoptix_stubs.h,但在编译时我仍然收到错误消息。
  • 有趣的是,我的 IDE,JetBrains 的 CLion,没有显示任何未定义的参考错误/警告内联。错误仅在我编译时出现。
  • 在我的CMakeLists.txt,我曾经find_package(CUDAToolkit REQUIRED)得到 CUDA。然后我用来target_link_libraries{ ... CUDA::cudart}链接CUDA。

我相信这个错误与链接器有关,所以我假设我在我的 CMakeLists 中遗漏了一些东西,但我不知道是什么。请让我知道如何解决此问题!

提前感谢您的帮助!


更新 #2:已解决

正是这样的时刻让我大吃一惊:我所要做的就是将cuda我的目标链接库放入其中。不是-lcudaCUDA::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
)
4

1 回答 1

1

正如@talonmies 所说,CUDA 有两个(官方)主机端 API:“CUDA Runtime API”和“CUDA Driver API”;你可以在这里阅读它们之间的区别。

您提到了与运行时 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.

但是再一次 - 你真的不必使用它,它只是可选的并且仍在开发中。

于 2021-02-19T15:50:49.550 回答