Графический процессор (ГП или GPU) предназначен для хранения, обработки и передачи на монитор данных о выводимом на экран изображении. ГП существенно повышает производительность компьютера, освобождая центральный процессор (ЦП) от обработки графических данных. По своей сложности современные ГП могут превосходить ЦП.
Обработки графических данных включает определение объектов, составляющих сцену, расчет местоположения вершин, задающих эти объекты, построение по вершинам граней, наложение на грани текстур и т.п.
Графические процессоры имеют конвейерную архитектуру. В классическом варианте различают вершинные и пиксельные процессоры — конвейеры.
Поступающие в ГП данные об изображаемом объекте сначала обрабатываются в вершинном процессоре (Vertex Pipeline) с помощью программ, называемых вершинными шейдерами (Vertex Shader). Вершинный шейдер рассчитывает геометрию сцены и параметры вершин (координаты, цвет, освещение и др.), может выполнять такие операции, как деформация и анимация объектов.
Далее происходит сборка (Setup) трехмерной модели в полигоны. На этом этапе вершины соединяются между собой линиями, образуя каркасную модель. При соединении вершин друг с другом образуются полигоны (треугольники).
После этапа сборки данные поступают в пиксельный процессор (Pixel Pipeline), который определяет конечные пикселы, которые будут выведены в кадровый буфер. Пиксельный процессор в итоге своей работы выдает конечное значение цвета пиксела и Z-значение для последующего этапа конвейера. Пиксельный процессор работает под управлением специальной программы, называемой пиксельным шейдером (Pixel Shader). Пиксельные шейдеры — это программы, выполняемые пиксельными процессорами во время растеризации для каждого пиксела изображения. Поскольку пиксельные шейдеры реализуют различные операции над отдельными пикселами, такие как затенение или освещение, текстурирование (операцию выполняет блок наложения текстур TMU), присвоение цвета, данных о прозрачности и т.п., то можно говорить, что пиксельный процессор работает на этапе растеризации.
Пиксельные шейдеры реализуют такие функции, как мультитекстурирование (наложение нескольких слоев текстуры), попиксельное освещение, создание процедурных текстур, постобработка кадра и т.д.
После обработки данных в пиксельном процессоре с помощью пиксельных шейдеров данные обрабатываются блоком растровых операций ROP (Raster Operations). На данном этапе с использованием буфера глубины (Z-буфера) определяются и отбрасываются те пикселы, которые будут не видны пользователю. Когда рассчитывается новый пиксел, его глубина сравнивается со значениями глубин уже рассчитанных пикселов с теми же координатами Х и Y. Если новый пиксел имеет значение глубины больше какого-либо значения в Z-буфере, новый пиксел не записывается в буфер для отображения (если меньше — то записывается).
Кроме буфера глубины, позволяющего отсекать невидимые поверхности, при создании реалистичных трехмерных изображений необходимо учитывать, что объекты могут быть полупрозрачными. Эффект полупрозрачности создается путем объединения цвета исходного пиксела с пикселом, уже находящимся в буфере. В результате цвет точки является комбинацией цветов переднего и заднего плана. Для учета прозрачности объектов используется так называемый alpha-коэффициент прозрачности, который имеет значение от 0 до 1 (для каждого цветового пиксела).
Недостатки классического графического конвейера
Описанная классическая архитектура графического конвейера дает наглядное представление об основных этапах формирования изображения видеокартой. При этом нужно отметить, что в графическом процессоре используется не один, а несколько конвейеров, работающих параллельно; чем больше в графическом процессоре таких конвейеров, тем он производительнее. Действительно, если, к примеру, в графическом процессоре реализовано 16 конвейеров, то первый из них обрабатывает 1-й, затем 17-й, потом 33-й пиксел и т.д.; второй — 2-й, 18-й и 34-й соответственно.
История развития графических процессоров до сих пор шла в одном направлении — увеличивалось число конвейеров. Понятие "конвейер" является устойчивым, но его нельзя считать строгим техническим термином. Дело в том, что в графическом процессоре используются разные конвейеры, которые выполняют отличающиеся друг от друга функции. В этом смысле более правильно говорить о вершинных или пиксельных конвейерах, но не о конвейерах вообще. Раньше под конвейером понимали пиксельный процессор, который был подключен к своему блоку наложения текстур (TMU). Например, если у графического процессора (GPU) используется восемь пиксельных процессоров, каждый из которых подключен к своему блоку TMU, то говорят, что у GPU восемь конвейеров. В то же время отождествлять число конвейеров с числом пиксельных процессоров не совсем корректно, поскольку конвейерная обработка подразумевает работу не только с пикселами, но и с вершинами, а значит, необходимо учитывать и число вершинных процессоров. Поэтому число конвейеров может выступать в качестве корректной характеристики графического процессора только в том случае, если количество конвейеров совпадает с числом пиксельных и вершинных процессоров и блоков TMU, то есть когда каждый конвейер включает по одному вершинному и пиксельному процессору, а также по одному блоку TMU. В то же время этот подход к архитектуре графического процессора нельзя признать оптимальным. Дело в том, что такая линейная организация конвейера подразумевает равномерное распределение нагрузки между отдельными стадиями конвейера. В то же время в реальных приложениях нагрузка на отдельные блоки графического процессора может быть различной. Отчасти решить проблему оптимизации нагрузки графического процессора позволяет такая архитектура, при которой количество пиксельных процессоров не совпадает с количеством вершинных процессоров. При этом разработчикам приходится искать золотую середину между количеством вершинных и пиксельных процессоров.
Понятно, что в подобном случае говорить о классическом конвейере не вполне корректно.
К примеру, в графическом процессоре NVIDIA GeForce 6800 используется шесть вершинных процессоров и 16 пиксельных процессоров. Каждый из 16 пиксельных процессоров имеет два блока пиксельных программ и один текстурный модуль TMU. Если первый блок пиксельных программ на каждом конвейере может выполнять как арифметические операции, так и чтение текстур и нормализацию, то второй блок ограничен только арифметикой. Другими словами, первый блок связан с текстурами. Если блок не занимается текстурированием, то он может выполнять (в данный проход) пиксельное затенение. Второй всегда доступен для пиксельного затенения.
Исторически под числом конвейеров в графическом процессоре принято понимать число пиксельных процессоров (хотя это и не вполне корректно). Для рассмотренной архитектуры NVIDIA GeForce 6800, как и для многих других графических процессоров, такой подход вполне приемлем, однако подобная организация лишь отчасти решает проблему сбалансированности нагрузки на GPU. Следующий шаг в этом направлении предложила компания ATI, перейдя на модульную, фрагментированную архитектуру в графических процессорах семейства ATI Radeon X1000.
Рассмотрим, к примеру, процесс формирования изображения в графическом процессоре ATI Radeon X1800 .
Первый этап вполне традиционен — это обработка данных вершинными процессорами, которые вычисляют геометрию трехмерного изображения. На этом этапе данные (Vertex Data) обрабатываются восемью вершинными процессорами (Vertex Shader Processor).
После расчета геометрии вершин, отсечения скрытых поверхностей, обрезки и т.д. данные поступают в блок сборки (setup engine), содержащий блок растеризации геометрии, потом — в процессор распределения данных Ultra-Threading Dispatch Processor. Именно этот новый блок распределения позволяет говорить о мультипоточной концепции архитектуры графического процессора. Процессор распределения Ultra-Threading Dispatch Processor способен распараллеливать шейдерный код на сотни потоков (до 512 потоков), увеличивая эффективность выполнения пиксельных шейдеров.
После прохождения процессора распределения потоки поступают в пиксельные блоки (Quad Pixel Shader Cores). Каждый такой блок (всего в графическом процессоре их четыре) состоит из четырех объединенных вместе пиксельных процессоров, каждый из которых в состоянии обработать шейдер для блока 2x2 пикселов за такт. Соответственно пиксельный блок может обрабатывать шейдер для блока 4x4 пикселов за такт.
Понятно, что в данной архитектуре термин "конвейер", равно как и "пиксельный конвейер", уже утратил свое значение.
В то же время, несмотря на некорректность использования термина "число конвейеров" в архитектуре графических процессоров семейства ATI Radeon X1000, необходимо отметить, что конвейерный способ построения изображения, применение отдельных вершинных и пиксельных процессоров остался неизменным. И хотя проблема оптимального распределения нагрузки между отдельными блоками GPU в архитектуре процессора ATI Radeon X1000 решена (хотя и не кардинально), данная архитектура не позволяет избавиться от еще одного недостатка конвейерной архитектуры GPU. Нередко возникает ситуация, когда уже частично обработанные данные необходимо изменить. Для этого приходится дожидаться завершения всего процесса конвейерной обработки данных, при котором конвейер работает впустую, обрабатывая данные, которые все равно придется изменять и обрабатывать повторно.
Недостатки конвейерной обработки данных в графических процессорах можно было бы решить, перейдя к архитектуре унифицированных процессоров, то есть когда не существует отдельных вершинных или пиксельных процессоров, а есть процессоры общего назначения, способные исполнять как вершинные, так и пиксельные шейдеры. Естественно, что для унифицированных процессоров потребуются и новые программы обработки, то есть шейдеры (Shader Model, SM). Унифицированные процессоры поддерживаются в API DirectX 10.
Список литературы
1. Пахомов С. Революция в мире графических процессоров // КомпьютерПресс, № 12, 2006.