Analizowanie wydajności pamięci

Charakterystyka wykorzystania pamięci przez aplikację jest podstawowym aspektem jej wydajności. Aby przeanalizować te cechy, możesz użyć profilera systemu, sprawdzając dostępne informacje o licznikach GPU.

Urządzenia Adreno

Na urządzeniach z układem Adreno zacznij od wyróżnienia okresu odpowiadającego pojedynczej klatce GPU, zgodnie z opisem w sekcji Szacowanie czasu przetwarzania klatki przez CPU i GPU. Skorzystaj z techniki opisanej na tej stronie, która polega na użyciu licznika % wykorzystania GPU lub podobnego licznika do śledzenia granic czasu renderowania klatki, ponieważ wszystkie liczniki śledzenia używają tej samej techniki pomiaru czasu i umożliwiają dokładniejsze oszacowanie wykorzystania pamięci (w porównaniu z używaniem granic czasu renderowania klatki pochodzących z wycinków GPU, których dane są zbierane niezależnie od danych licznika śledzenia).

Pasek wykorzystania dopasowany do odpowiednich liczników poniżej
Rysunek 1. Ścieżka wykorzystania dopasowana do odpowiednich liczników poniżej

Łączna liczba odczytów i zapisów

Po wyróżnieniu pojedynczej klatki w profilerze zacznij od sprawdzenia liczników Łączna liczba odczytanych bajtów (bajtów/s)Łączna liczba zapisanych bajtów (bajtów/s). Te liczniki zapewniają dobry ogólny wgląd w to, ile danych jest przesyłanych przez magistralę pamięci w ciągu jednej klatki. Staraj się minimalizować ilość danych przesyłanych przez magistralę, ponieważ przepustowość pamięci jest głównym źródłem zużycia baterii na urządzeniach mobilnych.

Łączna liczba odczytów i zapisów
Rysunek 2. Odczyt i zapis łącznych liczników

Możesz też sprawdzić liczniki Odczyt pamięci wierzchołków (bajty/sekundę)Odczyt pamięci tekstur (bajty/sekundę), aby określić część przepustowości wykorzystywaną na dane wierzchołków i tekstur.

Liczniki odczytu pamięci wierzchołków i tekstur
Rysunek 3. Liczniki odczytu pamięci wierzchołków i tekstur

To, co uznasz za „dobre” wartości, zależy od rodzaju zadań wykonywanych w Twojej aplikacji. Na przykład aplikacje 2D mogą wykorzystywać stosunkowo dużą (~2+ GB/s) przepustowość odczytu pamięci tekstur, ale przepustowość pamięci wierzchołków może być bardzo mała (~50 MB/s). Więcej informacji znajdziesz w dokumentacji Analizowanie przepustowości pamięci wierzchołkówAnalizowanie wykorzystania przepustowości pamięci tekstur.

Pobieranie budek

Sprawdź liczniki % Vertex Fetch Stall, % Texture Fetch Stall% Stall on System Memory, ponieważ dostarczą Ci one wskazówek dotyczących ogólnej wydajności pamięci aplikacji. Jeśli wartości są wyższe niż około 5%, oznacza to, że aplikacja nie układa danych w pamięci w wydajny sposób lub nie uzyskuje do nich dostępu w wydajny sposób, aby wykorzystać pamięć podręczną. Szczegółowe informacje o zwiększaniu wykorzystania pamięci w przypadku tych typów zasobów znajdziesz w sekcjach Analizowanie przepustowości pamięci wierzchołkówAnalizowanie wykorzystania przepustowości pamięci tekstur.

Liczniki wstrzymania pamięci
Rysunek 4. Liczniki wstrzymania pamięci

Urządzenia Mali

Na urządzeniach Mali zacznij od wyróżnienia okresu czasu odpowiadającego pojedynczej klatce GPU, zgodnie z opisem w sekcji Szacowanie czasu przetwarzania klatki przez CPU i GPU. Skorzystaj z techniki opisanej na tej stronie, która polega na użyciu licznika % wykorzystania GPU lub podobnego licznika do śledzenia granic czasu renderowania klatki, ponieważ wszystkie liczniki śledzenia używają tej samej techniki pomiaru czasu i umożliwiają dokładniejsze oszacowanie wykorzystania pamięci (w porównaniu z używaniem granic czasu renderowania klatki pochodzących z wycinków GPU, których dane są zbierane niezależnie od danych licznika śledzenia).

Wykres wykorzystania dopasowany do liczników, które Cię interesują
Rysunek 5. Ścieżka wykorzystania dopasowana do liczników, które Cię interesują

Wyświetlanie zewnętrznych sum częściowych

Po wyróżnieniu pojedynczej klatki w profilerze systemu zacznij od sprawdzenia liczników Output External Read bytes (Wyjściowe bajty odczytu zewnętrznego) i Output External Write bytes (Wyjściowe bajty zapisu zewnętrznego). Te liczniki zapewniają ogólny wgląd w to, ile danych jest przesyłanych przez magistralę pamięci w ciągu jednej klatki. Staraj się minimalizować ilość danych przesyłanych przez magistralę, ponieważ przepustowość pamięci jest głównym źródłem zużycia baterii na urządzeniach mobilnych.

Ścieżki licznika zewnętrznego
Rysunek 6. Ścieżki licznika zewnętrznego danych wyjściowych

Wpisywanie wewnętrznych sum

Dostępne są też liczniki, które dostarczają informacji o samych pamięciach podręcznych. Interesujące Cię liczniki to „Input internal [read|write] stall cycles” (Cykle wstrzymania wewnętrznego [odczytu|zapisu] danych wejściowych). Wyższe wartości tych liczników oznaczają, że pamięć podręczna działa prawidłowo, ale jest zbyt wiele żądań odczytu, w wyniku czego kod shadera jest wstrzymywany w oczekiwaniu na dostęp do pamięci.

Śledzenie liczników wewnętrznych danych wejściowych
Rysunek 7. Wprowadzanie ścieżek wewnętrznego licznika

Pobieranie budek

Kolejne liczniki, na które warto zwrócić uwagę, to Vertex Prefetcher Stall CyclesTexture Fetch Stall. Dostarczą one wskazówek dotyczących ogólnej wydajności pamięci aplikacji. Jeśli widzisz wartości wyższe niż około 5%, oznacza to, że nie układasz naszych danych w pamięci w wydajny sposób lub nie uzyskujesz do nich dostępu w wydajny sposób, aby korzystać z pamięci podręcznej. Więcej informacji o tym, jak zmniejszyć wykorzystanie pamięci w przypadku tych typów komponentów, znajdziesz w artykułach Analizowanie przepustowości pamięci [wierzchołków|tekstur].

Śledzenie licznika Fetch Stalls
Rysunek 8. Pobieranie liczników wstrzymania