【问题标题】:Cannot generate a safe linker search path CUDA无法生成安全的链接器搜索路径 CUDA
【发布时间】:2020-05-28 23:41:10
【问题描述】:

我想向我的 CUDA 应用程序添加对 NVidia 监控库的调用。但是,nvidia-ml 库不是 CUDA 的一部分。它是设备驱动程序的一部分。尽管如此,CUDA 还是为它提供了存根。这似乎使 CMake 感到困惑。我正在寻找一种方法来解开 CMake 的困惑。

根据我的导师的建议,我创建了一个FindNvidiaML.cmake 文件

# set the base location
set(NVIDIA_ML_PATHS
  /usr/lib64
  /usr/lib64/nvidia
)

#  Look for the library
find_library( NVIDIA_ML_LIBRARY
              NAMES
                nvidia-ml
              HINTS
                ${NVIDIA_ML_PATHS}
)

#  Make sure valid
if( NVIDIA_ML_LIBRARY )
    SET( NVIDIA_ML_FOUND TRUE )
endif()

NVIDIA_ML_LIBRARY 的值为 /usr/lib64/libnvidia-ml.so

我的主要 CMakeLists.txt 文件有这部分

  find_package(NvidiaML REQUIRED)

此处说明的具体产品 CMakeLists.txt 文件如下所示:

set(myTarget DspTests)
add_executable( ${myTarget}
               Global_unittest.cpp

               nvSMI_unittest.cpp

               BlackmanHarris_unittest.cpp
               BlackmanHarrisCU_unittest.cu

               FFT_unittest.cu

               FindPeakKernel_unittest.cu

               )

target_include_directories( ${myTarget} SYSTEM PRIVATE
                            ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}
)

set_target_properties( ${myTarget} PROPERTIES
                       CUDA_SEPARABLE_COMPILATION ON
                       POSITION_INDEPENDENT_CODE ON
)


target_link_libraries( ${myTarget}
                       dsp cufft ${NVIDIA_ML_LIBRARY}
                       gtest gtestApp
                )

add_gtest( ${myTarget} )

CMake 输出:

CMake Warning at dsp/unit/CMakeLists.txt:13 (add_executable):
  Cannot generate a safe linker search path for target DspTests because files
  in some directories may conflict with libraries in implicit directories:

    link library [libnvidia-ml.so] in /usr/lib64 may be hidden by files in:
      /usr/local/cuda/targets/x86_64-linux/lib/stubs

  Some of these libraries may not be found correctly.

搜索,我找到了

$ find /usr/ -name 'libnvidia-ml*' -ls 2>/dev/null
51097542 1512 -rwxr-xr-x   1 root     root      1545404 Jun 11  2019 /usr/lib/libnvidia-ml.so.418.67
51102213    0 lrwxrwxrwx   1 root     root           22 Jun 11  2019 /usr/lib/libnvidia-ml.so.1 -> libnvidia-ml.so.418.67
51102218    0 lrwxrwxrwx   1 root     root           17 Jun 11  2019 /usr/lib/libnvidia-ml.so -> libnvidia-ml.so.1
34907591 1536 -rwxr-xr-x   1 root     root      1569688 Apr  6  2019 /usr/lib64/libnvidia-ml.so.418.67
34907590    0 lrwxrwxrwx   1 root     root           22 Jun 11  2019 /usr/lib64/libnvidia-ml.so.1 -> libnvidia-ml.so.418.67
34972797    0 lrwxrwxrwx   1 root     root           22 Jun 11  2019 /usr/lib64/libnvidia-ml.so -> libnvidia-ml.so.418.67
17152088   32 -rwxr-xr-x   1 root     root        31808 Apr 24  2019 /usr/local/cuda-10.1/targets/x86_64-linux/lib/stubs/libnvidia-ml.so

这不是 CMake cannot generate a safe linker search path - yocto 2.4CMake Warning: Cannot generate a safe linker search path for target 的重复,尽管症状相似。可能是CMAKE - runtime library hidden files的副本

尽管有警告,但代码确实正确链接到 /usr/lib64 中的库,并且确实可以运行。所以这里没有错误条件。但是,输出中的这种详细警告肯定会产生错误的错觉。鉴于 NVidia 驱动的安装路径,以及构建 CUDA 所需的搜索路径,以及实际的重复库,这种情况似乎是不可避免的。

问题是,我怎样才能使这个警告静音?

环境:

CentOS 7.3 GCC 7.3 CUDA 10.1 CMake 3.13.5

【问题讨论】:

  • 总是应该链接工具包中库的存根版本,而不是文件系统中的实时版本
  • 我想知道存根。你能详细说明一下吗?
  • 存根在那里,因此您可以在没有 GPU 的系统上构建并构建与驱动程序版本无关的应用程序。如果您链接到库的驱动程序版本,那么这就是将内置到可执行文件中的依赖项。如果您使用存根,则不会。 nvml 在这方面并不是唯一的。整个驱动程序 API 是相同的,我建议对可能已经内置在 CMake 中的 nvml 使用相同的逻辑。我不使用它,所以我无法进一步帮助你如何做到这一点

标签: cmake cuda nvidia


【解决方案1】:

解决方案是删除我的FindNvidaML.cmake 文件。事实证明,我的大师的知识已经过时了,CMake 中对 CUDA 的内在支持,再加上 CUDA 10.1 中的存根,使得这种方法已经过时了。

正如其他类似问题的答案所指出的那样,警告描述的是代码链接到一个库的情况(在这种情况下,明确地/usr/lib64/libnvidia-ml.so)但在运行时可能想要推断出不同的库(在/usr/local/cuda/targets/x86_64-linux/lib/stubs)

将目标 CMakeList.txt 文件更改为更通用会导致构建成功且不会发出警告:

target_link_libraries( ${myTarget}
                       dsp cufft nvidia-ml
                       gtest gtestApp
                )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 2011-04-19
    • 2015-05-02
    • 2019-10-13
    相关资源
    最近更新 更多