在一个最近的SO问题中,我解释了如何多次调用RenderScript内核将有效地强制所有线程在调用之间全局同步。
我目前正在处理应用于图像数据的多个卷积。由于卷积算法需要读取输入图像周围的像素数据,因此我实现了一个工作流,在其中多次调用自定义内核--以确保在每个步骤中,前一个卷积的所有数据都已准备好并在正确的坐标处可用。到目前为止,这种技术对我非常有效。
然而,在不断追求优化的过程中,我注意到通过将中间值保留在本地寄存器中,而不是在内核调用之间将它们写回全局内存分配,可以获得更高的性能。如果我能以这种方式链接这些卷积,事情会运行得更快。显然,问题在于访问周围线程的寄存器实际上是不可能的。此外,这将要求线程同步运行,以确保在阶段之间计算这些中间值的预期顺序。
在CUDA和OpenCL中,这些问题非常普遍,并且通过众所周知的屏障同步+共享内存平铺技术得到解决,这反过来又依赖于CUDA线程块或OpenCL工作组的概念。我认为这些概念在RenderScript中不存在,因为这个问题与桌面级GPU和移动SoC之间极为不同的体系结构密切相关。
因此,我显而易见的问题是,这样的事情在RenderScript中是否可能?也就是说,更好地管理线程,可能的线程组,以便更快地在它们之间共享数据。
在Jason Sams和Tim Murray的Google I/O 2013 RenderScript talk中讨论了脚本组如何进行一些幕后优化,例如跨设备并行化、内存平铺和内核融合;通过在组中运行时分析依赖DAG,并在需要时自动创建分配或可能优化它们。我假设最后一部分是指融合内核,使它们可以处理自己的本地数据,有点像我上面提到的将数据保存在本地寄存器中,并将单独的步骤组合在一个内核中。
所有这些似乎非常符合我的要求,特别是因为我的应用确实是一个明确定义的相互依赖操作的DAG(用于卷积神经网络)。因此,如果脚本组确实是这些机制的可行移动替代品,我想知道是否有任何影响这些优化发生的方式和位置的方法。或者如果没有,那么在特定情况下(卷积算法的“周围”像素数据访问),运行时可以信任多少从我的数据依赖性中推断出正确的结论,考虑到它所运行的硬件。
我意识到这可能仍然是一个正在进行的工作,而方法在这一点上高度依赖于硬件。因此,如果目前没有针对这些问题的直接解决方案——我非常愿意接受RenderScript在未来版本中可能如何处理这种工作流程的推测答案。
如果您能提供有关此事的见解,我将不胜感激,因为这将极大地影响我的项目发展方向,更不用说肯定还有许多其他人想知道如何处理RS中的此类通用并行计算任务。
非常感谢!
我目前正在处理应用于图像数据的多个卷积。由于卷积算法需要读取输入图像周围的像素数据,因此我实现了一个工作流,在其中多次调用自定义内核--以确保在每个步骤中,前一个卷积的所有数据都已准备好并在正确的坐标处可用。到目前为止,这种技术对我非常有效。
然而,在不断追求优化的过程中,我注意到通过将中间值保留在本地寄存器中,而不是在内核调用之间将它们写回全局内存分配,可以获得更高的性能。如果我能以这种方式链接这些卷积,事情会运行得更快。显然,问题在于访问周围线程的寄存器实际上是不可能的。此外,这将要求线程同步运行,以确保在阶段之间计算这些中间值的预期顺序。
在CUDA和OpenCL中,这些问题非常普遍,并且通过众所周知的屏障同步+共享内存平铺技术得到解决,这反过来又依赖于CUDA线程块或OpenCL工作组的概念。我认为这些概念在RenderScript中不存在,因为这个问题与桌面级GPU和移动SoC之间极为不同的体系结构密切相关。
因此,我显而易见的问题是,这样的事情在RenderScript中是否可能?也就是说,更好地管理线程,可能的线程组,以便更快地在它们之间共享数据。
在Jason Sams和Tim Murray的Google I/O 2013 RenderScript talk中讨论了脚本组如何进行一些幕后优化,例如跨设备并行化、内存平铺和内核融合;通过在组中运行时分析依赖DAG,并在需要时自动创建分配或可能优化它们。我假设最后一部分是指融合内核,使它们可以处理自己的本地数据,有点像我上面提到的将数据保存在本地寄存器中,并将单独的步骤组合在一个内核中。
所有这些似乎非常符合我的要求,特别是因为我的应用确实是一个明确定义的相互依赖操作的DAG(用于卷积神经网络)。因此,如果脚本组确实是这些机制的可行移动替代品,我想知道是否有任何影响这些优化发生的方式和位置的方法。或者如果没有,那么在特定情况下(卷积算法的“周围”像素数据访问),运行时可以信任多少从我的数据依赖性中推断出正确的结论,考虑到它所运行的硬件。
我意识到这可能仍然是一个正在进行的工作,而方法在这一点上高度依赖于硬件。因此,如果目前没有针对这些问题的直接解决方案——我非常愿意接受RenderScript在未来版本中可能如何处理这种工作流程的推测答案。
如果您能提供有关此事的见解,我将不胜感激,因为这将极大地影响我的项目发展方向,更不用说肯定还有许多其他人想知道如何处理RS中的此类通用并行计算任务。
非常感谢!