我知道OpenCL和CUDA。这些不支持移动设备。但其中大多数都支持OpenGL ES。所以我想学习使用OpenGL ES着色语言进行通用计算。与OpenCLLS中的OpenCL或CUDA一样。
据我所知,到目前为止我可以创建顶点和片段着色器。
PS:
我读了一篇论文Using Mobile GPU for General-Purpose Computing。他们的实验在Nvidia Tegra SoC上进行,具有以下规格:
它可以在FFT(128 * 128)上获得3倍的加速。我认为这些结果很好。你们认为这样做是否值得。那么主要的瓶颈是内存访问权限吗?
正如许多人所说,在OpenGL ES上进行通用计算是不值得的。所以不值得期待移动支持OpenCL。对?在我看来,OpenGL ES是OpenCL的强化
答案 0 :(得分:4)
某些平台不支持任何浮点格式。某些平台(powervr,tegra,adreno)支持半浮点(16位浮点)曲面,可用作渲染目标和纹理。某些平台上存在完全浮动支持(adreno,我相信最新的powervr),但相当罕见。
所以这很大程度上取决于你期望做什么样的计算,你可以接受什么样的精度,以及你的目标平台是什么。
还要考虑到当前的opengl es(2.0)没有完整的IEEE浮点数要求这一事实,因此结果可能会有所不同。
最后,它是否值得,但在很大程度上取决于您的批量大小;访问结果(即从渲染目标读取像素)可能会很慢,从而抵消了性能提升。
逐一解决你的要点:
你可以创建一个纹理并形成一个FBO。此外,您可以将数据作为常量(制服)或逐顶点数据流(变化/属性)提供给着色器。
您可以使用普通纹理处理函数写入纹理。
绑定FBO时,可以使用片段着色器向其写入。稍后,您可以通过读取绑定到FBO的纹理来访问结果。
无。
您可以使用glFinish()刷新管道。但是,如果尝试访问纹理数据,驱动程序应该隐式导致管道刷新。
答案 1 :(得分:1)
在我进入OpenCL之前,当我有大量数字数据时,我会使用数字数据作为像素数据通过rgba图像将其提供给GPU,然后对其进行操作:这是一种很好的快速接近大数集的方法对于数学操作,虽然您必须从缓冲区复制回CPU以便能够提取更改,因此它取决于您需要操作多少数据来确定它是否值得,以及如何你有多少图形RAM和核心数量等。