在使用Android 4.4和Android 4.4.1的Nexus 5中,Renders脚本pow(),powr()和pown()在GPU上非常慢

时间:2013-12-10 05:40:51

标签: android renderscript

可以肯定的是,我在以下两个开发设置中测试了我的代码:

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图像运行此脚本,则GPU上需要1927ms。如果我使用adb强制代码在CPU上运行,它只需要10ms到12ms。如果我注释掉pow()函数,它将在CPU和GPU中快速运行。我也尝试了替代的powr()和pown()函数,结果是一样的。我还试图包括:

#include "rs_cl.rsh"

结果是一样的。

我想知道这是否是预期的行为。提前谢谢。

1 个答案:

答案 0 :(得分:2)

两件事:

    由于精度要求,
  1. pow()和类似功能在GPU上通常非常慢。如果您的精度要求不那么严格,那么您可以使用native_pow(),这通常显着更快。

  2. 如果你注释掉pow(),你可能不会做任何事情,除了memcpy。在这些情况下,编译器会优化很多,但是,pow()非常慢。