我的测试平台:
Development OS: Windows 7 32-bit
Phone: Nexus 5
Phone OS version: Android 4.4
SDK bundle: adt-bundle-windows-x86-20131030
Build-tool version: 19
SDK tool version: 22.3
Platform tool version: 19
我写了一个非常简单的Renderscript如下:
#pragma rs_fp_relaxed
uchar4 __attribute__((kernel)) someKernel(uchar4 in, uint32_t x, uint32_t y){
return in;
}
我也使用
adb shell setprop debug.rs.default-CPU-driver 1
以强制脚本在CPU上运行以进行性能比较。
在计算运行时间之前,我还使用了让脚本运行一小段时间进行预热。
为了确保我知道代码是在GPU上运行还是在CPU上运行,我监视以下两件事:
- 我监视logcat以查看此日志是否显示为"成功加载运行时:libRSDriver_adreno.so"
- 我监视CPU使用情况
我用两张分辨率分别为1600×1067和1920×1200的大图像运行这个脚本。由于使用Android 4.4的Nexus 5支持Renderscript GPU计算,我认为这个简单脚本在GPU中的性能会更高。然而,结果一致表明,在(Nexus 5的多核)CPU上运行的脚本速度几乎是在Adreno 330 GPU上运行的速度的3倍。
我想问一下为什么会发生这种情况,以及我是否错过了让这个简单的脚本更快的东西。
您的脚本没有做任何有意义的工作,但您可能会对数据结构进行额外的复制(在这种情况下无法保证GPU驱动程序的作用)。为什么不尝试一个对输入进行实际操作的示例,而不是直接将其复制到输出?