Неграфические вычисления на видеокарте (NVIDIA CUDA и AMD Stream)
История появления
Первые робкие попытки использования ресурсов видеокарт для неграфических вычислений (в основном для математических расчётов) были предприняты ещё в конце прошлого века задолго до их официального внедрения компаниями NVIDIA и AMD (ATI). Но ощутимого распространения эта технология не получила, так как возможности графических процессоров на тот момент были весьма ограничены, да и точность вычислений оставляла желать много лучшего.
Переломным моментом можно считать выход видеокарт на чипах NV30 (NVIDIA GeForce FX) и R300 (AMD (ATI) Radeon 9500 и выше) в 2002-2003 годах. В них была реализована программируемая шейдерная архитектура второй версии, точность вычислений значительно повысилась, что заметно расширило область применения. Эта новая и стремительно растущая технология получила название GPGPU (General-purpose computing on graphics processing units - "вычисления общего назначения на графических процессорах").
Ещё одну ключевую роль сыграло появление компилятора BrookGPU. До его создания разработчикам приходилось получать доступ к ресурсам видеокарты через графические API OpenGL или Direct3D, что значительно усложняло процесс программирования, так как требовало специфических знаний - приходилось изучать принципы работы с 3D-объектами (шейдерами, текстурами и т. п.). Это явилось причиной весьма ограниченного применения GPGPU в программных продуктах и мешало её широкому распространению. BrookGPU стал этаким "переводчиком", при его использовании надобность в знаниях 3D-программирования практически отпала - вычислительные мощности видеокарт теперь были легко доступны программистам в виде дополнительного сопроцессора для параллельных расчётов.
Во многом благодаря BrookGPU компании NVIDIA и AMD (ATI) обратили внимание на зарождающуюся технологию произвольных вычислений на графических процессорах, тем более функционирующую непосредственно на видеокартах, ими же и произведённых. Началась разработка собственных реализаций, обеспечивающих прямой и более прозрачный доступ к вычислительным блокам 3D-ускорителей, в разработке которых приняли участие некоторые инженеры, создававшие компилятор BrookGPU.
Необходимое оборудование, принцип работы
Одновременно с выходом видеокарт серий NVIDIA GeForce 8 и AMD (ATI) Radeon X1900 / HD 2000 были официально представлены собственные реализации GPGPU - CUDA у NVIDIA и Stream у AMD (ATI). Эти платформы программно несовместимы между собой (в CUDA используется язык Cg, а в Stream сначала использовался Close To Metal, затем OpenCL), но принцип действия один и тот же. Если кратко, то заключается он в том, что графический ускоритель может одновременно обрабатывать огромное количество потоков данных (вплоть до нескольких тысяч), используя встроенные в него наборы инструкций. Если требуется одинарная точность вычислений, то скорость их выполнения может возрасти в десятки и даже сотни раз по сравнению с любым центральным процессором x86, если же требуется двойная точность, то прирост уже не столь впечатляющ, но всё же иногда может достигать нескольких десятков раз.
Видеокарта NVIDIA GeForce 9800 GT с поддержкой CUDA
Для функционирования NVIDIA CUDA необходима видеокарта серии GeForce 8000 или выше, причём их количество в персональном компьютере может достигать шести (существуют материнские платы с необходимым числом разъёмов PCI Express x16), которые к тому же могут быть двухпроцессорными. Только вот есть сомнения, что кто-то будет собирать такие монстроподобные кластеры для домашнего применения.
Также выпускаются специализированные ускорители Tesla, предназначенные исключительно для неграфических вычислений. Варианты Tesla для рабочих станций отличаются от видеокарт большим количеством памяти (вплоть до шести гигабайт) и наличием только одного видеовыхода.
Ускоритель GPGPU Tesla C2070 с поддержкой CUDA
Для функционирования AMD (ATI) Stream необходима видеокарта серии Radeon HD 2000 или выше, как и у CUDA, их количество может достигать шести. Специализированные ускорители от AMD (ATI) для неграфических вычислений называются FireStream, оснащаются памятью вплоть до четырёх гигабайт и тоже имеют один видеовыход.
Ускоритель GPGPU AMD FireStream 9270 с поддержкой Stream
Практическое применение
Существует очень большое количество приложений, использующих GPGPU, но многие из них относятся к профессиональному и научному узкоспециализированному программному обеспечению. Можно с уверенностью предположить, что мало кому придёт в голову заняться на домашнем компьютере вычислениями гидрогазодинамики, поиском нефти или газа.
Одним из самых распространённых применений GPGPU в домашних условиях является ускорение физических процессов в играх (и не только) через движки PhysX (NVIDIA CUDA) и Bullet Physics (AMD (ATI) Stream), хотя второй на данный момент куда менее распространён. Также большую популярность получили проекты распределённых вычислений, цели которых простираются от поиска радиосигналов внеземного разума (SETI@home) до исследования причин возникновений болезней человека (Folding@home). Многие клиентские программы отлично распараллеливают полученные для обработки задания и активно используют вычислительные ресурсы видеокарт, то есть любое количество установленных в системе графических процессоров без работы не останутся.
Также применительно к домашнему использованию вычислительные возможности GPGPU используются в программах для видеотрансляций в HD-качестве (распознавание объектов в реальном времени), шифровании и дешифровании данных (например, можно восстановить забытый пароль от какого-либо документа), обработки видео (в том числе его кодирования и декодирования) и звука сложными фильтрами, а также некоторых других.
Тестирование, заключение
И всё же какие преимущества эта технология даёт на практике? Рассмотрим их на примере кодирования относительно небольшого видеоролика в программе CyberLink PowerDirector 9, в которой имеется поддержка и CUDA, и Stream. Кодировка осуществлялась из FullHD-формата (H.264, 1080p) в SD-формат (H.264, 480p) с применением некоторых фильтров.
При тестировании использовалась следующая конфигурация компьютера:
- процессор: AMD Phenom II X4 955 3200 МГц;
- материнская плата: ASRock A770DE AM2+;
- оперативная память: Hynix DDR2 4 x 2048 Гб PC2 8500 1066 МГц (в двухканальном режиме);
- видеокарта: AMD Radeon HD 4890 1024Мб DDR5 PCI Express 2.0;
- жёсткий диск: 2 x Seagate 7200.10 160 Гб SATA2 (320 Гб в режиме RAID 0).
Результаты представлены на следующем графике (меньше - лучше):
Прирост при использовании AMD (ATI) Stream по сравнению с далеко не самым маломощным процессором составил впечатляющие 360 процентов. Если бы кодировался не небольшой ролик, а полнометражный фильм, то выигрыш по времени был бы куда более ощутим.
Может возникнуть вопрос о том, что же всё-таки лучше - NVIDIA CUDA или AMD (ATI) Stream? Однозначного ответа нет. По личному опыту в разных приложениях прибавка производительности может сильно отличаться - где-то быстрее CUDA, где-то Stream. Даже в одной и той же программе изменение настроек может сделать одну технологию быстрее другой, и наоборот.
И хотелось бы надеяться, что в ближайшем будущем технологии вычислений общего назначения на графических процессорах найдут более широкое применение применительно к непрофессиональному использованию, так как на данный момент они практически ограничены только описанными выше сферами.
Оригинал статьи опубликован на сайте «Поиск-подбор».
Комментарии
Рано или поздно появится :)
RSS лента комментариев этой записи