Примечание: предыдущее название было «Как я могу скомпилировать программу 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()