CUDA быстрее

Кодирование видео, обработка изображений, распределенные вычисления — многие задачи уже сегодня можно выполнять в разы быстрее, если задействовать вычислительную мощь видеокарты.

В начале времен

Первыми программируемыми графическими процессорами были NVIDIA NV20 (GeForce 3) и ATI R200
(Radeon 7xxx и 8xxx). Однако они не могли выполнять операции с плавающей запятой, а потому представлялись бесперспективными. Поколение NV30 (GeForce FX) вышло весьма неудачным и с треском проигрывало видеокартам ATI того времени, зато получило возможность обработки таких операций. Но написание приложений осложнялось тем, что для использования мощностей графических адаптеров при расчетах программисту необходимо было уметь работать с Direct 3D или OpenGL. Подобными навыками обладали очень немногие. Впоследствии появилось специальное расширение для языка С под названием BrookGPU, позволявшее обходить всю работу со средами разработки трехмерных приложений, и тогда-то и началось настоящее развитие вычислений с использованием мощностей видеокарт.

До недавнего времени основным компонентом компьютера заслуженно считался центральный процессор. Однако при некоторых типах расчетов теоретически вычислительные мощности видеокарт оказываются в несколько раз выше, чем даже у самых мощных CPU. Раньше графические процессоры (GPU) использовались только для обработки выводимого на экран изображения. В полную силу они работали в играх с продвинутой графикой, а в остальное время их огромные вычислительные мощности простаивали впустую, даже когда процессор был загружен на все 100%.

Прорывом в данном направлении стала технология CUDA, разработанная компанией NVIDIA. Эта среда разработки значительно упрощает написание программного обеспечения, использующего для вычислений видеокарты (естественно, производства NVIDIA). Примерно в то же время сообщество Open Source создало конкурирующий пакет OpenCL, позволяющий работать как с видеокартами от AMD, так и продукцией NVIDIA. Результатом этого стало появление программного обеспечения различной направленности, использующего вычислительные мощности графических плат для ускорения работы. Характерными примерами такого ПО являются Adobe Photoshop CS4, клиенты для распределенных вычислений, драйверы и программы для кодирования видео.

Потоки: вместе мы сила

Большинство современных программ оптимизировано под два процессорных ядра. Другие приложения задействуют только одно ядро, а некоторые дальновидные разработчики пишут программы с расчетом на использование четырех ядер. Крайне редкие программы демонстрируют прирост производительности при работе большего количества ядер, а уж тем более — нескольких процессоров.

В то же время в спецификации, например, видеокарты NVIDIA GeForce GTX260 Core 216 значится 216 потоковых процессоров. Они основаны не на архитектуре x86, но каждый из них способен обрабатывать один поток данных. Почему бы не пустить их в дело, оптимизировав приложение под такое количество потоков? До выхода технологии NVIDIA CUDA, позволяющей осуществлять обработку кода, написанного на языке С, за счет мощностей видеокарт NVIDIA, этот вопрос оставался без ответа.

CUDA поддерживается всеми графическими ускорителями NVIDIA начиная с серии GeForce 8xxx. Сюда также входят видеокарты серии GeForce 9xxx и GeForce GTX 2xx, линейка NVIDIA Tesla и часть серии NVIDIA Quadro. К сожалению, CUDA является закрытой технологией, поэтому графические адаптеры, на которых она будет работать, могут выпускаться только компанией NVIDIA.

Существует и ответ от ATI — среда программирования под названием ATI Stream, но по сравнению с CUDA она является намного более низкоуровневым языком программирования, что затрудняет написание приложений. Теоретическая вычислительная мощность видеокарт ATI, обычно измеряемая количеством операций с плавающей точкой в секунду — флопс, намного превосходит этот показатель у решений NVIDIA. Но из-за сложности создания программное обеспечение, использующее для вычислений видеокарты ATI, встречается намного реже. А для реализации работы с CUDA не требуется никаких новых или неудобных языков программирования, поэтому результаты трудов разработчиков не заставили себя долго ждать.

Видео: код скорости

Наиболее очевидным вариантом нестандартного применения видеокарт является их использование для кодирования видео. Именно эта возможность и была реализована первой. Сначала появилась на свет программа ATI Avivo Video Converter, поставляющаяся в комплекте с драйверами для видеокарт ATI.

На момент выхода программа работала крайне нестабильно, но за счет использования мощностей видеокарт ATI позволяла в несколько раз сократить время, затрачиваемое на кодирование видео. Avivo Video Converter работает с форматами для Sony PSP, Apple iPod, мультимедийных плееров, просмотра на компьютере и многих других устройствах. Соответственно, разрешение конечного видео может меняться от очень низкого до 1920x1080 точек. Ответом от NVIDIA стала программа Badaboom Media Converter, предназначенная для тех же целей. Для работы ей требуется любая видеокарта NVIDIA, поддерживающая CUDA.

