gpt4 book ai didi

android - 强制默认 CPU 实现时,RenderScript 加速 10 倍

转载 作者:行者123 更新时间:2023-12-02 10:27:43 29 4
gpt4 key购买 nike

我已经在 RenderScript 中实现了 CNN,如 previous question 中所述。这催生了这个。基本上,运行时

adb shell setprop debug.rs.default-CPU-driver 1

Nvidia Shield 和 Nexus 7 的速度提升了 10 倍。平均计算时间从大约 50 毫秒到 5 毫秒,测试应用程序从大约 50 fps 到 130 或更多。卷积算法有两种:

(1) 移动内核
(2) 来自 RenderScriptIntrinsicsBLAS 的 im2col 和 GEMM。

两者都经历了类似的加速。问题是:为什么会发生这种情况?这种效果能否以可预测的方式从代码中实例化?是否有关于此的详细信息?

编辑:

根据下面的建议,我验证了 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。分配全部使用默认标志。
This question有类似的情况,但事实证明 OP 在每个计算轮次中创建新的 Script 对象。我没有做任何此类事情,所有脚本和分配都是在初始化时创建的。

最佳答案

原始帖子已注释掉 mRS.finish()。我想知道这里是否是这种情况。

为了正确地对 RenderScript 进行基准测试,我们应该等待挂起的异步操作完成。通常有两种方法可以做到这一点:

  1. 使用RenderScript.finish() 。使用 debug.rs.default-CPU-driver 1 时效果很好。它也适用于大多数 GPU 驱动程序。但是,某些 GPU 驱动程序确实将其视为 NOOP。
  2. 使用Allocation.copyTo()或其他类似的 API 来访问分配的数据,最好是最终输出分配。这实际上是一个技巧,但它适用于所有设备。请注意,copyTo 操作本身可能需要一些时间,请务必考虑到这一点。

这里的 5ms 看起来很可疑,但根据实际算法,它可能是真实的。但值得仔细检查一下,当您添加 finish() 或 copyTo() 时情况是否仍然如此。

关于android - 强制默认 CPU 实现时,RenderScript 加速 10 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37228427/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com