Как работает Texture Cache с учетом нескольких шейдерных блоков


11

Современные графические процессоры имеют много параллельных блоков затенения. Я хотел бы знать, как кеш текстуры управляется в этом сценарии.

Ответы:


14

На верхнем уровне графический процессор подразделяется на несколько шейдерных ядер. Небольшой графический процессор в ноутбуке или планшете может иметь всего несколько ядер, в то время как высокопроизводительный графический процессор для настольных компьютеров может иметь десятки.

Помимо ядер шейдеров существуют также текстурные блоки. Они могут быть сгруппированы вместе с одним текстурным модулем на ядро ​​шейдера или одним текстурным модулем, совместно используемым двумя или тремя шейдерными ядрами, в зависимости от графического процессора.

Весь чип совместно использует один кэш L2, но разные блоки будут иметь отдельные кэш L1. Единицы текстуры имеют кеши текстур, а шейдерные блоки имеют кеши для инструкций и констант / униформ, и, возможно, отдельный кеш для данных буфера в зависимости от того, являются ли загрузки буфера отдельным путем от загрузок текстуры или нет (зависит от архитектуры графического процессора).

Текстурные блоки работают независимо и асинхронно от шейдерных ядер. Когда шейдер выполняет чтение текстуры, он отправляет запрос к текстурному блоку через небольшую шину между ними; затем шейдер может продолжить выполнение, если это возможно, или он может быть приостановлен и позволить другим потокам шейдера работать, пока он ожидает завершения чтения текстуры.

Текстурный блок объединяет несколько запросов и выполняет по ним математику адресации: выбирает уровни mip и анизотропию, конвертирует UV в координаты текселей, применяет режимы зажима / обтекания и т. Д. Как только он узнает, какие тексели ему нужны, он читает их через иерархия кэша, так же, как чтение памяти работает на CPU (сначала посмотрите на L1, если не там, то на L2, затем на DRAM). Если для многих ожидающих запросов на текстуру требуется один и тот же или близлежащий тексель (как они часто делают), то вы получаете большую эффективность, поскольку вы можете удовлетворить многие ожидающие запросы с помощью всего лишь нескольких транзакций памяти. Все эти операции конвейерны, поэтому, пока текстурный модуль ожидает память для одного пакета, он может выполнять математику адресации для другого пакета запросов и так далее.

Как только данные возвращаются, текстурный модуль декодирует сжатые форматы, выполняет преобразование и фильтрацию sRGB по мере необходимости, а затем возвращает результаты обратно в ядро ​​шейдера.


1
Спасибо! Это было действительно полезно. Регистрируем константы / равномерный кеш. Есть ли у них какие-либо советы, кроме точности (mediump, lowp), которые я мог бы использовать для улучшения коэффициента попадания в кэш униформы? Имеет ли значение порядок, в котором я объявляю униформу (как для более плотной упаковки)?
Фелипе Лира

2
@PhilLira Упаковка может иметь значение, да. Компилятор вставит заполнение, чтобы не допустить разделения векторов по 16-байтовым границам, поэтому постарайтесь избежать этого. Я не думаю, что mediump / lowp на самом деле что-то делает с униформой, по крайней мере с настольными графическими процессорами (возможно, с мобильными). Я бы не стал слишком беспокоиться о равномерном коэффициенте попадания в кэш. Это очень редко, если вообще, узкое место.
Натан Рид
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.