Archiwa tagu: egpu bandwidth

Co tak naprawdę „zapycha” szynę w eGPU ?

PCI_Express_logo-660x268

Pytanie na które długo nie byłem sobie w stanie odpowiedzieć. To że skrócona szyna PCI-E do x1 2.0 w niektórych grach ograniczała wartość fps lub powodowała sporadyczne, lecz irytujące spadki wiedziałem od dawna. To że problemem była komunikacja CPU<->GPU przez tę szynę domyśliłem się niedawno. Ale co tak naprawdę powodowało, że szyna oferująca prawie 630MB/s w obie strony zapychała się, dowiedziałem się dopiero dzisiaj przy okazji testów gry Wolfenstein: The New Order opartej na OpenGL i silniku id Tech 5…

Wąskim gardłem jest procesor. A raczej wypełnienie obiektów teksturami przez procesor. Generalnie jest to całkowicie słuszna zmiana optymalizacyjna. Dzisiejsze gry w bardzo małym stopniu wykorzystują wielowątkowość procesora dlatego każda zmiana która odciąża kartę graficzną jest chwalebna. A przecież wypełnianie obiektów teksturami jest na tyle prostą czynnością, że procesor w zupełności powinien sobie z tym poradzić.

W przypadku eGPU optymalizacyjna zmiana „na plus” okazuje się jednak fatalną decyzją. Jeśli bowiem w VRAM mam zaalokowane 1GB tekstur to przesłanie ich do procesora przez skróconą szynę by ten je powstawiał, a potem przesłał efekt końcowy z powrotem do GPU musi spowodować gigantyczne spadki fps. Właśnie to obserwujemy w takich grach jak wspomniany wcześniej Wolfenstein: The New Order, Total War: Rome II, Total War: Shogun II, czy w dość ograniczonym na szczęście stopniu w serii Battlefield oraz Crysis 3.

Uściślając, problem występuje we wszystkich grach w których tekstury są wypełniane dynamicznie (tylko w obrębie pola naszego widzenia) przez CPU. Tam gdzie tekstury wstawiane są „na stałe” podczas „ekranu wczytywania” problem z szyną nie występuje. Do takich gier należy m.in. Natural Selection 2 (występuje tam tkz. „precaching”), seria Half Life (słynny „paseczek” między etapami nawet tej samej mapy) czy Metro: Last Light (również ekrany ładowania między misjami). Ciekawym wyjątkiem jest Wiedźmin 2, w którym tekstury również były nakładane „w tle” (przykładowo wejście do karczmy we Flotsam u mnie często najpierw wyświetlało „plastelinowe” obiekty, a sekundę potem właściwe tekstury). Podejrzewam jednak, że w naszej polskiej superprodukcji końcowym etapem wypełniania teksturami zajmuje się jednak GPU co by potwierdzało znikome użycie CPU.

W Wolfenstein: The New Order zaobserwowałem inne bardzo interesujące zjawisko – nawet na włączonej obsłudze tekstur przez CPU (vt_maxPFF >0) jeśli stanąłem w miejscu, nie poruszyłem myszą ani nie kliknąłem w klawiaturę to w ciągu 2 sekund fps z 10-15 rósł samoistnie do 60. Każda, nawet najmniejsza „zmiana stanu” powodowała drop z powrotem do 10-15fpsów. Wniosek – CPU na nowo musiał przeliczyć i powstawiać tekstury w „nowym polu widzenia”. Na szczęście engine zastosowany w tej grze pozwala przełączyć te operacje z powrotem na GPU co znacznie zwiększy ilość fps kosztem tego, że zapełnianie tychże obiektów teksturami potrwa dłużej (przez co przez ułamek sekundy możemy ujrzeć niewyraźne, „plastikowe” ściany).

Prognoza na przyszłość jest raczej dla eGPU niewesoła. Coraz więcej gier to sandboxy w których głównym zadaniem programistów jest ukryć wszelkie doczytywania lokacji i tekstur „w tle”. jeśli udział CPU w takich operacjach będzie częstszy, a engine gry nie pozwoli na zmianę w pliku konfiguracyjnym, będziemy mieć do czynienia z bardzo dużym ograniczeniem przez szynę w przypadku eGPU.