Параллельные вычислительные процессоры NVIDIA: настоящее и будущее, часть 4

Альтернативные решения CPU

По объективным причинам, производительность CPU растет медленно, т.к. на десктопе множество задач, которым не нужно много потоков и производители CPU делают двуядерные модели. Выпуск шести– и восьмиядерных моделей отнесен на конец следующего года, причем, это будут модели верхнего ценового уровня. В конце следующего года, компания Intel планирует представить новую архитектуру Sandy Bridge, мэйнстрим-вариант — четырехъядерный процессор с частотой около 3,5 GHz и интегрированным графическим ядром. С некоторыми небольшими архитектурными улучшениями, он может быть примерно в полтора раза быстрее топовой модели Lynnfield. А ещё, у Sandy Bridge будет восьмиэлементный SIMD набор AVX. Все SSE-программы придется переписывать для новых размеров векторов. Но увеличение размера вектора до 8, это какой-то неясный путь, непонятна его перспектива. Потом до 16? Потом до 32? Модель SIMT из CUDA гораздо удобнее в программировании, это просто программирование на языке высокого уровня, без всяких дополнительных громоздких векторных инструкций.

А если рассмотреть Larrabee, у которого вообще планировались шестнадцатиэлементные вектора? Ещё менее гибко и менее удобно. Такие длинные вектора мало где применимы, практически всегда требуется очень сложная оптимизация: както переставлять элементы, обрабатывать специальные случаи, когда нужно что-то сделать только с частью вектора. В этом смысле, даже сложная оптимизация под CUDA, более естественна для не узкоспециализированных программистов, для ученых, например. Она более алгоритмическая. Выбрать из множества алгоритмов с наибольшей локальностью обращений к памяти. Придумать, как разделить область задачи и как распараллелить её на тысячу потоков. Фишки AVX и архитектуры Larrabee ориентированы на ускорение сегодняшних алгоритмов, путем оптимизации с помощью низкоуровневых векторных инструкций. Но у модели Ларраби, выпуск которой перенесли надолго, согласно доступной информации, все равно была недостаточная производительность в 3D графике. Скорее всего, Intel многое переделает, поэтому о Larrabee говорить ещё рано.

Проблемы CUDA

Что мешает распространению CUDA? Благодаря предоставляемой архитектурой CUDA, высокой производительности, технология нашла большое количество применений в самых различных областях. На сайте компании NVIDIA можно найти примеры как экспериментальных, так и коммерческих приложений. Но области применения остаются локальными, они выглядят изолированными озерами на материке современного ПО. Это не море и не океан. Или лучше сравнить CUDA-приложения со скалами, которые поднимаются из безбрежного океана программ и возвышаются над ним. Чем больше производительность, тем выше пик. Они появляются и растут, то тут, то там, но пока ещё целые пласты не поднялись над спокойной гладью воды и не сформировали землю.

Надо сразу отмести приложения и расчеты, которые и так выполняются достаточно быстро на современных процессорах. С другой стороны, наиболее вычислительно требовательные из пользовательских задач — приложения компьютерной графики на PC — успешно решаются специальными ускорителями 3D-графики, которые по странному стечению обстоятельств имеют тот же адрес места жительства в компьютере, что и CUDA-устройство. Если бы не они, вся графика считалась бы сейчас на CUDA.

О проблеме совместимости можно и не говорить. Сейчас многие наоборот согласились бы на двукратную потерю производительности, чтоб только какую-то старую программу перенести без проблем с одной платформы на другую.

Но наиболее важная проблема для рынка персональных ПК, на взгляд автора, это отсутствие совместимой с CUDA технологии подобного уровня от компании AMD. Для коммерческих разработчиков важна поддержка всех систем. Не будут же они писать на коробках, что их ПО предназначено только для пользователей решений NVIDIA. Если бы CUDA была реализована, пусть даже с меньшей производительностью, в решениях AMD, то сейчас было бы гораздо больше инвестиций в CUDA-ПО.

