Почему этот пример обработки изображений 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, я провел следующий тест.

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

Тогда я использовал проект под "база \ Тесты \ RenderScriptTests \ обработка изображений» в тесте. Я записал производительность бегущего кода на 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С версией S в этом тестовом приложении, я думаю, что эта реализация от Google, конечно, не плохо. Он пытается минимизировать операцию сложения и использует некоторую вспомогательную функцию из rs_cl.rsh, такую как convert_float4 (). Итак, на первый взгляд, я предполагаю, что он будет работать быстрее на GPU. Тем не менее, он работает намного медленнее (на Nexus 4 и 5 оба используют Qualcomm 'с GPU). Я думаю, что этот пример очень показателен, так как в реализации алгоритму необходим доступ к пикселям рядом с текущим пикселем. Такая операция довольно распространена во многих алгоритмах обработки изображений. Если реализация, как 2D свертка можетя думаю, что быстрее в GPUМногие другие алгоритмы пострадают так же. Буду очень признателен, если вы сможете определить, в чем проблема, и предложить несколько способов сделать такие алгоритмы быстрее.

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

Спасибо!

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

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