为什么GoogleselectRenderScript而不是OpenCL

我一直在想是否可以使用OpenCL for Android,发现这是不可能的,并且完全放弃了这个主题。 但是感谢1月14日在官方Android开发者博客(http://android-developers.blogspot.fr/2013/01/evolution-of-renderscript-performance.html)上发表的博文,我发现并行编程是可能的自Android 4.0以来,感谢RenderScript! 一个与OpenCL有很多共同特性的API。

我现在想知道的是:为什么谷歌select实施这个新的解决scheme,而不是推动OpenCL向前(Khronos集团现在处理的一个开放的规范)。

我的意思是,我知道,从一个转换到另一个并不难,但仍然…

无论如何,如果有人作为真正的解释,请让我知道!

答案是,Android的需求与OpenCL尝试提供的需求大不相同。

OpenCL使用CUDA中首次引入的执行模型。 在这个模型中,一个内核由一个或多个工作组组成,每个组内都有快速的共享内存和同步原语。 这样做会导致algorithm的描述与如何在特定体系结构上调度该algorithm(因为您正在决定组的大小以及何时在该组内同步)。

当您为一个体系结构编写代码时,这非常棒,您希望获得绝对的最高性能,但却以性能可移植性为代价获得最佳性能。 也许在你的架构上,你有足够的寄存器和共享内存来运行每组256个工作者以获得最佳性能,但是在另一个架构上,最终会有大量的注册溢出,每个组中有超过128个工作者,造成80%的性能下降。 同时,因为你的代码是为每个组256个工作人员明确编写的,所以运行时无法做任何事情来改善其他体系结构的情况 – 它必须遵守你所写的内容。 这种情况在GPU计算的桌面/ HPC方面从体系结构转移到体系结构时很常见。

在移动设备上,Android需要具有完全不同体系结构的许多不同GPU和CPU供应商之间的性能可移植性。 如果Android要依靠CUDA风格的执行模式,那么编写单个内核几乎是不可能的,并且可以在一系列设备上运行。

RenderScript将调度的控制从开发人员中抽象出来,代价是性能高峰; 然而,我们正在不断缩小与RenderScript可能的差距。 例如,Android 4.2中引入的API ScriptGroup是我们进一步改进GPU代码生成计划的重要组成部分。 有很多新的改进,使得快速编写代码变得更加容易。

苹果公司在OpenCL上拥有商标。 谷歌与苹果竞争。 也许这真的很简单。

我们已经使用Android开发了OpenCL( 见这里 ),并且很高兴看到它正在向前迈进,这得益于Intel,Imagination和其他芯片制造商的努力。 Google很快就会转身。