¿Por qué el ejemplo de procesamiento de imágenes de Google Renderscript se ejecuta más lentamente en GPU en Nexus 5?

Me gustaría agradecer a Stephen por la rápida respuesta en un post anterior. Esta es una pregunta de seguimiento para esta publicación.Por qué Renderscript muy simple se ejecuta 3 veces más lento en GPU que en CPU

Mi plataforma de desarrollo es la siguiente

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

Para evaluar el rendimiento del cálculo de GPU de Renderscript y comprender el truco general de hacer que el código sea más rápido con Renderscript, hice la siguiente prueba.

Revisé el código del proyecto de código abierto para Android de Google, usando la etiqueta android-4.2.2_r1.2. Utilicé esta etiqueta simplemente porque la muestra de prueba ImageProcessing no está disponible en la versión más reciente.

Luego utilicé el proyecto bajo "base \ tests \ RenderScriptTests \ ImageProcessing" en la prueba. Grabé el rendimiento del código de ejecución en GPU, así como la CPU y el rendimiento se detalla a continuación.

                         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

El N / A en la tabla se debe a que la precisión completa o rs intrinsics no se ejecuta en GPU. Podemos ver que entre los 13 algoritmos que se ejecutan en la GPU, 6 de ellos se ejecutan más lentamente en la GPU. Dado que dicho código fue escrito por Google, consideraría que vale la pena investigar este fenómeno. Al menos, "asumo que el código se ejecutará más rápido en la GPU" que vi desdeRenderscript y la GPU no aguanta aqui

Investigué algunos de los algoritmos de la lista, me gustaría mencionar dos.

En Vignette, el rendimiento en GPU es mucho mejor, encontré que esto se usó invocando varias funciones dentro de rs_cl.rsh. Si comento esas funciones, la CPU se ejecutará más rápido (vea mi pregunta anterior en la parte superior para un caso extremo). Entonces la pregunta es por qué sucede esto. En rs_cl.rsh, la mayoría de las funciones están relacionadas con las matemáticas, por ejemplo, exp, log, cos, etc. ¿Por qué esta función se ejecuta mucho más rápido en la GPU? ¿Esto se debe a que la implementación de esas funciones es realmente paralela o porque la implementación de la versión en la GPU es mejor que la versión en la CPU?

Otro ejemplo es conv3x3 y conv5x5. Aunque hay otra implementación más inteligente que la versión de Google en esta aplicación de prueba, creo que esta implementación de Google ciertamente no es mala. Intenta minimizar la operación de adición y usa alguna función de facilitación de rs_cl.rsh como convert_float4 (). Así que de un vistazo, asumo que se ejecutará más rápido en GPU. Sin embargo, se ejecuta mucho más lento (en Nexus 4 y 5, ambos utilizando la GPU de Qualcomm). Creo que este ejemplo es muy representativo ya que en la implementación, el algoritmo necesita acceder a los píxeles cerca del píxel actual. Dicha operación es bastante común en muchos algoritmos de procesamiento de imágenes. Si la implementación como la convolución 2D no se puede hacer más rápido en GPU, sospecho que hay muchos otros algoritmos que sufrirían lo mismo. Le agradeceríamos mucho que pudiera identificar dónde está el problema y sugerir algunas formas de hacer que dichos algoritmos sean más rápidos.

La pregunta más general es que, dado el resultado de la prueba que mostré, me gustaría preguntar qué tipo de criterios deben seguir las personas para obtener el mayor rendimiento y evitar la degradación del rendimiento tanto como sea posible. Después de todo, el objetivo de rendimiento es el segundo objetivo más importante de Renderscript y creo que la portabilidad de RS es bastante buena.

¡Gracias!

Respuestas a la pregunta(1)

Su respuesta a la pregunta