Jak działa pamięć podręczna tekstur w przypadku wielu jednostek cieniujących

11

Nowoczesne procesory graficzne mają wiele równoległych jednostek cieniujących. Chciałbym wiedzieć, jak w tym scenariuszu zarządzana jest pamięć podręczna tekstur.

Felipe Lira
źródło

Odpowiedzi:

14

Na najwyższym poziomie procesor graficzny jest podzielony na kilka rdzeni shaderów. Mały GPU w notebooku lub tablecie może mieć tylko kilka rdzeni, podczas gdy wysokiej klasy GPU na komputery stacjonarne może mieć kilkadziesiąt.

Oprócz rdzeni cieniujących istnieją również jednostki tekstur. Mogą być zgrupowane razem z jedną jednostką tekstury na rdzeń modułu cieniującego lub jedną jednostką tekstury współdzieloną między dwoma lub trzema rdzeniami modułu cieniującego, w zależności od GPU.

Cały układ współdzieli jedną pamięć podręczną L2, ale różne jednostki będą miały indywidualne pamięci podręczne L1. Jednostki tekstur mają pamięci podręczne tekstur, a jednostki cieniujące mają pamięć podręczną dla instrukcji i stałych / mundurów, a być może oddzielną pamięć podręczną dla danych bufora w zależności od tego, czy obciążenia bufora są oddzielną ścieżką od ładunków tekstury, czy nie (zależy od architektury GPU).

Jednostki tekstur działają niezależnie i asynchronicznie z rdzeniami modułu cieniującego. Gdy moduł cieniujący wykonuje odczyt tekstury, wysyła żądanie do jednostki tekstury przez małą magistralę między nimi; moduł cieniujący może następnie kontynuować wykonywanie, jeśli to możliwe, lub może zostać zawieszony i pozwolić na uruchomienie innych wątków modułu cieniującego, podczas gdy czeka na zakończenie odczytu tekstury.

Jednostka tekstur zbiera kilka żądań i wykonuje na nich matematykę adresowania - wybierając poziomy mip i anizotropię, przekształcając UV na współrzędne teksla, stosując tryby zaciskania / zawijania itp. Gdy już wie, które tekstury potrzebuje, odczytuje je hierarchia pamięci podręcznej, ten sam sposób, w jaki pamięć odczytuje działanie procesora (najpierw spójrz na L1, jeśli nie, to L2, a następnie DRAM). Jeśli wiele oczekujących żądań tekstury chce wszystkich takich samych lub pobliskich tekstur (jak często to robią), zyskujesz tutaj dużą wydajność, ponieważ możesz zaspokoić wiele oczekujących żądań za pomocą zaledwie kilku transakcji pamięci. Wszystkie te operacje są przetwarzane potokowo, więc podczas gdy jednostka teksturowa czeka na pamięć w jednej partii, może wykonywać matematykę adresowania dla kolejnej partii żądań i tak dalej.

Gdy dane wrócą, jednostka tekstur dekoduje skompresowane formaty, w razie potrzeby dokonuje konwersji i filtrowania sRGB, a następnie zwraca wyniki z powrotem do rdzenia modułu cieniującego.

Nathan Reed
źródło
1
Dzięki! To było bardzo pomocne. Ponowne zapisywanie stałej / jednolitej pamięci podręcznej. Czy są jakieś wskazówki poza precyzją (średnie, niskie), których mógłbym użyć, aby poprawić współczynnik trafień w pamięci podręcznej mundurów? Czy kolejność, w której deklaruję mundury, ma znaczenie (jeśli chodzi o szczelniejsze pakowanie)?
Felipe Lira,
2
Pakowanie @FilLira może mieć znaczenie, tak. Kompilator wstawi padding, aby zapobiec podziałowi wektorów na 16-bajtowe granice, więc spróbuj tego uniknąć. Nie sądzę, żeby medium / lowp faktycznie robi cokolwiek na mundurach, przynajmniej na GPU dla komputerów stacjonarnych (być może robi to na urządzeniach mobilnych). Jednak nie martwiłbym się zbytnio jednolitym współczynnikiem trafień w pamięci podręcznej. To niezwykle rzadko, jeśli w ogóle, wąskie gardło.
Nathan Reed