我已经在 RenderScript 中实现了 CNN,如上一个问题 https://stackoverflow.com/questions/37080673/how-to-do-correct-timing-of-android-renderscript-code-on-nvidia-shield这催生了这个。基本上,跑步时
adb shell setprop debug.rs.default-CPU-driver 1
Nvidia Shield 和 Nexus 7 的加速都提高了 10 倍。平均计算时间从大约 50 毫秒到 5 毫秒,测试应用程序从大约 50 fps 到 130 或更多。卷积算法有两种:
(1)移动内核
(2) 来自 RenderScriptIntrinsicsBLAS 的 im2col 和 GEMM。
两者都经历了类似的加速。问题是:为什么会发生这种情况?这种效果能否以可预测的方式从代码中实例化?是否有关于此的详细信息?
Edit:
根据下面的建议,我验证了 finish() 和 copyTo() 的使用,这里是该过程的细分。报告的加速是在调用 copyTo() 但没有 finish() 之后。取消注释 finish() 会增加大约 1 毫秒的时间。
double forwardTime = 0;
long t = System.currentTimeMillis();
//double t = SystemClock.elapsedRealtime(); // makes no difference
for (Layer a : layers) {
blob = a.forward(blob);
}
mRS.finish(); // adds about 1ms to measured time
blob.copyTo(outbuf);
forwardTime = System.currentTimeMillis() - t;
也许这是不相关的,但在 NVIDIA Shield 上,我在启动时收到一条错误消息,当使用 adb shell setprop debug.rs.default-CPU-driver 1 运行时该消息消失
E/Renderscript: rsAssert failed: 0, in vendor/nvidia/tegra/compute/rs/driver/nv/rsdNvBcc.cpp
我现在将compileSdkVersion、minSdkVersion和targetSdkVersion设置为23,buildToolsVersion为“23.0.2”。平板电脑会自动更新到最新的 Android 版本。不确定我需要设置的最低目标,并且 ScriptIntrinsicsBLAS 仍然可用。
我在所有脚本中使用#pragma rs_fp_relaxed。分配全部使用默认标志。
这个问题 https://stackoverflow.com/questions/28750267/android-renderscript-performance-drop-in-sdk-21有类似的情况,但事实证明 OP 在每个计算轮次中创建新的 Script 对象。我没有做任何类似的事情,所有脚本和分配都是在初始化时创建的。