我在RenderScript中实现了一个CNN,在previous question中描述了这一点。基本上,当运行
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毫秒的时间。
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可用。
我在所有脚本中都使用了#杂注rs_fp_relaxed。分配都使用默认标志。
This question也有类似的情况,但事实证明,OP在每一轮计算中都会创建新的脚本对象。我不做这类事情,所有的脚本和分配都是在初始化时创建的。
发布于 2016-05-15 07:00:48
最初的帖子将mRS.finish()注释掉了。我想知道在这里是不是这样。
要正确地对RenderScript进行基准测试,我们应该等待挂起的异步操作完成。通常有两种方法可以做到这点:
debug.rs.default-CPU-driver 1时效果很好。它也适用于大多数GPU驱动程序。5ms在这里似乎很可疑,它可能是真实的,这取决于实际的算法。但是,当您添加finish()或copyTo()时,是否仍然如此值得仔细检查。
发布于 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文档仍然非常稀少……我认为在这里提问仍然是目前可用的最好的资源之一:)
https://stackoverflow.com/questions/37228427
复制相似问题