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