Одной из программ для кодирования видео, наиболее удачно использующих технологию CUDA, является Super LoiLoScope Mars. CUDA здесь служит не только для ускорения применения фильтров к видеоролику, но и, собственно, кодирования. Программа позволяет конвертировать видео в универсальные форматы, а также предназначенные для Apple iPod, Sony PSP, YouTube и многие другие. Интерфейс Super LoiLoScope Mars предельно прост и немного напоминает игры, написанные на Flash. Среди возможностей присутствуют все необходимые фильтры, сохранение в форматах WMV, MOV, AVI и MP4, а также функции записи на DVD и добавления субтитров и титров. Стоимость программы составляет 2200 рублей (880 грн.), а бесплатная версия имеет ограничения по сроку действия, разрешению при кодировании видео в формат MP4, а также характеризуется отсутствием звука при экспорте с использованием CUDA.

Обработка видео ускоряется в шесть раз

Тем, у кого есть видеокарта с поддержкой этой технологии, необходимо будет поставить галочку в соответствующем разделе настроек программы для включения возможности обработки видео силами видеоадаптера. При этом на осуществление кодирования уходит в несколько раз меньше времени. Сколько именно — зависит от характеристик графической карты.

YouTube: ремонт изображения

Другой вариант использования мощностей видеокарт, также связанный с кодированием видео, предлагает программа vReveal. Она представляет собой набор фильтров для улучшения качества картинки. Часть из них присутствует и в утилитах, предназначенных непосредственно для кодирования видео, однако vReveal содержит наиболее полный спектр фильтров, в том числе для двукратного увеличения разрешения, оптической стабилизации, спасающей от эффекта трясущихся рук, и снижения уровня шумов при съемке на камеру с небольшими физическими размерами матрицы, как, например, в мобильных телефонах. Также в комплект входят фильтры для увеличения резкости изображения и его яркости. Кроме того, программа умеет захватывать отдельные кадры и сохранять их как изображения.

vReveal существовала еще до появления технологии CUDA, однако с ее выходом команда разработчиков переделала код программы, что позволило ей работать с совместимыми видеокартами в несколько раз быстрее. Прирост производительности может быть пятикратным при использовании достаточно мощного графического ускорителя.

Возможности кодирования при помощи vReveal минимальны, но для тех, кто предпочитает размещать свои видеотворения на YouTube, их будет вполне достаточно. Программа является платной и оценивается разработчиками в 1600 рублей (640 грн.). Общедоступная версия ограничена 30 днями работы.

Распределенные вычисления: GPU на службе науке

Не секрет, что большую часть времени компьютеры многих пользователей работают далеко не на полную мощность: около 90% времени процессор загружается только на 10–15%, а видеокарта — и вовсе приблизительно на 5%. То есть компьютер включен, но фактически простаивает без дела. Концепция распределенных вычислений состоит в том, чтобы в это время ресурсы ПК использовались для решения научных или гуманитарных задач.

Чтобы начать участвовать в той или иной программе распределенных вычислений, необходимо только скачать и установить соответствующую клиентскую программу. Дальше она все сделает сама, хотя при желании ее можно настроить вручную. После установки такое приложение подключается к Интернету и скачивает с сервера задание и ядро для его расчета. Некоторое время уходит на сами расчеты, затем программа отправляет их результаты на сервер и скачивает новое задание, а при необходимости и новое ядро. Для того чтобы все расчеты не мешали пользователю нормально работать на своем компьютере, клиентская программа имеет минимальный возможный приоритет.

Открытая альтернатива

Альтернативой технологии CUDA является проект OpenCL. Он представляет собой средство разработки программного обеспечения, поддерживающее работу как с центральным процессором, так и видеокартами. Как следует из названия, OpenCL относится к семейству продуктов с открытым кодом, а потому не привязан к определенному производителю графических адаптеров. Работать с ним могут как устройства от ATI, так и NVIDIA и других компаний. Пока что модели на OpenCL находятся в демонстративной стадии, то есть сами производители видеокарт и процессоров показывают, на что способна данная среда разработки. Тем не менее будущее у продукта должно быть: на OpenCL сделала ставку компания Apple, планирующая использовать возможности видеокарт в программном обеспечении и новом поколении операционных систем. Скорее всего, этот открытый стандарт привлечет и немало других разработчиков.

