Расчёты на GPU. Предыстория

Само по себе такое направление, как расчёты на GPU, не такое уж и молодое. Идея таких расчётов впервые появилась примерно в 2003 году. Выход NV30 обеспечил достаточно высокий уровень программируемости GPU – произвольный код стало возможно запускать в виде графических шейдеров. Тогда использовался исключительно графический интерфейс как для ввода начальных данных и кода, так и для считывания результата. Об удобстве не было и речи, но тем не менее какие-то реальные задачи уже можно было решать. Это был первый фактор.

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

Именно эти два фактора стали предпосылками для развития GPGPU (концепция общих вычислений на GPU) в целом.

Что такое CUDA?

Главная проблема заключалась в том, что не было никакого стандартного интерфейса для программирования GPU. Разработчики использовали OpenGL или Direct3D, но это было не очень удобно. По этой причине NVIDIA занялась разработкой некоего единого и удобного стандарта и к выходу G80 представила технологию CUDA.

NVIDIA CUDA – это "архитектура, т.е. совокупность программных и аппаратных средств, которые позволяют производить на GPU вычисления общего назначения". Официально аббревиатура CUDA расшифровывается так: Compute Unified Device Architecture. На данный момент есть готовый SDK, который пока что использует язык программирования C. Но в скором будущем появится поддержка Fortran (очень популярный язык в научной среде) и C++. Вообще никаких принципиальных ограничений на язык или модель программирования нет, лишь бы была возможность создавать параллельный код. Причём параллелизм несколько отличается от того, который подразумевается при работе с CPU. В случае разработки приложений для традиционных CPU речь идёт о параллелизме задач – один программный модуль исполняется на одном ядре, другой на втором и т.д. Когда мы говорим о CUDA, то мы говорим о параллелизме данных. Подразумевается, что данных у вас всегда много и больше, чем физических процессоров.

Ещё один ключевой момент архитектуры CUDA – лёгкая масштабируемость. Единожды написанный код будет запускаться на всех устройствах, поддерживающих CUDA. Для разработки и отладки кода для запуска на GPU можно использовать обычные видеокарты. А когда продукт готов – запускать его уже на мощных Tesla. Это очень удобно.

Проблемы традиционных CPU. Роль GPGPU в жизни NVIDIA

Направление GPU-компьютинга очень важно для NVIDIA. С момента запуска архитектуры G80 в 2006 году было выпущено более 100 млн. видеоускорителей, которые поддерживают CUDA. И каждую неделю продаётся ещё один миллион CUDA-capable устройств. Это даёт право называть технологию массовой.

За последние 20 лет интерес к параллельному программированию утих – мощные кластеры стали собираться из компонентов для обычных PC. Но примерно с 2005 года скорость роста производительности обычных CPU сильно упала, а GPU – нет. NVIDIA же предлагает с каждым годом всё большую производительность и масштабируемость. Именно это привлекает потребителей и разработчиков. А если спрос на решения компании есть и будет в дальнейшем, то отказываться от этого направления смысла нет – его надо усиленно развивать.
http://www.computerra.ru/upload/marina/tl/platform/cuda/image2.png

Переход от традиционных решений к NVIDIA CUDA

Для начала надо отметить, что NVIDIA не предлагает полноценную замену традиционным CPU. Нельзя собрать кластер на базе ускорителей Tesla и запустить на нём произвольный код. Решения GPGPU являются подспорьем в сложных расчётах, а Tesla можно скорее назвать очень мощным сопроцессором. В любом коде есть участки, которые хорошо исполняются на CPU. Их нет смысла портировать. Но часто можно выделить небольшие по объёму, но критичные по времени исполнения участки кода. И за счёт них можно значительно увеличить конечную производительность. В качестве примера можно привести работу, которую провели в Национальном центре исследования погоды США. У них уже был код, который исполнялся на обычном кластере. Они переписали всего 1% кода для работы на GPU, а в итоге получили суммарный прирост скорости в 20%!

