Невозможно создать безопасный путь поиска компоновщика CUDA - PullRequest
2 голосов
/ 29 мая 2020

Я хочу добавить вызовы библиотеки мониторинга NVidia в свое приложение CUDA. Однако библиотека 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)

Указанный здесь c продукт, проиллюстрированный здесь файл 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 не может создать безопасный путь поиска компоновщика - yocto 2.4 или Предупреждение CMake. Невозможно создать безопасный путь поиска компоновщика для целевого объекта , хотя симптомы аналогичны. Возможно, это дубликат CMAKE - скрытых файлов библиотеки времени выполнения

Несмотря на предупреждение, код правильно связывается с библиотекой в ​​/ usr / lib64 и запускается. Таким образом, здесь нет ошибки. Однако такое подробное предупреждение в выводе, безусловно, создает иллюзию ошибки. Учитывая путь установки драйвера NVidia и пути поиска, необходимые для построения CUDA, и фактические дублирующиеся библиотеки, условие кажется неизбежным.

Вопрос в том, как отключить это предупреждение?

Окружающая среда:

CentOS 7,3 г cc 7,3 CUDA 10.1 CMake 3.13.5

1 Ответ

1 голос
/ 29 мая 2020

Решение - удалить мой FindNvidaML.cmake файл. Оказывается, знания моего гуру устарели, а поддержка intrisi c для CUDA в CMake вкупе с заглушками в CUDA 10.1 делают этот подход устаревшим.

Как указывают ответы на другие похожие вопросы, предупреждение: описывая случай, когда код был связан с одной библиотекой (в данном случае явно /usr/lib64/libnvidia-ml.so), но во время выполнения может потребоваться вывести другую библиотеку (найденную в /usr/local/cuda/targets/x86_64-linux/lib/stubs)

Изменение цели CMakeList.txt файл будет более общим c приведет к успешной сборке без предупреждения:

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