CMake+OpenCL+CUDA -> 运行时库可能被隐藏

Posted

技术标签:

【中文标题】CMake+OpenCL+CUDA -> 运行时库可能被隐藏【英文标题】:CMake+OpenCL+CUDA -> runtime library may be hidden 【发布时间】:2021-08-01 16:09:24 【问题描述】:

我正在使用 CMake 3.16,CMakeLists.txt 文件指定了最低 CMake 版本 3.9。在我的文件中,我有:

find_package(CUDA 8.0 REQUIRED)
find_package(OpenCL REQUIRED)
# etc. etc.
target_link_libraries(my_executable
    PRIVATE
    cuda # The NVIDIA CUDA driver API
    $CUDA_LIBRARIES
    OpenCL::OpenCL
    )

现在,在 CMake 生成阶段,我收到错误:


 CMake Warning at CMakeLists.txt:44 (add_executable):
   Cannot generate a safe runtime search path for target my_executable because
   files in some directories may conflict with libraries in implicit
   directories:

     runtime library [libOpenCL.so.1] in /usr/lib64 may be hidden by files in:
       /usr/local/cuda/lib64

   Some of these libraries may not be found correctly.

现在,我确实想要 CUDA 目录中的 libOpenCL.so.1;并且构建确实会生成具有正确依赖关系的可执行文件。我如何告诉 CMake 这个掩码没问题,而不是让它打印警告消息?

注意:在 CMake 中使用 CUDA 已经改变了 3.x 系列版本的很多。因此,在 3.8 之前发生的任何事情都无关紧要,并且在 3.17 中发生了显着变化,之后发生了一些不平凡的变化。关于 3.8 之前和 3.17 或更高版本的答案很好,但不是我需要的。

【问题讨论】:

你能发布 CMake 配置步骤的完整输出吗?在我看来,您安装了两个不兼容的 OpenCL 副本,它正在寻找系统范围的副本,而不是 cuda 供应的副本。 @AlexReinking:我可能会在周四完成。现在我要说的是,将某种面向 CPU 的 OpenCL 版本安装为 OS 分发包的一部分,然后安装一个带有自己的 OpenCL 的独立安装的 CUDA 版本是很常见的。 IIRC,不同的 OpenCL 平台应该以某种方式相互配合,以便您可以在其中进行选择,而不管您链接的是哪个平台,但我不确定它如何/是否有效。 您可以尝试将OpenCL_ROOT 设置为/usr/local/cuda @AlexReinking:我个人可以这样做,但不能指望建立我的图书馆的人这样做。即使没有该设置,我也需要 CMakeLists.txt 在没有这些警告的情况下工作。 【参考方案1】:

我知道这不能准确地回答您的问题,但是从 CMake 3.17+ 开始,CUDA OpenCL 库由 FindCUDAToolkit 模块加载。它是这样使用的:

cmake_minimum_required(VERSION 3.17)
project(my_proj LANGUAGES C CXX CUDA)

find_package(CUDAToolkit 8.0 REQUIRED)

# ...

target_link_libraries(
  my_executable
  PRIVATE
    CUDA::cuda_driver
    CUDA::cudart
    CUDA::OpenCL
)

我希望这个答案能帮助其他正在使用最新 CMake 的读者,因为任何适用于 3.9 的答案都不会那么好。

【讨论】:

这不能回答我的问题,因为在 CMake 中处理 CUDA 的方式在 v3.17 前后发生了显着变化(在 3.8 的最后一次重大变化之后)。现在确实好多了,但我需要在他们的发行版中支持使用旧 CMake 版本的用户。 就像我在回答中所说的那样,“我知道这不能准确回答您的问题”。它确实回答了您的问题的一个轻微变体,您的最低版本是 3.17 而不是 3.9。 ... 但是当您可以find_package(CUDAToolkit) 时,这不是问题;在这种情况下,没有用户需要我们的指导,因为问题不会出现。 ...但是使用新版本 CMake 的人可能不知道 FindCUDAToolkit,因为那里有 ocean 的过时 CMake 信息。例如,查看本网站上的“新”CMake 问题,并注意有多少(不)使用导入的目标。【参考方案2】:

正如@AlexReinking 在评论中所建议的那样,您可以通过向 CMake 提供有关您要使用哪个 OpenCL 位置的(强)提示来避免此警告。在运行 CMake 之前,将您的 OpenCL_ROOT 环境变量设置为 /usr/local/cuda;对于高于 3.12 的 CMake 版本,find_package() 命令将使用该变量,如果可能,更愿意将 OpenCL 定位在那里 - 并且不会警告您有关替代位置。

【讨论】:

以上是关于CMake+OpenCL+CUDA -> 运行时库可能被隐藏的主要内容,如果未能解决你的问题,请参考以下文章

以前听老人说在n卡上想跑起来opencl程序必须先安装cuda,我没装cuda只安装了nvidia的显卡驱动,结果配置

GPU 中的并行性 - CUDA / OpenCL

GPGPU、OpenCL、CUDA、ATI 流

同一 GPU 上的 OpenCL 和 CUDA 内核

CMake 检测到错误版本的 OpenCL

无法在 GeForce 540M 上运行 CUDA 或 OpenCL