Однако основная проблема заключается в необходимости переосмысления задачи. Традиционные модели программирования не годятся для расчётов на GPU. Разработчику необходимо найти параллелизм в задаче и правильно его выразить. Для некоторых задач переход довольно прост и зачастую очевиден, для некоторых – с точностью до наоборот.

Ускорители Tesla

Основными продуктами NVIDIA для расчётов на GPU являются устройства из серии Tesla. Существуют 3 модификации этих продуктов:

Tesla C – внешне не отличается от типичной видеокарты (нет только видеовыходов) и подключается по интерфейсу PCI-E. Он потребляет около 200 Вт и имеет пиковую производительность в 1 Тфлоп.
http://www.computerra.ru/upload/marina/tl/platform/cuda/image3.jpg

Tesla D – так называемый "приставной суперкомпьютер", внутри которого находятся 2 ускорителя Tesla C. Достаточно мощное и компактное решение. Подключается к рабочей станции отдельным кабелем.
http://www.computerra.ru/upload/marina/tl/platform/cuda/image4.jpg

Tesla S – это компактный сервер стандартного формфактора 1U, предназначенный для установки в стойку. Позиционируется как дополнение к уже существующему кластеру на обычных CPU.

http://www.computerra.ru/upload/marina/tl/platform/cuda/image5.jpg

Чем отличаются продукты серий GeForce и Tesla? Во-первых, у этих продуктов совершенно разный целевой рынок (Tesla – профессиональное решение, GeForce – консьюмерское), а значит и требования к качеству и прочим параметрам заметно отличаются. Все ускорители Tesla проходят строгий контроль качества и производитель гарантирует их бесперебойную работу в режиме 24x7. Во-вторых, жизненный цикл Tesla намного больше, чем у GeForce. Любого рода поддержка (техническая, программная etc) осуществляется в течение очень длительного срока.

NVDIA CUDA в российской научной среде

В научной среде наблюдается повышенный интерес к CUDA. На данный момент 41 вуз по всему миру вплотную работает с этой технологией и активно разрабатывает приложения на её основе. Большинство таких заведений не обладает нужными бюджетами для покупки дорогих кластеров, но зато они имеют много человеческих ресурсов и могут позволить себе переписать уже готовый код для переноса его на GPU. В России компания NVIDA сотрудничает с МГУ – там уже есть люди, которые непосредственно занимаются GPU-расчётами, а также имеется специальный курс для обучения студентов CUDA-программированию. Это пока что первый опыт компании, но уже нескольких других вузов дали согласие на внедрение этого курса, и есть надежда, что в дальнейшем это направление будет активно развиваться.

Top500 и реальная производительность CUDA

Среди машин, входящих в знаменитый рейтинг Top500, уже есть те, в которых используются ускорители Tesla. В ноябре 2008 года одна из таких машин занимала 29-е место.

Отдельно стоит вопрос о производительности NVIDIA CUDA в реальной жизни. Дело в том, что заявленных пиковых значений можно достичь не на каждой задаче. И в этой области есть некоторое отставание от традиционных процессоров. Получить заявленную производительность на CPU несколько легче, чем на GPU.

Конкурентные технологии от ATI и Intel

Технологию ATI Stream в NVIDIA не считают очень сильным конкурентом. CUDA и Stream – это две разные технологии, которые стоят на различных уровнях развития. Программирование для продуктов ATI намного сложнее – их язык скорее напоминает ассемблер. CUDA C, в свою очередь, гораздо более высокоуровневый язык. Писать на нём удобнее и проще. Для крупных компаний-разработчиков это очень важно. Если говорить о производительности, то можно заметить, что её пиковое значение в продуктах ATI выше, чем в решениях NVIDIA. Но опять всё сводится к тому, как эту мощность получить.

Сравнивать же CUDA и Intel Larrabee нет никакого смысла. Larrabee ещё не выпущен и делать какие-то выводы слишком преждевременно.