Некоторые программы даже не надо скачивать — например, клиент для Folding@Home входит в сборку драйверов для видеокарт AMD ATI. Ученые Стэнфордского университета, запустившие этот проект, надеются, что расчет механизма сворачивания белков и получения их из цепочек аминокислот позволит медикам найти лекарства от таких болезней, как рак, СПИД и других. Такая направленность проекта привлекает множество волонтеров, родственники или знакомые которых страдают от одной из этих болезней, а также тех, кто просто хочет гордо заявлять, что внес свою лепту в спасение человечества от страшных заболеваний.

Существует и несколько других известных проектов распределенных вычислений — например, Rosetta@Home, посвященный выяснению трехмерных конфигураций белков и межмолекулярных взаимодействий, или Seti@Home, задачей которого является поиск внеземных цивилизаций путем анализа сигналов в широком диапазоне частот и выявления среди них таких сигналов, которые не являются шумом. Некоторые проекты распределенных вычислений, например MD@Home, направленный на поиск лекарств от определенных болезней, уже успешно завершились и внесли свой вклад в развитие современной науки.

Не так давно в клиентские программы Folding@Home, Seti@Home и некоторых других проектов была встроена поддержка использования графических адаптеров для ускорения расчетов. Например, Folding@Home позволяет использовать как видеокарты ATI, так и NVIDIA. При этом прирост производительности на мощных графических адаптерах от ATI оказывается приблизительно пятикратным, а на устройствах производства NVIDIA, драйверы которых значительно более оптимизированы, — почти десятикратным. В результате пользователь с мощной видеокартой может считать в несколько раз быстрее человека, использующего только процессор, и получать большее количество очков, приближая свою команду к первому месту в рейтинге проекта.

Не стоит забывать, что проявление доброй воли не обходится волонтерам даром. На расчет одного задания уходит по несколько десятков минут, а то и часов, при этом программа значительно нагружает как центральный процессор, так и видеокарту. Под нагрузкой оба компонента потребляют гораздо больше электроэнергии, чем в режиме простоя. Это может привести к появлению неожиданно высокой суммы в счете за электроэнергию, особенно при наличии мощной видеокарты, потребляющей более 100 Вт. На официальном сайте Rosetta@Home также указано, что при длительной работе клиента компьютер может перегреться. Особенно это касается ноутбуков с мобильными видеокартами высокого класса. С другой стороны, среди членов главной российской команды распределенных вычислений TSC! Russia регулярно разыгрываются достаточно ценные призы, и счастливчиком может стать любой участник.

Светлое будущее: слово за разработчиками

Проверка практикой

Чтобы выяснить, насколько большой прирост скорости обеспечивает CUDA, мы провели замеры времени кодиро-вания видео с включенной технологи-ей и без нее. С помощью программы Super LoiLoScope Mars мы конверти-ровали HD-ролики с разрешением 1920x1080 точек, закодированные ко-деками H.264 и VC1, в формат MP4. Мы собрали тестовую систему на материн-ской плате c чипсетом X58, процессо-ром Core i7 920, тремя гигабайтными модулями памяти DDR3 (1333 МГц) и видеокартой NVIDIA GeForce GTX285. В итоге при включенной технологии NVIDIA CUDA машина справилась с ко-дированием роликов в среднем в пять раз быстрее, что дает огромный вы-игрыш во времени, если речь идет о больших объемах видео.

Уже сегодня видеокарты позволяют в разы ускорить обработку многих задач. Помимо упомянутых нами программ существует множество других, среди которых есть как кодировщики видео Cyberlink PowerDirector 7 и Tsunami TMPGEnc, так и необычные примеры вроде программы для подбора паролей John the Ripper. Тем не менее эра вычислений при помощи графических адаптеров только начинается. В ближайшем будущем Intel собирается представить графический ускоритель, носящий кодовое имя Larrabee и основанный на архитектуре x86, разрабатывать приложения для которой значительно проще. К тому же только небольшая часть разработчиков программного обеспечения успела оптимизировать свои приложения под работу с CUDA, а эволюция OpenCL и вовсе находится на этапе «зарождения жизни».

И Windows 7, и Mac OS 10.6 обещают активное использование видеокарт для ускорения работы приложений. Можно не сомневаться, что за ними последуют и некоторые дистрибутивы Linux. NVIDIA планирует добавить к CUDA поддержку других языков программирования, среди которых «Фортран» и С++. Количество программного обеспечения, выполняющего вычисления при помощи графических адаптеров, увеличивается в геометрической прогрессии. Можно надеяться, что, несмотря на постоянно возрастающие системные требования любых программ, их новые версии начнут работать быстрее. Как скоро оправдается эта надежда, зависит от того, насколько оперативно разработчики оптимизируют коды своих программ для использования мощностей графических ускорителей.

Александр Перекалин. (Журнал «Chip», июль 2009)