2013-12-10 2 views
0

Чтобы быть уверенным, я проверил мой код в следующих двух параметрах Dev:Renderscript пау(), POWR() и pown() очень медленно на GPU в Nexus 5 с ОС Android 4.4 и Android 4.4.1

Development OS: Windows 7 32-bit 
Phone: Nexus 5 
Phone OS version: Android 4.4 and Android 4.4.1 
SDK bundle: adt-bundle-windows-x86-20131030 
Build-tool version: 19 
SDK tool version: 22.3 
Platform tool version: 19 

и

Development OS: Windows 7 32-bit 
Phone: Nexus 5 
Phone OS version: Android 4.4 and Android 4.4.1 
SDK bundle: adt-bundle-windows-x86-20130729 
Build-tool version: 18.1 
SDK tool version: 22.2.1 
Platform tool version: 18.0.1 

код также очень прост, как следует

#pragma rs_fp_relaxed 
uchar4 __attribute__((kernel)) sample(uchar4 in, uint32_t x, uint32_t y){ 
    const float4 fin = convert_float4(in); 
    float tmp = pow(2.f, 2.f); // very slow on GPU 
    fin.x = tmp; 
    return convert_uchar4(fin); 
} 

код будет автоматически работать на GPU. Однако проблема, с которой я столкнулся, была, функция pow() очень медленная. Если я запустил этот скрипт с разрешением 1600 * 1067, он займет 1927 мс на графическом процессоре. Если я использую adb для принудительного запуска кода на CPU, он будет принимать только 10 мс до 12 мс. Если я прокомментирую функцию pow(), она будет работать быстро и в CPU, и в GPU. Я также попробовал альтернативные функции powr() и pown(), и результат был таким же. И я также попытался включить:

#include "rs_cl.rsh" 

и результат был таким же.

Мне интересно, является ли это ожидаемым поведением. Заранее спасибо.

ответ

2

две вещи:

  1. пау() и аналогичные функции, как правило, очень медленно, на графических процессорах из-за требований точности. вы можете использовать native_pow(), если у вас есть менее строгие требования к точности, что часто резко быстрее.

  2. Если вы закомментируете pow(), возможно, вы ничего не делаете, кроме memcpy. в этих случаях компилятор будет очень много оптимизировать, но да, pow() очень медленный.

+0

Было бы хорошо знать, как определяется «native_pow()». Если я попытаюсь использовать его, я просто получаю функцию, которая не существует. – TSGames

+0

@TSGames На самом деле это ** native_powr() **, это не видно в документации, но доступно. '01066 _RS_RUNTIME float __attribute __ ((перегружаемый)) native_powr (float v, float y); 01067 FN_FUNC_FN_FN (native_powr) ' [ссылка] (http://developer.android.com/reference/renderscript/rs__cl_8rsh_source.html) –

Смежные вопросы