Приобщение к CUDA. Серия 3 - установка и настройка Nvidia Toolkit и SDK в Debian
Чтобы иметь возможность создавать новые программы, использующие технологию CUDA,
необходимо установить как минимум NVIDIA CUDA Toolkit, состоящий из набора
фирменных библиотек и фирменного компилятора nvcc. nvcc компилирует код,
непосредственно исполняющийся на видеокарточке.
Крайне желательно установить ещё и NVIDIA CUDA SDK, в котором содержится немало
готовых примеров с исходными текстами, имеющими ценность как для изучения
программирования для CUDA, так и представляющими самостоятельный интерес для
встраивания в свои программы. Надо только не забывать внимательно читать
условия лицензии, носящей схожий с BSD смысл, но имеющей свои особенности.
И Toolkit и SDK свободно доступны на сайте
Nvidia в
разделе
Get Cuda
Перед установкой, в целях уменьшить количество возможных вопросов, крайне
желательно скачать и внимательно прочитать файлы:
CUDA_Toolkit_Release_Notes.txt и
CUDA_SDK_release_notes_linux.txt.
Предварительная подготовка
Итак задача: на 64-битную систему Debian Lenny (Testing) по состоянию на начало
июня этого года необходимо поставить Nvidia Toolkit, SDK, откомпилировать и запустить
примеры из SDK.
На сайте Nvidia предлагается выбор различных пакетов для разных дистрибутивов.
Debian'а среди них нет, поэтому я выбрал пакет для Ubuntu 7.04 x86_64 как
наиболее близкий к Debian'у. Обобщая свой опыт и результат поиска информации
по разным форумам, могу сказать следующее.
Перед установкой надо убедиться, что в системе установлены:
- драйвера 169.09 или более старшие. Причём я находил намёки, хотя и не
проверял, что установка вместо оригинальных пакетов с драйверами от Nvidia,
устанавливаемых из репозиториев дистрибутивов, может привести к проблемам
- gcc-4.1. Для Nvidia Toolkit нужна именно версия 4.1, если стоит другая
можно, не удаляя других версий, дополнительно поставить gcc-4.1. Остальные
два пакета нужны для компиляции примеров в SDK
- пакет build-essential. Вообще-то он нужен для сборки deb-пакетов, но похоже
содержит ещё что-то полезное для сборки и без него кажется компиляция правильно
не работает компиляция SDK
- пакет libglut3-dev, по зависимостям вытягивает freeglut3-dev.
К сожалению, в компиляторе nvcc жёстко прописан вызов именно /usr/bin/gcc ,
поэтому правок Makefile и прочих конфигурационных файлов недостаточно для
правильной работы. Можно вручную с помощью ln -s создать нужные символические
ссылки /usr/bin/gcc (а также g++ и cpp) на файлы версии 4.1, но я использовал
для этой цели механизм update-alternatives, который позволяет централизованно
управлять символьными ссылками, в том числе и группами ссылок.
$sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.1 413 --slave /usr/bin/g++ g++ /usr/bin/g++-4.1 --slave /usr/bin/cpp cpp /usr/bin/cpp-4.1
$sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.2 424 --slave /usr/bin/g++ g++ /usr/bin/g++-4.2 --slave /usr/bin/cpp cpp /usr/bin/cpp-4.2
Теперь командой
$sudo update-alternatives --config gcc
можно выбрать нужную версию gcc
Есть 2 альтернатив, которые предоставляют `gcc'.
Выбор Альтернатива
-----------------------------------------------
1 /usr/bin/gcc-4.1
*+ 2 /usr/bin/gcc-4.2
Нажмите enter, чтобы сохранить значение по умолчанию[*], или введите выбранное число: 1
Используется `/usr/bin/gcc-4.1' для предоставления `gcc'.
Теперь gcc -v показывает, что используется версия 4.1
Маленькое пояснение: командами update-alternatives для группового
наименования gcc устанавливается ссылка /usr/bin/gcc, указывающая на одну из
альтернатив /usr/bin/gcc-4.1 имеющую приоритет 413 или /usr/bin/gcc-4.2 с
приоритетом 424, каждая из которых имеет подчинённые групповые наименования
g++ и cpp с соответствующими ссылками, изменяющимися одновремённо с изменением
основной gcc. То есть версии g++ и cpp меняются одновремённо с gcc.
Сразу автоматически устанавливается версия с большим приоритетом, в качестве
которого был выбран номер версии. В дальнейшем можно легко переключать версии.
Установка и настройка Nvidia Toolkit
После запуска на исполнение файла NVIDIA_CUDA_Toolkit_1.1_Ubuntu7_x86_64.run
установщик, являющийся фактически просто самораспаковывающимся архивом, спросит
каталог для распаковки содержимого. В указанном каталоге будет автоматически
создан подкаталог cuda со всем содержимым.
По умолчанию предлагается путь /usr/local, если его выбрать Toolkit будет
установлен в /usr/local/cuda. Я советую не менять путь по умолчанию, иначе в
дальнейшем частенько придётся править конфигурационные файлы в проектах в
которых этот путь жёстко задан.
Я вначале этого не понял и установил в итоге в /usr/share/cuda
Затем, как написано в Release notes, необходимо поместить в PATH каталог bin
из cuda, то есть, в моём случае, /usr/share/cuda/bin и добавить библиотеки
из /usr/share/cuda/lib в путь для поиска библиотек при компиляции программ.
В SDK Release Notes для этой цели советуют добавить в bash_profile строки
Код:
PATH=$PATH:/bin
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib
export PATH
export LD_LIBRARY_PATH
или для библиотек модифицировать /etc/ld.so.conf.d и выполнить ldconfig
Я сделал немножко по-другому. В .bashrc появилась строчка
export PATH="$PATH:/usr/share/cuda/bin"
а в каталоге /etc/ld.so.conf.d/ добавился файл cuda.conf
(в Debian'е в /etc/ld.so.conf уже прописан include /etc/ld.so.conf.d/*.conf)
Код:
# NVIDIA CUDA v1.1 support
/usr/share/cuda/lib
и вызвал ldconfig для построения кэша и привязок для библиотек.
Установка и компиляция Nvidia CUDA SDK
Также как и Toolkit файл NVIDIA_CUDA_SDK_1.1_Linux.run является фактически
самораспаковывающимся архивом, чьё содержимое предлагается по умолчанию
установить внутри домашнего каталога, создав каталог NVIDIA_CUDA_SDK и
всё распаковав туда. Именно туда я всё и поставил.
Для успешной компиляции пришлось только подправить файл
~/NVIDIA_CUDA_SDK/common/common.mk заменив в строчке
CUDA_INSTALL_PATH ?= /usr/local/cuda слово local на share, из-за
установки Toolkit не в каталог по умолчанию.
Теперь можно перейти в каталог ~/NVIDIA_CUDA_SDK/ и откомпилировать
все примеры. Команда make emu=1 соберёт в каталоге
~/NVIDIA_CUDA_SDK/bin/linux/emurelease программы, работающие в режиме эмуляции
CUDA, т.е., без реального использования процессора видеокарточки, а make без
параметров соберёт в каталог NVIDIA_CUDA_SDK/bin/linux/release реально
использующие ресурсы видеокарточки.
Пара скриншотов
На данном скриншоте изображена визуализация расчёта программой nbody задачи
движения N (здесь N=16384) тел в гравитационном поле (и не только гравитационном).
Скриншот не видео и не передаёт движение, но здесь изображено рассчитываемое движение
жидкости из 512x512 элементов. Можно мышкой как бы дать толчок, в том числе
закрутить жидкость и наблюдать перемещающие вихри.
(c)