渲染脚本pow()、powr()和pown()在Android 4.4和Android 4.4.1的Nexus 5的GPU上非常慢。

问题描述 投票:1回答: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的图像运行这个脚本,在GPU上需要1927ms。如果我使用adb强制代码在CPU上运行,它只需要10ms到12ms。如果我注释掉pow()函数,它在CPU和GPU上都能快速运行。我还尝试了替代的powr()和pown()函数,结果是一样的。我还尝试了包含:

#include "rs_cl.rsh"

结果也是一样的

我想知道这是否是预期的行为。先谢谢你。

android renderscript
1个回答
3
投票

两件事情。

  1. pow()和类似的函数由于精度要求,在GPU上一般都很慢,如果你对精度要求不那么严格,可以使用native_powr(),这通常是指 大幅 更快。

  2. 如果你把pow()注释掉,除了memcpy之外,你可能什么都不做。在这些情况下,编译器会优化掉很多,但是是的,pow()非常慢。

© www.soinside.com 2019 - 2024. All rights reserved.