首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在强制实施默认RenderScript时,CPU加速10倍

在强制实施默认RenderScript时,CPU加速10倍
EN

Stack Overflow用户
提问于 2016-05-14 23:23:24
回答 2查看 955关注 0票数 4

我在RenderScript中实现了一个CNN,在previous question中描述了这一点。基本上,当运行

代码语言:javascript
复制
adb shell setprop debug.rs.default-CPU-driver 1

在Nvidia Shield和Nexus 7上都有10倍的加速。平均计算时间从大约50ms到5ms,测试应用程序从大约50fps到130甚至更多。有两种卷积算法:

(1)移动内核

(2)来自RenderScriptIntrinsicsBLAS的im2col和GEMM。

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

编辑:

根据下面的建议,我验证了finish()和copyTo()的用法,下面是该过程的细目。报告的加速是在调用copyTo()之后,但没有使用finish()。取消finish()的注释会增加大约1毫秒的时间。

代码语言:javascript
复制
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运行时消失

代码语言:javascript
复制
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可用。

我在所有脚本中都使用了#杂注rs_fp_relaxed。分配都使用默认标志。

This question也有类似的情况,但事实证明,OP在每一轮计算中都会创建新的脚本对象。我不做这类事情,所有的脚本和分配都是在初始化时创建的。

EN

回答 2

Stack Overflow用户

发布于 2016-05-15 07:00:48

最初的帖子将mRS.finish()注释掉了。我想知道在这里是不是这样。

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

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

5ms在这里似乎很可疑,它可能是真实的,这取决于实际的算法。但是,当您添加finish()或copyTo()时,是否仍然如此值得仔细检查。

票数 1
EN

Stack Overflow用户

发布于 2016-05-15 09:03:45

这确实非常奇怪。通过两个设备和两个完全不同的conv层实现,您得到了相同的结果,这一事实表明,基准测试或计时本身仍然存在其他问题,而不是CPU/GPU执行的差异,因为事情很少是决定性的。

我建议验证copyTo()的输出总是相同的,设置一个logcat输出,比如说,从每一层的输出分配返回的浮点数组中的前10个(也是最后一个!)值,以确保所有的实现和执行模式在每一层都正确而平等地处理数据。

根据您的设置,我前面提到的数据复制开销也可能超过计算时间本身,您所看到的只是一个不幸的影响,因为从一个地方或另一个地方复制数据可能需要或多或少的时间。尝试增加conv内核大小或计数(使用虚拟/随机值,只是为了测试目的),以使计算变得更加复杂,从而抵消计算与数据加载时间的平衡,看看这对结果有何影响。

如果所有其他方法都失败了,可能只是因为某些原因,GPU真的花了更长的时间,尽管很难追踪原因。一些需要检查的东西。您使用的数据类型和大小是什么?如何将数据加载/写入到分配中?你已经在使用#杂注rs_fp_relaxed来设置你的浮点数精度了吗?您为分配使用设置了什么标志(例如Allocation.USAGE_SCRIPT | Allocation.USAGE_GRAPHICS_TEXTURE)?

至于你的最后一个问题,不幸的是,关于具体优化问题的详细RS文档仍然非常稀少……我认为在这里提问仍然是目前可用的最好的资源之一:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37228427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档