可以肯定的是,我在以下两个开发设置中测试了我的代码:
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"
结果是一样的。
我想知道这是否是预期的行为。提前谢谢。
答案 0 :(得分:2)
两件事:
pow()和类似功能在GPU上通常非常慢。如果您的精度要求不那么严格,那么您可以使用native_pow(),这通常显着更快。
如果你注释掉pow(),你可能不会做任何事情,除了memcpy。在这些情况下,编译器会优化很多,但是,pow()非常慢。