Почему программа CUDA работает с CMake «FIND_PACKAGE», а не с «LANGUAGES CUDA»? - PullRequest
0 голосов
/ 11 января 2019

Примечание: предыдущее название было «Как я могу скомпилировать программу CUDA с CMake, не используя FIND_PACKAGE?». Отредактировано, чтобы прояснить, в чем заключается ключевая проблема.

При использовании CMake и CUDA предложенным способом, без FIND_PACKAGE, он компилируется, но когда я запускаю полученный бинарный файл, я получаю следующую ошибку:

CUDA error: CUDA driver version is insufficient for CUDA runtime version

Однако, если я вручную скомпилирую с nvcc, или если я использую FIND_PACKAGE в cmake, он работает нормально. Примеры CUDA компилируются и запускаются также. Я понимаю, что FIND_PACKAGE(CUDA) устарела, потому что cuda теперь является первоклассным языком cmake. В чем разница между двумя разными подходами и как мне заставить его работать без использования пакета поиска?


Подробности:

main.cu:

#include <iostream>

__global__ void helloGPU() {
    printf("Hi globe\n");
}

int main() {
    helloGPU<<<1,2>>>();
    cudaDeviceSynchronize();
    cudaError_t error = cudaGetLastError();
    if(error != cudaSuccess)
    {
        printf("CUDA error: %s\n", cudaGetErrorString(error));
        exit(-1);
    }
}

CMakeLists.txt, который работает:

cmake_minimum_required (VERSION 3.10)
find_package(CUDA REQUIRED)
cuda_add_executable(simple main.cu)

CMakeLists.txt, который сломан:

cmake_minimum_required (VERSION 3.10)
project(simplecuda LANGUAGES CXX CUDA)
add_executable(simple main.cu)

Система:

Mac OS High Sierra 10.13.6
Версия драйвера Cuda: 410.130
Версия драйвера графического процессора: 387.10.10.10.40.105
Версия nvcc: 10.0.130
версия clang ++: 9.0.0

Редактировать: почему текущие версии драйверов

В некоторых комментариях предлагались разные версии драйверов. Вот почему у меня есть перечисленные версии:

С драйвером по умолчанию, установленным установщиком CUDA, я получил следующую ошибку при попытке запустить примеры CUDA:

CUDA driver version is insufficient for CUDA runtime version

Такие сайты убедили меня, что использование другой версии драйвера может помочь: (https://devtalk.nvidia.com/default/topic/1027922/cuda-setup-and-installation/-solved-code-35-cudaerrorinsufficientdriver-error-on-mac-version-10-13-2-17c88-with-nvidia-geforce-gt-/).

После некоторых неудачных проб и ошибок я наткнулся на этот скрипт: https://www.tonymacx86.com/threads/nvidia-update-simple-way-to-install-nvidia-web-drivers.244987/

Это автоматически ищет и устанавливает драйвер, как я и получил 387.10.10.10.40.105.

В этой версии впервые сэмплы CUDA работают нормально, вручную компилируя исходники с помощью nvcc works, и работает FIND_PACKAGE. Я относительно уверен, что мои версии драйверов теперь верны. Когда я использую панель настроек NVIDIA Driver Manager для проверки наличия новых версий, он говорит, что у меня самая последняя версия, и согласно http://www.macvidcards.com/drivers.html, у меня правильная версия драйвера.

Редактировать: копаться в командах сборки

Я углубился в то, что делает CMake, используя make VERBOSE=1. Я удалил столько строк и флагов, сколько смог, чтобы получить то же поведение, и упростил пути, каталоги tmp и т. Д. Вот минимальный пример команд для создания двоичного файла, который дает ошибку, взятую из CMake с LANGUAGES CXX CUDA (если я запускаю их в той же папке, что и main.cu, а затем запускаю ./simple, это выдает ошибку CUDA выше):

/Developer/NVIDIA/CUDA-10.0/bin/nvcc  -c main.cu -o main.cu.o
/Developer/NVIDIA/CUDA-10.0/bin/nvcc  -dlink main.cu.o -o cmake_device_link.o
/usr/bin/clang++  main.cu.o cmake_device_link.o -o simple  -L"/Developer/NVIDIA/CUDA-10.0/lib" "/Developer/NVIDIA/CUDA-10.0/lib/libcudart_static.a"

Вот аналогичная минимальная версия команд из CMake с FIND_PACKAGE(CUDA):

/Developer/NVIDIA/CUDA-10.0/bin/nvcc main.cu -c -o main.cu.o -I/Developer/NVIDIA/CUDA-10.0/include
/usr/bin/clang++   main.cu.o  -o simple /Developer/NVIDIA/CUDA-10.0/lib/libcudart_static.a -Wl,-rpath,/usr/local/cuda/lib

Критическая часть, похоже, самый последний флаг, -Wl,-rpath,/usr/local/cuda/lib. Я могу заставить работать неработающую версию CMake, установив переменную окружения:

export LD_LIBRARY_PATH=/usr/local/cuda/lib

или обновив файл CMake следующим образом:

SET_TARGET_PROPERTIES(simple PROPERTIES LINK_FLAGS -Wl,-rpath,/usr/local/cuda/lib)

Что-то сломалось в моей системе, что мне нужно сделать это? Или сломан в cake совместимости CMake на Mac?

Примечание: что-то об Apple и rpaths упоминается в официальном блоге: https://devblogs.nvidia.com/building-cuda-applications-cmake/

Но если я добавлю этот раздел в CMakeLists.txt, это не поможет:

if(APPLE)
  # We need to add the path to the driver (libcuda.dylib) as an rpath, 
  # so that the static cuda runtime can find it at runtime.
  set_property(TARGET simple
               PROPERTY
               BUILD_RPATH ${CMAKE_CUDA_IMPLICIT_LINK_DIRECTORIES})
endif()

1 Ответ

0 голосов
/ 15 января 2019

Я должен не согласиться и согласиться с @MatthieuBrucher:

  • Для CUDA 10 нужны драйверы 410+, у вас 387 для отображения, что совместимо с CUDA 9.0. Кроме того, я не рекомендовал бы смешивать CUDA и версии драйверов дисплея. В Linux и Windows драйвер CUDA автоматически устанавливается вместе с драйвером дисплея, поэтому вы всегда получите хорошую комбинацию.

  • CMake попытается создать небольшую тестовую программу (сгенерированную из /usr/share/cmake-3.10/Modules/CMakeCUDACompilerId.cu.in в Linux) и попытается запустить ее. Вот где вы получите сообщение об ошибке совместимости.

Обновите драйвер дисплея, и все должно работать. Если ваш графический процессор не поддерживается более свежими драйверами (это не относится к Mac), вам придется понизить версию своего драйвера CUDA и инструментария.

Вы можете найти больше информации здесь , особенно в первых двух строках:

Инструментарий CUDA переходит на более быстрый темп выпуска, чтобы предоставлять новые функции, улучшения производительности и исправления критических ошибок. Однако тесная связь времени выполнения CUDA с драйвером дисплея (в частности, libcuda.so - драйвер CUDA в системах Linux), означает, что клиент должен обновить весь стек драйверов для использования новейшее программное обеспечение CUDA (включая компилятор, библиотеки и инструменты).

(выделение добавлено)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...