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!

questionAnswers(1)

yourAnswerToTheQuestion