artykuły

PhysX by NVIDIA – analiza techniki i testy praktyczne

Physikoterapia

183
10 września 2010, 14:20 Mieszko Krzykowski

PhysX a optymalizacja, czyli czy dałoby się to zrobić lepiej

NVIDIA bardzo lubi się chwalić wykresami wydajności pokazującymi, ile razy szybciej gra z PhysX-em działa na GPU niż na CPU. Wokół tych wykresów i twierdzeń, jakoby fizyka liczona przez procesor była „martwa”, zawsze powstawały kontrowersje.

Pierwsza z nich wypłynęła przy grze Batman: Arkham Asylum. Okazało się, że niektórym udało się zmienić konfigurację gry w taki sposób, że została zmniejszona dokładność i jakość obliczeń związanych z PhysX-em, dzięki czemu potrzebowały one mniejszej mocy obliczeniowej. Efekt? Grywalna płynność rozgrywki z włączonym PhysX-em bez GeForce'a.

W grze możemy co prawda ustawić dwa różne stopnie skomplikowania efektów PhysX, ale żaden z nich nie jest dostosowany do działania na procesorze. A wygląda na to, że byłoby to możliwe. Zamiast tego mamy znikające flagi i obłoki pary po całkowitym wyłączeniu PhysX-a.

Następna wątpliwość wiąże się z tabelkami pokazującymi procentowe obciążenie procesora przez daną grę, które znajdowały się pod opisami efektów PhysX. Do tej pory nie komentowaliśmy tych zapisków, ale chyba nadszedł odpowiedni czas. Pomiary wykonywaliśmy na procesorze czterordzeniowym, czyli każde 25% obciążenia oznacza pełne wykorzystanie jednego rdzenia. Szybka analiza wyników jasno wskazuje, że GPU PhysX przerzucony na procesor jest jednowątkowy. Superwielowątkowy kod, który jest wykonywany na setkach rdzeni karty graficznej jednocześnie, po przerzuceniu na procesor umie wykorzystać tylko jeden rdzeń. W czasach gdy procesory graczy-entuzjastów mają od 4 do 12 wątków, trudno zaakceptować to, że znaczna część układu jedynie marnuje prąd. Najciekawsze jest to, że biblioteki PhysX same w sobie są wielowątkowe i udostępniają wiele różnych mechanizmów umożliwiających rozdzielenie pracy pomiędzy wiele rdzeni zwykłego procesora. W końcu PhysX jest multiplatformowy, a procesory konsolowe są wielowątkowe. Wielowątkowe procesory świetnie wykorzystuje na przykład najnowszy FluidMark. Umie on w stu procentach obciążyć tyle wątków procesora, ile sobie zażyczymy (no, prawie ;)).

Kliknij, aby zobaczyć cały obrazek.

Problem polega na tym, że domyślnie wszystkie wielowątkowe usprawnienia są wyłączone i to od twórców gier zależy, czy z nich skorzystają, a do tej pory żaden z nich tego nie zrobił. NVIDIA obiecuje, że od wersji 3.0 PhysX SDK wielowątkowość będzie domyślnie włączona, co powinno mocno poprawić sytuację.

