Почему этот пример обработки изображений Google Renderscript работает медленнее на графическом процессоре в Nexus 5

Я хотел бы поблагодарить Стивена за очень быстрый ответ в предыдущем посте. Это дополнительный вопрос для этого постаПочему очень простой Renderscript работает в 3 раза медленнее в GPU, чем в CPU

Моя платформа разработки выглядит следующим образом

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

Чтобы оценить производительность вычислений на GPU в Renderscript и понять общую хитрость ускорения кода с помощью Renderscript, я провел следующий тест.

Я проверил код из проекта Android с открытым исходным кодом Google, используя тег android-4.2.2_r1.2. Я использовал этот тег просто потому, что тестовый образец ImageProcessing недоступен в более новой версии.

Затем я использовал проект под «base \ tests \ RenderScriptTests \ ImageProcessing» в тесте. Я записал производительность бегущего кода на GPU, а также CPU, и производительность указана ниже.

                         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 в таблице вызвано либо полной точностью, либо rs intrinsics не работает на GPU. Мы видим, что среди 13 алгоритмов, работающих на GPU, 6 из них работают медленнее на GPU. Поскольку такой код был написан Google, я считаю, что это явление заслуживает отдельного изучения. По крайней мере, «я предполагаю, что код будет работать быстрее на GPU», который я видел изRenderscript и GPU здесь не держится

Я исследовал некоторые алгоритмы в списке, я хотел бы упомянуть два.

В Vignette производительность на GPU намного лучше, я обнаружил, что это было использовано при вызове нескольких функций в rs_cl.rsh. Если я закомментирую эти функции, процессор будет работать быстрее (см. Мой предыдущий вопрос в верхней части для крайнего случая). Поэтому вопрос в том, почему это происходит. В rs_cl.rsh большинство функций связаны с математикой, например, exp, log, cos и т. д. Почему такая функция выполняется намного быстрее в графическом процессоре, это потому, что реализация этих функций на самом деле параллельна или просто потому, что реализация версии работает на графическом процессоре лучше, чем версия на процессоре?

Другой пример - conv3x3 и conv5x5. Хотя в этом тестовом приложении есть и более умная реализация, чем версия Google, я думаю, что эта реализация от Google, безусловно, неплохая. Он пытается минимизировать операцию сложения и использует некоторую вспомогательную функцию из rs_cl.rsh, такую как convert_float4 (). Итак, на первый взгляд, я предполагаю, что он будет работать быстрее на GPU. Тем не менее, он работает намного медленнее (на Nexus 4 и 5 оба используют графический процессор Qualcomm). Я думаю, что этот пример очень показателен, так как в реализации алгоритму необходим доступ к пикселям рядом с текущим пикселем. Такая операция довольно распространена во многих алгоритмах обработки изображений. Если реализация, такая как двумерная свертка, не может быть выполнена быстрее в GPU, я подозреваю, что многие другие алгоритмы пострадают от этого. Буду очень признателен, если вы сможете определить, в чем проблема, и предложить несколько способов сделать такие алгоритмы быстрее.

Более общий вопрос заключается в том, что, учитывая результаты теста, которые я показал, я хотел бы спросить, по каким критериям должны следовать люди, чтобы получить более высокую производительность и максимально избежать снижения производительности. В конце концов, цель производительности - вторая по важности цель Renderscript, и я думаю, что переносимость RS довольно хорошая.

Спасибо!

Ответы на вопрос(0)

Ваш ответ на вопрос