|
nVIDIA GeForce 8800: революция свершилась! Часть первая: архитектура G80 |
На протяжении долгих лет архитектура графических процессоров принципиально не изменялась. Такое понятие, как «конвейер», стало доминирующим в описании архитектуры конкретного видеопроцессора, и отличия между ними в основном состояли в количестве отдельных вычислительных блоков. И вот наконец сегодня компания NVIDIA показывает нам другой путь развития.
На протяжении долгих лет архитектура графических процессоров принципиально не изменялась. Такое понятие, как «конвейер», стало доминирующим в описании архитектуры конкретного видеопроцессора, и отличия между ними в основном состояли в количестве отдельных вычислительных блоков. И вот наконец сегодня компания NVIDIA показывает нам другой путь развития.
Заметим сразу, что никаких сравнений с продуктами и особенностями архитектур конкурентов мы проводить не будем в связи с тем, что условия явно не равны: архитектура G80 специально разрабатывалась для DirectX 10, а все присутствующие на рынке продукты ориентированы на предыдущие версии API. Поэтому проводить параллели и искать отличия в реализации конкретных функций некорректно.
Немного теории: классический конвейер и DirectX 10
Начнём с небольшого отступления от сегодняшней темы и расскажем нашим читателям, что же такое пресловутый конвейер, из чего он состоит.
На самом деле то, что подразумевается под конвейером в видеопроцессоре, является лишь аппаратным обеспечением для реализации обработки графики, которая проводится конвейерным способом. Просчёт графики ведётся следующим способом:
|
|
|
Классический конвейер |
Итак, изначально видеопроцессор получает от хоста (центрального процессора) информацию об объекте, который необходимо обработать. В дело вступает вершинный процессор ядра. Он на основании полученных данных строит конкретный объект с фиксированными координатами, называемый вершиной (vertice). На данном этапе проводятся отдельные дополнительные операции над этими вершинами – например, преобразование и освещение, изменение объекта шейдерами и т.п. Кстати, аппаратный Transform & Lighting (T&L) впервые был внедрён NVIDIA в ядро GeForce 256 в 1999 году, затем дополнительные возможности обработки вершин добавлялись с поддержкой новых версий DirectX (программируемые вершинные шейдеры в DirectX 8, пиксельные – в DirectX 9 и т.д.).
Следующая ступень конвейера – сборка (setup). На этом этапе вершины собираются в примитивы – треугольники (полигоны), линии или точки. Подчеркнём, что ни о каком видимом объекте пока речь не идёт, это абстрактная информация о том, что вершины объединены в какой-то геометрический объект.
Эта информация переходит дальше по конвейеру – в пиксельный процессор, который определяет конечные пиксели, которые будут выведены в кадровый буфер, и проводит над ними различные операции: затенение или освещение, текстурирование, присвоение цвета, данных о прозрачности и т.п. В целом эту операцию называют растеризацией, потому что объект разбивается на отдельные фрагменты – пиксели. Понятие «растровый» означает «состоящий из точек», именно такая графика имеет отношение к трёхмерной, существует ещё векторная, объекты в которой представляются математическими формулами. Также в относительно современных графических процессорах на данной стадии на сцену выходят пиксельные шейдеры, способные отобразить специфическое изображение (шейдеры освещения, затенения, блеска и т.п.) Над пикселями проводится Z-тестирование (выясняется глубина каждой точки, так как мы говорим о трёхмерном изображении), и линии сглаживаются (antialiasing). Вся эта информация передаётся на следующую стадию (Z-данные – в Z-буфер).
Затем фрагменты с присвоенными им координатами цветности (RGBA, где A – alpha, обозначающая дополнительную характеристику пикселя (прозрачность) обрабатываются блоком ROP (Raster Operations). Из Z-буфера вычитываются данные о расположении конкретных пикселей, чтобы отбросить те, которые будут скрыты другими объектами и не видны пользователю. Фрагменты снова собираются в полигоны, состоящие из отдельных пикселей, и весь массив уже обработанной картинки передаётся в кадровый буфер для последующей выборки и вывода на экран.
Вот такой процесс, собственно, и называется конвейером. В характеристиках графических процессоров указывают условные конвейеры, что означает, сколько одновременно обработок может проводить ядро. Например, возьмём GeForce 7600GT: 12 пиксельных конвейеров по одному TMU на каждый, 5 вершинных процессоров. Понимать это следует так: за один такт ядро способно обработать 5 наборов данных о вершинах и построить 5 вершин, одновременно после растеризации обрабатываются 12 пикселей, на каждый из которых может быть наложена текстура. Иногда делается упор на мультитекстурирование, когда на один пиксель накладывается несколько текстур, в таком случае в ядре предусматривается кратное количество пиксельных процессоров и TMU (например 4/8). Если TMU меньше, чем пиксельных процессоров, то текстурирование проходит за несколько тактов.
Проблема подобной организации обработки графики состоит в том, что если уже обработанные данные нужно снова запросить и изменить, приходится дождаться завершения всего конвейера и заново вычитать их из кадрового буфера – или вообще снова получить от хоста. Если речь идёт об изменении на поздней стадии (например, работа пиксельного шейдера, скажем, освещение), то все предыдущие стадии конвейера заново обрабатываются почем зря, тратя на это вычислительную мощность других блоков. Также разделение функциональных блоков ядра на отдельные группы (пиксельный, вершинный процессоры) очень сильно ограничивает разработчиков графических приложений. Им приходится думать, как бы не переборщить с геометрическими характеристиками и не «положить» видеокарты, снабжённые малым количеством вершинных процессоров, или, наоборот, «наступать на горло песне» и урезать красоты, получаемые мультитекстурированием и сложными пиксельными шейдерами во благо обладателей видеокарт с уклоном в геометрию, а не работу с растром.
Теперь рассмотрим DirectX 10 API.
Стоит сразу отметить, что новая версия API от Microsoft, также известная как WGF 2.0 (Windows Graphics Foundation), в чём-то является развитием предыдущих версий, а в чём-то это очень большой прорыв.
Поясним для читателей, не разбирающихся в 3D-программировании, как работает DirectX да и любой API. Фактически это виртуальная машина, внутри которой выполняется код приложения (игры и т.п.). Преимущество такого подхода состоит в том, что разработчик игры не должен задумываться о том, как же в конкретной видеокарте реализована та или иная функция, он лишь пишет универсальный код на языках Microsoft High Level Shader Language или NVIDIA Cg. Этот код в рамках работающей виртуальной машины API компилируется в понятный конкретному GPU набор машинных команд с помощью компилятора Just-In-Time (JIT). При смене конкретных типов инструкций ядро виртуальной машины меняет модель работы, это выполняется центральным процессором на уровне драйвера.
Первое улучшение DirectX 10 по сравнению с DX9 – уменьшенное количество возможных состояний ядра за счёт большей унификации. Теперь большее количество инструкций выполняется в рамках одного runtime, благодаря чему происходит меньше прерываний на обращение процессора к драйверу и смену состояния ядра API.
В Shader Model 4 включено большое количество новых инструкций и унифицирован их набор, введены новые регистры и константы и многое другое. Таблица изменений – в следующей иллюстрации:
|
|
Революционным шагом в порядке обработки данных, которые в дальнейшем станут трёхмерным изображением, является концепция потоковой обработки. О традиционном конвейере мы поговорили чуть выше, теперь посмотрим на новый конвейер.
|
|
Потоковый вывод данных даёт возможность намного быстрее отослать на повторную обработку данные, уже прошедшие через вершинный или геометрический шейдер, с помощью специального потокового буфера (stream buffer). Благодаря этому не тратится время на ожидание завершения работы пиксельного шейдера и растеризации.
Отметим ещё одну новацию в DirectX 10: введён новый вид шейдеров – geometry shaders. Они позволяют работать с геометрией не на уровне отдельной вершины, как в случае с вершинными шейдерами, а на уровне примитивов. Это означает, что не нужно больше менять каждую вершину, собираемую затем в линию, можно геометрическим шейдером изменить всю линию. Это должно серьёзно разгрузить центральный процессор и предоставить ему работу только с движком игры и AI. Работа с геометрическим шейдером позволит затрачивать намного меньшее количество тактов графического процессора на просчёт сложных геометрических преобразований, в частности, всеми любимых реалистичных волос. Также геометрические шейдеры помогут увеличить реалистичность изображения воды за счёт возможностей тесселяции (разбиения полигонов на более мелкие).
Приводим таблицу сравнения алгоритмов обработки волос в DirectX 9 и 10:
|
|
Заметим, что в работе с физическими эффектами графический процессор намного эффективнее центрального. На иллюстрации видно, как перенос физики на GPU увеличивает производительность в 10 (!) раз:
|
|
В DirectX 10 акцентируется внимание и на вершинном текстурировании, возможном как для вершинных, так и для геометрических шейдеров. Благодаря вершинному текстурированию можно изменять позиции и формы объектов путем выгрузки из памяти карт смещений (displacement maps) и внесения содержащихся в них изменений в координаты вершин и примитивов.
В DirectX 10, кроме нововведений, значительно улучшена и расширена функциональность. Данная информация не рассматривается в нашем материале, поэтому интересующимся советуем ознакомиться с документом «Direct3D 10 System» (David Blythe, Microsoft Corp.), доступным на сайте Microsoft, а также «Technical Brief. Microsoft DirectX 10. The next generation graphics API.» с сайта NVIDIA.
Архитектура NVIDIA G80: концепция
Итак, NVIDIA наконец предлагает унифицировать функциональные блоки графического процессора, с тем чтобы они были способны обрабатывать любые виды данных (и даже более, о чём далее) без существенных потерь производительности. Сейчас мы подробно разберём архитектуру ядра G80.
|
|
|
Структурная схема ядра G80 |
Прежде всего сообщим, что основной упор при разработке этого ядра делался на поддержку DirectX 10 и Shader Model 4, и, соответственно, новый принцип обработки графики применим именно в этом API. Не стоит пугаться: игры, написанные на предыдущих версиях DirectX, тоже отлично обрабатываются. Кстати, по словам представителей NVIDIA, G80 не просто разрабатывался для поддержки DirectX 10, эти видеокарты были тестовым оборудованием, на котором этот самый API отлаживался!
Как уже было сказано, в DirectX 10 появляется новое понятие – поток данных (stream). Поток может быть входящим и исходящим (input stream и output stream), причём исходящий поток одного процессора может с лёгкостью стать входящим потоком другого.
Сделано это вот для чего:
|
|
|
Сравнение классического конвейера и унифицированного дизайна |
Унифицируя блоки обработки, разработчик графики получает возможность повторно обрабатывать данные, выведенные одним блоком, с помощью другого блока. В классическом конвейере данные сначала должны пройти до конца и быть выведены в кадровый буфер. Пример нового принципа обработки: вершинный процессор создает куб, который одновременно передаётся на дальнейшее текстурирование и выгружается в память, откуда его выбирает другой процессор и с помощью вершинного шейдера превращает в шар. Если же повторная обработка не требуется (что в современных играх случается не так уж и часто), то блоки способны работать как классическое ядро, одновременно обрабатывая несколько наборов данных.
Итак, NVIDIA создает в ядре 128 так называемых потоковых процессоров (streaming processor). Они являются унифицированными, то есть способны обрабатывать как пиксельные, так и вершинные шейдеры. Это сделано для того, чтобы динамически изменять производительность ядра в отдельных моделях работы, будь то обработка геометрии или сложная работа с цветом/светом/блеском/прозрачностью/etc. Мы наглядно продемонстрируем, зачем унифицировать блоки.
Классический дизайн ядра с фиксированным количеством вершинных и пиксельных процессоров (4/8 в данном случае):
|
|
Как видим, сложная многополигональная сцена заставляет вершинные процессоры (которых всего 4) работать «не щадя живота своего», пиксельные процессоры простаивают. А вот бушующее море кладёт на все 16 лопаток пиксельные процессоры за счёт сложного шейдера, в то время как геометрии тут не очень много. Сразу все дружно вспомнили демо NVIDIA с боевым кораблём на фоне волнующейся воды.
Теперь посмотрим, как дело обстоит у архитектуры с унифицированными шейдерами:
|
|
При большом уклоне в геометрию из массива процессоров выделяется необходимое для текстурирования и прочей пиксельной работы число блоков, а все остальные работают над вершинными операциями. Во втором случае всё наоборот. Подобное перепрофилирование работы потоковых процессоров производится специальным диспетчером.
Что ж, концепция понятна и приятна. Рассмотрим детально процесс обработки графики этой архитектурой.
Революционный конвейер
Host Inteface принимает данные о вершинах и примитивах от графического драйвера и передаёт их в Input assembler. Тот считывает данные из буфера хоста и переводит в формат FP 32 (между прочим, новый уровень детализации обработки, раньше применялся FP 16). Каждой вершине и примитиву присваивается идентификатор ID, чтобы в дальнейшем диспетчер мог направлять их на повторную обработку. Затем данные разделяются на потоки (streams) и передаются непосредственно в потоковые процессоры, которые их и обрабатывают.
После обработки в потоковых процессорах (подробнее о них – в части «Особенности архитектуры и нововведения») примитивы передаются в 6 блоков ROP, каждый из которых обрабатывает 4 пикселя (16 субпикселей RGBA). После растеризации данные выгружаются в кадровый буфер и затем выводятся на экран.
- 12.03 19:39 Видеокарта NVIDIA GeForce GTX 480 вновь позирует перед объективом
- 12.03 17:34 Inno3D готовит свой вариант видеокарты GeForce GTX 480 – упаковка на “живых” фото
- 12.03 16:03 Упаковки под версии GeForce GTX 480 и GTX 470 от Palit – на фото
- 12.03 14:16 Проекторы М серии от Samsung - для выездных презентаций
- 12.03 12:06 Видеокарта с двумя чипами Fermi появится лишь через несколько месяцев
- 12.03 08:30 Версии GeForce GTX 480 и GeForce GTX 470 от Galaxy должны дебютировать 26 марта























