【发布时间】: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.4 或 CMake 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 使用相同的逻辑。我不使用它,所以我无法进一步帮助你如何做到这一点