Ostatnia kwestia wypłynęła dość niedawno dzięki bardzo ciekawej analizie w artykule na stronie Real World Technologies. Autor sprawdził, jakiego rodzaju instrukcje wykorzystuje kod PhysX, i na podstawie tego chciał zbadać zoptymalizowanie bibliotek pod kątem wykonywania obliczeń na współczesnych procesorach desktopowych. Okazało się, że PhysX to prawie wyłącznie instrukcje x87, które nie są zbyt optymalne w takich zastosowaniach, i że prawie w ogóle nie wykorzystuje instrukcji SSE, które dzięki wektorowym typom danych mogłyby nawet kilkukrotnie przyspieszyć wykonywanie niektórych obliczeń. Multiprocesory strumieniowe w kartach GeForce działają na podobnej zasadzie jak jednostki SSE w procesorach: pozwalają na wykonywanie tej samej instrukcji na kilku zestawach liczb w tym samym momencie. Jednostki SSE pozwalają na upakowanie w wektor czterech liczb zmiennoprzecinkowych pojedynczej precyzji (wykorzystywanych w obliczeniach przez PhysX) i wykonanie obliczeń na wszystkich jednocześnie przy użyciu jednej instrukcji. Bez wykorzystania tej możliwości każde z tych działań jest wykonywane oddzielnie, po kolei. A za rogiem czai się przecież Sandy Bridge i Bulldozer, które będą korzystały z instrukcji AVX, pozwalających na upakowanie aż ośmiu liczb zmiennoprzecinkowych pojedynczej precyzji. Nie wiadomo, jak mocno poprawiłoby wydajność użycie instrukcji SSE i pakowanie danych w wektory, ale wykorzystanie tej możliwości na pewno przyniosłoby znaczną poprawę płynności animacji. Współczesne procesory są bardzo mocno optymalizowane, aby jak najlepiej wykonywać tego rodzaju obliczenia, i niewykorzystywanie tego potencjału to spore przeoczenie. Tym bardziej że z instrukcjami SSE mamy do czynienia już od kilku lat i od dawna nie pojawiają się procesory pozbawione ich obsługi. NVIDIA obiecuje, że w przyszłości wprowadzi lepszą obsługę SSE w bibliotekach PhysX i że wtedy będziemy mogli sprawdzić, jak dobrze nasze procesory radzą sobie z PhysX-em.

Jest grupa osób, które uważają, że NVIDIA specjalnie obniża wydajność kodu PhysX wykonywanego na procesorze, aby pokazać, jak świetne są karty GeForce. My jesteśmy dalecy od takich wniosków. Rozumiemy, że w czasach powstawania fundamentów PhysX-a, gdy Ageia jeszcze była samodzielną firmą, wielowątkowość nie była tak ważna, a zachowanie kompatybilności wstecznej z procesorami niekorzystającymi z SSE – było. Rozumiemy też, że po kupieniu Agei przez NVIDI-ę inżynierowie tej drugiej skoncentrowali się przede wszystkim na optymalizowaniu kodu wykonywanego na karcie graficznej. Poza tym PhysX to przede wszystkim multiplatformowe biblioteki, które z GPU nie mają nic wspólnego, są wykorzystywane w grach działających na wszystkich konsolach i są podstawą symulacji fizyki w tak ważnym silniku jak Unreal Engine 3. Celowe spowalnianie wykonywania obliczeń byłoby strzałem w stopę, objawem... krańcowego idiotyzmu. Niestety, bardzo nam się nie podoba porównywanie wydajności świetnie zoptymalizowanego i „zwielowątkowionego” kodu wykonywanego na GPU z jednowątkowym i niezoptymalizowanym kodem wykonywanym na CPU. Jest to zabieg czysto marketingowy, który wprowadza w błąd. A bardzo nie lubimy, jak się nas robi w konia.

Wszystko wskazuje na to, że znakomitą większość efektów GPU PhysX spotykanych w dzisiejszych grach dałoby się wykonywać na współczesnym wielowątkowym procesorze i zachować przy tym zadowalającą płynność. Wystarczyłoby przygotować w grze profil wykorzystujący mniejszą liczbę cząsteczek do symulowania niektórych rzeczy, prawidłowo wykorzystać wielowątkowe procesory oraz lepiej zoptymalizować kod. NVIDIA obiecuje, że w przyszłych wersjach PhysX SDK zatroszczy się o optymalizację i wielowątkowość. Zapewnienie ustawień „przyjaznych procesorowi” należy już do twórców gier. Mamy nadzieję, że w przyszłych PhysX-owych hitach nie będzie już takich kontrowersji i będą one prawidłowo korzystały z potencjału procesorów. Ale – „niestety” – może się wtedy okazać, że nikt już nie będzie rozważał kupienia geforce'a z powodu PhysX-a, bo będzie on dostępny dla wszystkich.

11