android - RenderScript 本地线程同步是否可行?

标签 android renderscript

recent SO question 上,我解释了多次调用 RenderScript 内核将如何有效地强制所有线程在调用之间进行全局同步。

我目前正在处理按顺序应用于图像数据的多重卷积。由于卷积算法需要读取输入图像的周围像素数据,我已经实现了一个工作流程,其中我自己的自定义内核被多次调用——以确保在每一步中,来自先前卷积的所有数据都已准备好并可用于正确的坐标。到目前为止,这项技术对我来说效果很好。

然而,在我不断寻求优化的过程中,我注意到通过将中间值保留在线程的本地寄存器中而不是在内核调用之间将它们写回全局内存分配可以获得很多性能。如果我能够以这种方式链接这些卷积,事情就会运行得更快。很多。问题显然是访问周围线程的寄存器是不可能的。此外,这将需要线程同步运行,以确保阶段之间的这些中间值按预期顺序计算。

在 CUDA 和 OpenCL 中,这些问题非常普遍,并通过众所周知的屏障同步 + 共享内存平铺技术解决,而这又取决于 CUDA 线程 block 或 OpenCL 工作组的概念。我相信 RenderScript 中不存在这些概念,因为这个问题与桌面级 GPU 和移动 SoC 之间截然不同的架构密切相关。

所以我的明显问题是,在 RenderScript 中可以实现这样的事情吗?也就是说,更好地管理线程和可能的线程组,以便在它们之间更快地共享数据。


关于 Google I/O 2013 RenderScript talk由 Jason Sams 和 Tim Murray 撰写,讨论了脚本组如何能够进行一些幕后优化,例如跨设备并行化、内存平铺和内核融合;所有这一切都是通过在运行时分析组中的依赖 DAG,并在需要时自动创建分配或可能优化它们来实现的。我假设这最后一点是指融合内核,以便它们处理自己的本地数据,就像我上面提到的将数据保存在本地寄存器中并将单独的步骤组合在一个内核中的方式。

所有这些看起来都非常符合我正在寻找的东西,特别是因为我的应用程序确实是一个定义明确的相互依赖操作的 DAG(用于卷积神经网络)。因此,如果脚本组确实是这些机制的合理的以移动为中心的替代方案,我想知道是否有任何方法可以影响这些优化发生的方式和地点。或者,如果不是,运行时在多大程度上可以被信任以根据运行时的硬件从我的数据依赖项中做出正确的推断——在卷积算法的“周围”像素数据访问的特定情况下。

我意识到这一切可能仍在进行中,此时方法将高度依赖于硬件。因此,如果目前没有针对此类问题的直接解决方案——我非常愿意接受关于 RenderScript 在未来版本中可能如何处理此类工作流的推测性答案。

我将非常感谢对此的一些见解,因为它会极大地影响我自己项目的发展方向,更不用说肯定有很多其他人想知道这种通用的并行计算任务是如何实现的在 RS 中处理。

非常感谢!

最佳答案

如您所见,RS 无法直接跨线程共享数据。但是,您所描述的可以使用 ScriptGroup 来完成。 .问题是组中的每个脚本都必须是唯一的,因此您不能一遍又一遍地输入相同的脚本。至少,不像现在写的那样。您当然可以将脚本的“核心”放在 RS header 中,并从多个内核中包含它。 ScriptGroup允许您将一个脚本的输出变成另一个脚本的输入,或者一个脚本的输出变成另一个脚本的全局字段。文档指出内核到内核(输出到输入)是更有效的用例。使用这种方法,您的同步问题将得到解决,因为引擎将在启动第二个脚本之前针对整个输入数据集执行第一个脚本,等等。脚本本身将针对硬件进行适当的并行化(使用 CPU 或 GPU/DSP ).该引擎将不必在脚本之间弹出回 Java,并且还可以在需要时管理幕后的数据分配。

您可能会注意到 ScriptGroup利用 Script.KernelIDScript.FieldID为了识别连接两个内核的确切脚本或字段。只要您使用 RS 编译器属性 pragma 显式调用内核函数,您的自定义脚本就会自动生成这些内容。然后你可以调用getKernelID_<code><name></code> (其中“名称”是脚本中的内核函数名称)以获取内核 ID。

关于android - RenderScript 本地线程同步是否可行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21935685/

相关文章:

java - com.SearchPlayer 不是一个封闭类

android - 将 Android 应用程序连接到 Github API

BLAS 的 RenderScript 实现?

java - 在 Android 中使用 RenderScript 应用模糊会产生奇怪的输出

Android SDK - aapt 错误 : libstdc++. so.6 无法打开共享对象文件

android - Android Studio 插件 Fabric 中的异常

java - View 的行为是固定大小的,而不是使用 ConstraintLayout 基于屏幕的动态大小

android - 如何在 renderscript 中制作圆柱体

android - 华为8.0 Renderscript加载RS驱动失败

android - 使用 Android Renderscript v8 支持库导致与其他共享库的链接错误