Думаю, я не единственный человек, которого мало заботит скорость загрузки операционной системы - по той простой причине, что компьютер выключается крайне редко. В то время, как я не пользуюсь им непосредственно, ящик гудит, ест электричество и попутно качает-раздаёт торренты.
Однако торренты - довольно нерациональное расходование хардварных ресурсов, коли уж они в любом случае есть. Можно ещё немного озадачить железки, чтобы они приносили пользу науке, например.
Наверняка все уже слышали о распределённых вычислениях. Для тех, кто не в курсе, совсем вкратце: большую задачу можно разбить на много мелких и раскидать их по разным компьютерам в Сети. Получается гигантский (ну или не очень) кластер, который может делать что-то полезное. Ну, или не делать.
Одним из проектов университета Беркли является поиск вероятных внеземных сигналов. Для этого нужно проанализировать гигантские объёмы данных, что не под силу даже современным супермейнфреймам. Тут в игру вступает сообщество - отдав немножко вычислительных ресурсов компьютера (главным образом во время простоя) можно конкретно помочь такой благородной цели. Вообще, кроме поиска внеземного разума, проектов, использующих cloud computing вагон и тележка, и каждый может найти то, во что ему интересно внести свою лепту.
Для большинства из этих проектов используется программная платформа Boinc, которая от версии к версии всё больше обрастает разным полезным функционалом. По аналогии с распараллеливанием на разные компьютеры, при наличии нескольких ядер/процессоров поступившую задачу можно разделить на разные потоки. Одним из наиболее инновационных решений для расчётов является технология от Nvidia под названием
CUDA. Если быть кратким, то она позволяет использовать вычислительные мощности процессоров видеокарты в пользовательских приложениях, а не только при использовании DirectX/OpenGL API.
Процессоры видеокарт довольно "узкоспециализированы" - они заточены под выполнение лишь некоторых математических преобразований, используемых для 3D-рендера. Однако многие эти же преобразования используются в упомянутых научных вычислениях, что может дать значительный прирост в скорости обсчёта и обработки данных. Эти же алгоритмы могут быть использованы, кстати, для сжатия видео тем же h264-кодеком - и этот подход предоставляет впечатляющие результаты. По сравнению даже с топовыми процессорами средняя видеокарта при полном использовании её процессоров даёт прирост вплоть до 10-20 раз! Это достигается не только "заточенностью" шейдеров видеокарты, но и большим её количеством - в моей далеко не самой новой
Geforce 9600GT таких процессоров 64, причём каждый из них - многопоточный, и может брать на себя до 512 потоков. Таким образом, использование CUDA для многих сложных математических расчётов имеет более чем очевидную причину.
Ну, теперь от теории перейдём к сухой практике. Я запускал boinc-client на Ubuntu 9.04 x86-64, и хоть и дистрибутив и является самым популярным, "с полпинка" это дело не завелось.
Итак, первое, что нужно установить - это последние бета-драйвера от nvidia (на момент написания - 190.32). Подключение соответствующего репозитория описано в предыдущей записи этого блога, единственное, что хочу подчеркнуть - ставить нужно именно 190-ю версию драйвера, а не стабильную 185-ю.
После установки драйверов мы имеем поддержку CUDA (а также бонусом vdpau). Следущее, что нужно поставить
отсюда - CUDA Toolkit и (опционально, но я рекомендую) CUDA SDK. Установка очевидна, так что вдаваться в подробности не буду. Жаль, конечно, что всё это инсталлируется из .sh-файлов, а не идеологически верных .deb-пакетов - надеюсь, скоро этот досадный недочёт исправят, и появится как минимум launchpad-репозиторий с соотв. содержанием.
После установки нужно "дообъяснять" системе, что CUDA есть и функционально - для этого в PATH нужно добавить путь к исполняемым файлам "куды" (по-дефолту /usr/local/cuda/bin), и дописать к LD_LIBRARY_PATH директорию с соответствующими библиотеками (/usr/local/cuda/lib или lib64). Проще всего создать новый .conf-файл в /etc/ld.so.conf.d/. Будьте внимательны, если у вас 64-разрядная система, прописывать нужно именно путь к lib64-директории!
После этого можно установить SDK (от пользователя) и попробовать скомпилировать тамошние примеры - есть интересные штуки, наглядно показывающие преимущества шейдеров над ЦП, ну и заодно можно проверить работоспособность самой технологии.
Итак, если всё вышеперечисленное заработало, можно "завершать операцию". Установка непосредственно boinc предельно проста - разве что я ставил его не из основного репозитория убунты, а из getdeb-а - там он самый свежий и точно "умеет" Cuda, если версия младше, кажется, 6.3, то уже ничего не получится. Ставить нужно только пакеты boinc и boinc-client, ну и boinc-seti-app-seti, если хотите присоединиться именно к поиску
иноплане-тян. Для удобства настройки и использования также рекомендую пакет boinc-manager - он позволит управляться с демоном из гуя.
Несмотря на заявленную поддержку, сразу ничего не заработало, как водится - в логах упрямо пишется, что CUDA not found.
Первое, что нужно сделать - навести симлинк на /usr/local/cuda/lib/libcudart.so в /var/lib/boinc-client/ или, если не помогло, в /usr/lib/boinc-client/. Ну, не забывайте про особенности 64-битных систем - в их случае симлинк наводится на либу из соответствующей директории.
Из-за того, что демон boinc-а запускается под своим, отдельным юзером, возникает довольно неочевидная проблема - пользователь этот не имеет прямого доступа к видеокарточке. Исправить это можно, добавив его в группу video (usermod -a -G video boinc).
Собственно, после этого всё
внезапно должно заработать - об этом довольно очевидно сообщат надписи в логе boinc вида "CUDA devices found" и "Coprocessor: GeForce 9600 GT (1)".
Самое главное во всех этих вычислениях - что мы, собственно, как старикан Вернандский завещал, работаем на ноосферу, а значит - всё одно на эволюцию.
Если заметите какие-то неточности в описании, или возникнут сложности - пишите, попробуем разобраться вместе.