УДК 004.021.42
АРХИТЕКТУРА ГРАФИЧЕСКИХ ПРОЦЕССОРОВ NVIDIA ВОСЬМОГО ПОКОЛЕНИЯ С ТОЧКИ ЗРЕНИЯ ВЫЧИСЛЕНИЙ ОБЩЕГО НАЗНАЧЕНИЯ © 2008 Э. С. Ершов, Е. А. Сухотерин
Э. С. Ершов - студент 5-го курса факультета информатики и вычислительной
техники nforcer@kursknet. ru
Е. А. Сухотерин - кандидат технических наук, доцент кафедры программного обеспечения и администрирования информационных систем evgeniy. soukhoterin'cigmail. ru
Курский государственный университет
В статье затрагивается тема реализации вычислений общего назначения на графическом процессоре, описывается в общих чертах архитектура графических процессоров NVIDIA восьмого поколения, упоминается о недостатках архитектуры предыдущего поколения графических процессоров и о том, как эти недостатки устранены.
Все преимущества и недостатки оцениваются с точки зрения выполнения вычислений общего назначения. Также приводятся статистические данные, подтверждающие эффективность нового поколения графических процессоров.
Ключевые слова: высокопроизводительные вычисления, архитектура
спецпроцессоров, графический процессор.
1. Введение
Произведённый NVIDIA видеопроцессор G70 в своё время поразил всех невиданной производительностью в игровых приложениях и программах, работающих с графикой. В последнее время всё более широкое распространение получают вычисления общего назначения на графических процессорах (GPGPU), задействующие видеокарты в расчётах, не имеющих к графике никакого отношения [Pharr 2005; Челноков 2006]. И именно с точки зрения GPGPU процессор G70 не так уж и впечатляет. Ему на замену был выпущен принципиально новый графический процессор G80. Рассмотрим вкратце преимущества новинки и недостатки предшественника.
2. Ограничения архитектуры G70
Хотя процессор G70 и обладал серьёзной для своего времени мощью, он не был лишён некоторых недостатков, которые проявились несколько позже, при первых попытках программирования его для вычислений общего назначения.
Первая проблема, которая в общем-то не была таковой при обработке графики, -это невозможность повторной обработки данных внутри процессора. Иными словами, проведя расчёты, процессор записывал результаты в буфер кадра, т.е. в видеопамять. Другого варианта не было. Поэтому, в случае если была необходимость в повторной обработке этих результатов (например, в качестве параметров какой-либо функции или просто в цикле), приходилось каждый раз снова считывать их из памяти. Временно сохранить результаты внутри процессора возможности не было. При обработке графики необходимость в этом возникала редко, поскольку на выходе из процессора
картинка в большинстве случаев уже была готова. Но при вычислениях общего назначения повторное использование данных встречается повсеместно, и, хотя видеопамять и обладает очень высокой пропускной способностью, всё же возникают задержки при пересылке данных из неё в видеопроцессор, что негативно сказывается на производительности. В центральном процессоре такая проблема решена использованием кэш-памяти первого и второго (а иногда и третьего) уровней, которая размещена непосредственно на кристалле процессора и работает на его частоте, сводя задержки при обращении к ней практически к нулю. В 070 ничего подобного реализовано не было.
Вторая серьёзная проблема, которая возникла с первыми попытками программирования обычных вычислений на 070, заключалась в неудобстве программирования шейдеров, отвечающих за вычисления общего назначения [Боресков 2006]. Не было специальных функций, операторов, библиотек, упрощающих программирование, механизмы обмена данными с видеокартой приходилось часто придумывать самому. Таким образом, ОРОРи (вычисления общего назначения на ОРИ) стали в некотором роде уделом избранных, способных разобраться в сложнейших механизмах. Кроме того, отсутствовала также и стандартизованная среда программирования. Каждый писал программы на том языке и в той среде, которая ему нравилась, что, с одной стороны, повышало скорость написания программ, а с другой -создавало проблемы переносимости. Код, написанный и отлаженный у одного, мог вообще не работать у другого.
Кроме этих двух крупных проблем в 070 существовало несколько мелких, вроде невысокой частоты работы графического ядра, небольшого по сегодняшним меркам количества процессоров обработки шейдеров и тому подобных технических нюансов, которые необходимо было улучшить, что и было сделано в следующем поколении графических процессоров - 080 (рис. 1).
Рис. 1. Общая схема архитектуры G80. Здесь: ВПВ - выборка из потока вершин (Vertex Thread Issue); ВПГ - выборка из потока геометрии (Geometry Thread Issue); ВПП - выборка из потока пикселей (Pixel Thread Issue); ПУП - процессор управления потоками (Thread Processor); SP - потоковый процессор (Streaming Processor); TF - блок фильтрации текстур (Texture Filtering Unit); L1 - кэш-память первого уровня; L2 - кэш-память второго уровня; FB - шина обмена данными (Front Bus)
3. Преимущества архитектуры 080
По заявлениям КУГО1А пиковая производительность процессора 080 достигает 520 гигафлопс, в то время как для 070 этот показатель ненамного превышал 200 гигафлопс. Естественно, вместе с этим возросли и энергопотребление, и выделяемое тепло, но не так значительно, как производительность. Причём такой прирост был достигнут не только количественными, но и качественными изменениями.
Впервые в видеокартах, доступных в розничной продаже, была использована унифицированная архитектура шейдерных процессоров. Во всех видеопроцессорах, предшествовавших 080, в том числе и в 070, существовали отдельные обрабатывающие процессоры для вершинных и пиксельных шейдеров. Они имели в своём составе два векторных АЛУ, работающих с векторами, имеющими четыре координаты. Таких мини-процессоров в 070 было 24 для пиксельных и 8 для вершинных шейдеров. В 080 нет разделения на пиксельные и вершинные процессоры. Любой мини-процессор в 080 (называемый потоковым процессором) может выполнять любую функцию и осуществлять вычисления любого характера. Таких потоковых процессоров в 080 128 (в будущем их количество будет только увеличиваться), причём все они скалярные, т.е. работают только с отдельными числами, а не с векторами. Это понижает эффективность одного отдельно взятого мини-процессора по сравнению с его векторным предком, но значительно возросшее их количество и в три раза большая частота работы (1,4 ГГц против 450 МГц) позволяют добиться впечатляющего превосходства. Кроме того, тот факт, что процессоры скалярные, позволяет легко использовать их в вычислениях общего назначения, ведь в этом плане они ничем не отличаются от центрального процессора. Более того, сходство только усиливается, ведь в 080 мини-процессоры объединены в группы по 8 и каждая группа имеет кэш-память первого и второго уровней (причём кэш второго уровня доступен для обращения всем остальным группам) (рис. 2).
ml ти ■ ■ ■ ■
IS ■ ■ ■ ■
ТА ТА ТА ТА
TF ТТ
TF TF
ТУ TF
TF1TF
Рис. 2. Структура мультипроцессора. Здесь: SP - потоковый процессор (Streaming Processor); TA - блок адресации текстур (Texture Address Unit); TF - блок фильтрации текстур (Texture Filtering Unit); Ll - кэш-память первого уровня; L2 - кэш-память второго уровня
Вот и решение первой проблемы 070. Результаты вычислений отдельной группы потоковых процессоров записываются в кэш второго уровня и становятся доступны всем остальным группам! Таким образом данные циркулируют внутри
процессора и покидают его, только когда все вычисления завершены. Это устраняет задержки, возникающие при обращении к видеопамяти. Кстати, эффективность работы с памятью в G80 также выросла в результате использования памяти с более высокой тактовой частотой и более широкой шины данных.
4. Преимущества G80 с точки зрения вычислений общего назначения
Итак, первая проблема G70 решена, а что же со второй? Естественно, и она решена тоже. Если помните, проблема была в отсутствии единой стандартной среды разработки для GPGPU. Теперь такая среда есть, и называется она CUD A (Compute Unified Device Architecture), что можно примерно перевести как «архитектура с унифицированными вычислениями». Название не очень звучное, но NVIDIA собирается дать ей более простое и запоминающееся - «GPU Computing», означающее, собственно, вычисления на GPU. Эта среда представляет собой надстройку над языком С, которая вводит несколько новых операторов и процедур, значительно облегчающих программирование расчётов общего назначения, а также компилятор. На данный момент среда CUDA находится в стадии бета-версии, но уже в работоспособном состоянии. И хотя её возможности ещё далеки до заявленных, уже сейчас с её помощью можно программировать различные операции над матрицами и некоторые другие, и разница в быстродействии по сравнению с CPU видна невооружённым глазом. Единственным недостатком на данном этапе видится то, что написанные в CUDA программы можно запустить только на G80 и производных от него младших процессорах G84 и G86. Сейчас доля этих видеокарт на рынке очень мала, и поэтому огромное количество владельцев видеокарт прошлых поколений не будут иметь возможности использовать преимущества GPGPU, а ведь прирост производительности хорошо заметен и на их видеокартах.
Сильно распараллеленная архитектура G80 отлично подходит для выполнения трудоёмких математических задач. Большое количество скалярных потоковых процессоров (до 128, а в перспективе ещё больше), использование кэш-памяти первого и второго уровней для более эффективной повторной обработки данных, аппаратный диспетчер потоков, осуществляющий оптимизацию загрузки GPU, - все эти особенности делают G80 не просто видеопроцессором для игрушек, но серьёзным помощником в научных расчётах высокой сложности.
Рис. 3. Ускорение вычислений при использовании графических процессоров. Каждый столбец диаграммы показывает увеличение производительности при решении на графическом процессоре относительно центрального процессора для следующих задач: Rigid Body Physics Solver - физика твёрдых тел; Matrix Numerics - матричные вычисления; Wave Equation - волновые уравнения; Biological Sequence Match - биологические задачи; Finance - задачи в финансовой области
Согласно данным, предоставленным NVIDIA на презентации G80 (рис. 3), результаты тестирования показывают 10-кратное превосходство видеопроцессора над CPU при расчёте физических эффектов, 13-кратное - при работе с матрицами, 15-кратное - при расчёте волновых уравнений, решение биологических задач ускоряется в 47 раз, а финансовых - в 197 раз. Таким образом, важность и перспективность использования видеопроцессоров для расчётов во всех областях науки очевидна.
Библиографический список
Боресков, А. В. Разработка и отладка шейдеров / А. В. Боресков. - СПб.: БХВ-Петербург, 2006. - 496 с.
Челноков, Ф. Персональный суперкомпьютер / Ф. Челноков // Компьютерра. -2GG6. - №13 (633). - С. 20-24.
Pharr, M. GPU Gems 2: Programming Techniques for High-Performance Graphics and General-Purpose Computation / M. Pharr, F. Randima. - Addison-Wesley, 2GG5. -814 pp.