Но, буквально в последние месяцы, AMD объявила о поддержке окончательного варианта OpenCL. По мнению автора, это другая обертка CUDA-архитектуры, по сути, абсолютно то же самое, как если бы мы конфету завернули в другой фантик. Автор нашел у OpenCL и CUDA меньше отличий, чем у OpenGL и Direct3D, например. А многие игры поддерживают и OpenGL, и Direct3D и картинка практически не отличается. Даже больше, между текущей реализацией CUDA и OpenCL меньше различий, чем между некоторыми версиями DirectX. Основные отличия в синтаксисе. В OpenСL текстура называется Image, например. Так что, эта проблема совместимости решена, пусть даже если ОpenCL-драйвера будут вначале хуже по исполнению видеодрайверов ATI.

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

Другая проблема — это ещё не полная «обкатанность» технологии, она просто ещё молода. Например, проблема, что некоторые операционные системы Windows пытаются действовать как OS реального времени и норовят прервать исполнение CUDA-программы, если оно продолжается больше 5 секунд. Таким образом, OS Microsoft не может «достучаться» до GPU и пытается что-то сделать. Очень бредово звучит. И разработчикам приходиться обходить эту проблему с использованием специфического системного программирования для каждой операционной системы Microsoft.

В последних версиях CUDA, SDK и компилятора, многие пожелания пользователей были учтены. В первую очередь, с точки зрения не аппаратной архитектуры, а программного интерфейса, поддержки различных операционных систем и сред программирования. У автора не было с последней версией SDK никаких проблем.

И последнее — вожделенный для NVIDIA рынок высокопроизводительных вычислений HPC. И тут, главным препятствием является недостаточная производительность вычислений с вещественными числами, типа double с двойной точностью. Все рекорды скорости GPU поставлены при работе с числами одинарной точности или целыми 32-битными или 16-битными. Для вычислений double, в нынешних GPU доступно только одно исполнительное устройство, таким образом, максимальная теоретическая скорость в 8 раз меньше и сравнима со скоростью любого современного четырехъядерного процессора. Такая игра не стоит свеч.

Конечно, многим физическим задачам не требуется двойная точность расчётов. Многие пользователи в области химии, электродинамики, биологии успешно применили CUDA и получили дешевую производительность для своих задач. В конце концов, производители CPU выкинули поддержку более точного 80–битного типа long double, потому что его размер не очень им удобен. Но, double — это стандарт в индустрии, все к нему привыкли. В конце концов, редко система собирается ради одного алгоритма. А если он изменится, если потребуется считать что-то иное. Такая узкая специализация устройства препятствует широкому применению. И дополнительная скорость CUDA-устройства может быть не настолько востребована, чтобы проверять и исследовать, выдержит ли используемый алгоритм переход на вычисления с числами одинарной точности, не накопится ли где-нибудь погрешность. Или разрабатывать новый, специально для работы с float.

Но отсутствие полной поддержки double не есть базовая черта архитектуры CUDA. Так сложилось, не будем говорить почему (подсказка, в графике тип double не очень востребован), что CUDA-устройства имеют исполнительные устройства, работающие с float. Если бы вместо 8 float-операций выполнялось 8 операций с вещественными числами двойной точности, уже сейчас применений CUDA в HPC было бы на порядок больше. И в новой версии CUDA-архитектуры, «Fermi», уже целенаправленно предназначенной для HPC и других «неграфических» применений, double поддерживается наравне со float, как и в обычных CPU. И является таким же базовым типом переменных.

В новой архитектуре так много качественных улучшений, решающих большинство из вышеперечисленных проблемы CUDA, что она претендует на статус революционной.

Революционная архитектура «Ферми»

Хорошо, что на свете не бывает чудес, иначе жизнь была бы слишком пресной и скучной. Если бы чип, на основе представленной в начале октября архитектуре, появился прямо сейчас, по типичным ценам и объемам, это было бы чудо, настолько она продвинута на данный момент. Но проблемы с переходом на новый техпроцесс, которые случаются, время от времени, со всеми производителями чипов, задерживают выпуск продукта.

