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