Недоліки класичного графічного конвеєра

Історія розвитку графічних процесорів досі йшла в одному напрямку - збільшувалося число конвеєрів. Поняття "конвеєр" є стійким, але його не можна вважати суворим технічним терміном. Справа в тому, що в графічному процесорі використовуються різні конвеєри, які виконують відрізняються один від одного функції. У цьому сенсі більш правильно говорити про вершинних або піксельних конвеєрах, але не про конвеєрах взагалі. Раніше під конвеєром розуміли піксельний процесор, який був підключений до свого блоку накладення текстур (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.