BVH z Rozdziału 13 zmniejsza liczbę testów na promień. Ten rozdział pyta o coś innego: jak policzyć miliony niezależnych promieni na raz, nie jeden po drugim.
Policzenie koloru piksela (x,y) nie zależy od koloru piksela (x+1,y). Ta niezależność, rzadka w informatyce, nazywana bywa „embarrassingly parallel” — i to właśnie dzięki niej ray tracing skaluje się tak dobrze na wiele rdzeni. Najprostsza strategia na CPU: podziel obraz na kafle (np. 32×32 piksele), przydziel kafle do puli wątków, każdy wątek liczy swój kafel od początku do końca, niezależnie od innych.
GPU wykonuje grupy wątków (warp/wavefront, zwykle 32) tą samą instrukcją naraz, na różnych danych (SIMT). Świetnie, gdy wszystkie promienie w warpie robią to samo. Katastrofalnie, gdy się rozjeżdżają: jeśli część promieni trafia w szkło (Rozdział 7), a część w diffuse (Rozdział 5), GPU musi wykonać oba fragmenty kodu dla całego warpu — wątki, które nie potrzebują danej ścieżki, po prostu czekają. To centralny problem GPU ray tracingu, którego rasteryzacja (jeden shader na cały trójkąt) w większości unika.
Nowoczesne GPU renderery (OptiX, silniki „wavefront”/„streaming”) nie prowadzą jednego promienia przez cały pipeline w jednym wątku. Zamiast tego przetwarzają całe partie promieni etapami: wszystkie testy przecięcia naraz, potem sortowanie promieni po typie materiału, potem shading — jeden kernel na materiał, tylko dla promieni, które go potrzebują. To ten sam pipeline z Rozdziału 1, tylko rozbity na kolejkę zamiast rekurencji.
To dlatego renderery GPU (Redshift, Cycles GPU, Arnold GPU, V-Ray GPU) czasem renderują pewne typy materiałów — SSS, włosy, wolumetria — wolniej względem CPU niż prosty diffuse: te ścieżki kodu są z natury bardziej rozbieżne.
Ustawienia „liczba wątków” / „CPU threads” w Twoim DCC to dosłownie rozmiar puli wątków z tego rozdziału. Więcej wątków pomaga tylko do liczby rdzeni fizycznych — powyżej tego, wątki zaczynają sobie nawzajem zabierać czas procesora.
Wydajność mamy już pod kontrolą. W następnym rozdziale wracamy do samego światła: path tracing i metody Monte Carlo — jak policzyć równanie renderowania, które opisuje absolutnie każdy efekt świetlny z tej książki jednym wzorem.