Расчёты на 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 же предлагает с каждым годом всё большую производительность и масштабируемость. Именно это привлекает потребителей и разработчиков. А если спрос на решения компании есть и будет в дальнейшем, то отказываться от этого направления смысла нет – его надо усиленно развивать.
Переход от традиционных решений к NVIDIA CUDA
Для начала надо отметить, что NVIDIA не предлагает полноценную замену традиционным CPU. Нельзя собрать кластер на базе ускорителей Tesla и запустить на нём произвольный код. Решения GPGPU являются подспорьем в сложных расчётах, а Tesla можно скорее назвать очень мощным сопроцессором. В любом коде есть участки, которые хорошо исполняются на CPU. Их нет смысла портировать. Но часто можно выделить небольшие по объёму, но критичные по времени исполнения участки кода. И за счёт них можно значительно увеличить конечную производительность. В качестве примера можно привести работу, которую провели в Национальном центре исследования погоды США. У них уже был код, который исполнялся на обычном кластере. Они переписали всего 1% кода для работы на GPU, а в итоге получили суммарный прирост скорости в 20%!
Однако основная проблема заключается в необходимости переосмысления задачи. Традиционные модели программирования не годятся для расчётов на GPU. Разработчику необходимо найти параллелизм в задаче и правильно его выразить. Для некоторых задач переход довольно прост и зачастую очевиден, для некоторых – с точностью до наоборот.
Ускорители Tesla
Основными продуктами NVIDIA для расчётов на GPU являются устройства из серии Tesla. Существуют 3 модификации этих продуктов:
Tesla C – внешне не отличается от типичной видеокарты (нет только видеовыходов) и подключается по интерфейсу PCI-E. Он потребляет около 200 Вт и имеет пиковую производительность в 1 Тфлоп.
Tesla D – так называемый "приставной суперкомпьютер", внутри которого находятся 2 ускорителя Tesla C. Достаточно мощное и компактное решение. Подключается к рабочей станции отдельным кабелем.
Tesla S – это компактный сервер стандартного формфактора 1U, предназначенный для установки в стойку. Позиционируется как дополнение к уже существующему кластеру на обычных CPU.
Чем отличаются продукты серий 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 ещё не выпущен и делать какие-то выводы слишком преждевременно.