为了确定,我在以下两个开发设置中测试了我的代码。
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"
结果也是一样的
我想知道这是否是预期的行为。先谢谢你。
两件事情。
pow()和类似的函数由于精度要求,在GPU上一般都很慢,如果你对精度要求不那么严格,可以使用native_powr(),这通常是指 大幅 更快。
如果你把pow()注释掉,除了memcpy之外,你可能什么都不做。在这些情况下,编译器会优化掉很多,但是是的,pow()非常慢。