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.
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.
Odpowiedzi:
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.