Dlaczego próbka przetwarzania obrazów Google Renderscript działa wolniej na GPU w Nexusie 5
Chciałbym podziękować Stephenowi za bardzo szybką odpowiedź w poprzednim poście. To jest pytanie uzupełniające dla tego postaDlaczego bardzo prosty Renderscript działa 3 razy wolniej w GPU niż w CPU
Moja platforma dev wygląda następująco
Development OS: Windows 7 32-bit
Phone: Nexus 5
Phone OS version: Android 4.4
SDK bundle: adt-bundle-windows-x86-20131030
Build-tool version: 19
SDK tool version: 22.3
Platform tool version: 19
W celu oceny wydajności obliczeń na GPU Renderscript i uchwycenia ogólnej sztuczki polegającej na szybszym tworzeniu kodu przez Renderscript, wykonałem następujący test.
Sprawdziłem kod z otwartego projektu Google Android, używając tagu android-4.2.2_r1.2. Użyłem tego tagu po prostu dlatego, że próbka ImageProcessing nie jest dostępna w nowszej wersji.
Następnie użyłem tego projektu w ramach „testów podstawowych RenderScriptTests Processing” w teście. Nagrałem wydajność uruchamiania kodu na GPU, a także procesor, a wydajność jest podana poniżej.
GPU CPU
Levels Vec3 Relaxed 7.45ms 14.89ms
Levels Vec4 Relaxed 6.04ms 12.85ms
Levels Vec3 Full N/A 28.97ms
Levels Vec4 Full N/A 35.65ml
Blur radius 25 203.2ms 245.60ms
Greyscale 7.16ms 11.54ms
Grain 33.33ms 21.73ms
Fisheye Full N/A 51.55ms
Fisheye Relaxed 92.90ms 45.34ms
Fisheye Approx Full N/A 51.65ms
Fisheye Approx Relaxed 93.09ms 39.11ms
Vignette Full N/A 44.17ms
Vignette Relaxed 8.02ms 46.68ms
Vignette Approx Full N/A 45.04ms
Vignette Approx Relaxed 8.20ms 43.69ms
Convolve 3x3 37.66ms 16.81ms
Convolve 3x3 Intrinsics N/A 4.57ms
ColorMatrix 5.87ms 8.26ms
ColorMatrix Intrinsics N/A 2.70ms
ColorMatrix Intinsics Grey N/A 2.52ms
Copy 5.59ms 2.40ms
CrossProcess(using LUT) N/A 5.74ms
Convolve 5x5 84.25ms 46.59ms
Convolve 5x5 Intrinsics N/A 9.69ms
Mandelbrot N/A 50.2ms
Blend Intrinsics N/A 21.80ms
N / A w tabeli jest spowodowane przez pełną precyzję lub rs intrinsics nie działa na GPU. Widzimy, że wśród 13 algorytmów działających na GPU 6 z nich działa wolniej na GPU. Ponieważ taki kod został napisany przez Google, uważam to zjawisko za warte zbadania. Przynajmniej „zakładam, że kod będzie działał szybciej na GPU”Renderscript i GPU nie trzyma się tutaj.
Zbadałem niektóre algorytmy z listy, chciałbym wspomnieć o dwóch.
W Vignette wydajność GPU jest znacznie lepsza, odkryłem, że była używana przez wywołanie kilku funkcji w rs_cl.rsh. Jeśli skomentuję te funkcje, procesor będzie działał szybciej (zobacz moje poprzednie pytanie na górze w przypadku ekstremalnych przypadków). Więc pytanie brzmi: dlaczego tak się dzieje. W rs_cl.rsh większość funkcji jest związanych z matematyką, np. exp, log, cos itd. Dlaczego taka funkcja działa dużo szybciej na GPU, czy to dlatego, że implementacja tych funkcji jest w rzeczywistości wysoka równolegle lub tylko dlatego, że implementacja wersji działa na GPU jest lepsza niż wersja działa na CPU?
Innym przykładem jest conv3x3 i conv5x5. Chociaż w tej aplikacji testowej istnieją inne bardziej sprytne wdrożenia niż wersja Google, myślę, że ta implementacja Google'a na pewno nie jest zła. Próbuje zminimalizować operację dodawania i korzysta z niektórych funkcji ułatwiających z rs_cl.rsh, takich jak convert_float4 (). Więc na pierwszy rzut oka zakładam, że będzie działać szybciej na GPU. Jednak działa dużo wolniej (zarówno na Nexusie 4, jak i 5 przy użyciu GPU Qualcomm). Myślę, że ten przykład jest bardzo reprezentatywny, ponieważ w implementacji algorytm musi uzyskać dostęp do pikseli w pobliżu bieżącego piksela. Taka operacja jest dość powszechna w wielu algorytmach przetwarzania obrazu. Jeśli implementacja, taka jak splot 2D, nie może być wykonana szybciej w GPU, podejrzewam, że wiele innych algorytmów ucierpi na tym samym. Byłoby bardzo cenione, gdyby można było zidentyfikować problem i zasugerować kilka sposobów na szybsze tworzenie takich algorytmów.
Bardziej ogólne pytanie, biorąc pod uwagę wynik testu, który pokazałem, chciałbym zapytać, jakiego rodzaju kryteria powinni postępować ludzie, aby uzyskać wyższą wydajność i uniknąć degradacji wydajności w jak największym stopniu. W końcu cel wydajności jest drugim najważniejszym celem Renderscript i myślę, że przenośność RS jest całkiem dobra.
Dziękuję Ci!