Сучасні графічні процесори мають багато блоків паралельного затінення. Я хотів би знати, як кеш текстури керується в цьому сценарії.
Сучасні графічні процесори мають багато блоків паралельного затінення. Я хотів би знати, як кеш текстури керується в цьому сценарії.
Відповіді:
На верхньому рівні GPU підрозділяється на ряд шейдерних ядер. Невеликий графічний процесор у ноутбуці чи планшеті може мати лише декілька ядер, в той час як високоякісний графічний процесор може мати десятки.
Крім шейдерних стрижнів є також текстурні одиниці. Вони можуть бути згруповані разом з однією текстурною одиницею на одне ядро шейдера або однією текстурною одиницею, поділеною між двома або трьома шейдерними ядрами, залежно від GPU.
Весь чіп розділяє один кеш L2, але різні одиниці матимуть окремі кеші L1. Текстурні блоки мають кешові текстури, а шейдерні блоки мають кеші для інструкцій та констант / уніформи, а може бути і окремий кеш для даних буфера, залежно від того, буферні навантаження є окремим шляхом від текстурних навантажень чи ні (залежить від архітектури GPU).
Текстурні блоки працюють незалежно та асинхронно від шейдерних ядер. Коли шейдер виконує зчитування текстури, він надсилає запит до блоку текстур через невелику шину між ними; Шейдер може продовжувати виконувати, якщо це можливо, або він може призупинитися і дозволити виконувати інші нитки шейдера, поки він чекає, коли текстура прочитає тексту.
Текстурна одиниця збирає купу запитів і виконує адресацію математики на них - вибираючи мип-рівні та анізотропію, перетворюючи УФ-сигнали в текстові координати, застосовуючи режими затискання / загортання і т.д. ієрархія кеша, так само, як читання пам'яті працює на процесорі (спочатку подивіться в L1, якщо не там, то L2, то DRAM). Якщо багато запитуючих текстур, що очікують, всі хочуть однакових або розташованих поруч текстів (як це часто робиться), то ви отримуєте тут велику ефективність, оскільки ви можете задовольнити багато очікувані запити лише за допомогою декількох транзакцій пам'яті. Усі ці операції є конвеєрними, тому, хоча блок текстури чекає пам’яті на одній партії, він може робити математику адресації для іншої партії запитів тощо.
Після повернення даних, блок текстури декодує стислі формати, за необхідності виконує перетворення sRGB та фільтрування, а потім повертає результати до ядра шейдера.