Это не так принципиально для разработки, так как существующим CUDA-программам не потребуется переделки, чтобы воспользоваться преимуществами новой архитектуры. Для полного ускорения может потребоваться некоторая переконфигурация, изменение количества нитей в блоке и размера разделяемой памяти блока. Но практически все CUDA-программы могут свободно варьировать эти параметры. Потому, что несколько все равно: что 128, что 256, что 512 нитей. И у разработчиков появится время, чтобы подготовить продукты к анонсу, с расчетом на его уже новые возможности. Зачем нужен чип, если для него нет программ?

У нового чипа нет пока имени и я придумал назвать его «Reflection» («Отражение»), потому что в новой архитектуре отражено огромное количество пожеланий авторов CUDA-программ. И он «отражает» критику слабых мест прежней архитектуры. И те, кто знаком с компьютерной графикой знает, что эффекты рендерятся долго и его применение как раз ускорит отрисовку таких сложных визуальных эффектов.

Самое главное для HPC–устремлений NVIDIA, новый чип полноценно поддерживает double. Каким образом это достигнуто? В новой архитектуре мультипроцессоры стали более «жирными». Вместо 8 исполнительных устройств, их стало 32. И, по-видимому, два соседних устройства вычисляют, вместо пары float-операций, одну double. Производительность в double просто в два раза меньше, чем во float. Либо 32 операции с числами с одинарной точностью, либо 16 с двойной. Это в точности как в SSE обычных CPU, производительность в double в два раза ниже. Количество мультипроцессоров уменьшилось до 16, но общее количество операций возросло более чем вдвое, а с double–числами почти на порядок.

Так представляет новый чип NVIDIA. 16 мультипроцессоров с 32 исполнительными устройствами, обозначенными зелеными прямоугольниками. 4 вертикальных прямоугольника салатового цвета обозначают модули вычисления специальных функций, тригонометрических и корней. Небольшие зеленые квадратики, видимо, обозначают 16 устройств калькуляции адресов.

Оранжевые прямоугольники обозначают «дуальный» планировщик и модуль dispatch. Синие области обозначают L1-кэш с разделяемой памятью, блок регистров, который по некоторым сведеньям удвоился и специальный кэш инструкций, подробности о функционировании которого не разглашаются.

Если бы NVIDIA ограничилась только этим, то это был бы уже большой шаг вперед. Но улучшения приняли тотальный характер.

Точность float-вычислений тоже была повышена, в соответствии со спецификациями самого последнего стандарта. Включена поддержка денормализированных чисел с полной скоростью, что CPU делать не умеют. Денормализированные числа — это маленькие числа, на границе точности формата float.

В результате, CUDA-устройство может считать точнее, чем CPU. Вполне очевидно, благодаря чему это стало возможно. Мультипроцессор работает на меньшей частоте, чем CPU, нет такой требовательности к дизайну модулей умножения, чтобы они работали на невероятной скорости и их можно совершенствовать «вширь». Этого изначально стоило ожидать от CUDA-архитектуры. Была бы потребность, можно было бы относительно легко и 128–битные вещественные числа сделать.

ECC

Критики архитектуры CUDA справедливо указывали, что для применения в системах HPC требуется поддержка алгоритмов коррекции ошибок ECC, которые иногда возникают в электронных устройствах. Когда тысячи устройств работают круглые сутки, ошибки неизбежно появляются, время от времени. На это энтузиасты технологии отвечали, что преимущество в скорости CUDA так велико, что можно для проверки результата считать его два раза, особенно конечный. Но, как будто бы ECC каким-то образом противоречит самой идее CUDA-архитектуры? Конечно же нет, на низкочастотном устройстве её воплотить даже легче. И новый чип имеет полную поддержку технологий коррекции.

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

 /