如何使用OpenGL SL进行通用计算

时间:2012-12-17 07:09:50

标签: opengl-es cuda opencl

我知道OpenCL和CUDA。这些不支持移动设备。但其中大多数都支持OpenGL ES。所以我想学习使用OpenGL ES着色语言进行通用计算。与OpenCLLS中的OpenCL或CUDA一样。

  • 我可以使用多少种缓冲区?这些是什么?
  • 如何操纵这些缓冲区

据我所知,到目前为止我可以创建顶点和片段着色器。

  • 使用片段着色器时,我可以操作哪个缓冲区
  • 使用顶点着色器时可以操作哪个缓冲区
  • GPU中是否有任何同步功能(我的意思是GPU中的同步。就像OpenCL或CUDA中块中同步的线程一样)

PS:
我读了一篇论文Using Mobile GPU for General-Purpose Computing。他们的实验在Nvidia Tegra SoC上进行,具有以下规格:

  1. 1GHz双核ARM Cortex-A9 CPU,
  2. 1GB的RAM
  3. 一款运行频率为333MHz的Nvidia超低功耗GeForce GPU,以及512MB闪存
  4. 它可以在FFT(128 * 128)上获得3倍的加速。我认为这些结果很好。你们认为这样做是否值得。那么主要的瓶颈是内存访问权限吗?

    正如许多人所说,在OpenGL ES上进行通用计算是不值得的。所以不值得期待移动支持OpenCL。对?在我看来,OpenGL ES是OpenCL的强化

2 个答案:

答案 0 :(得分:4)

某些平台不支持任何浮点格式。某些平台(powervr,tegra,adreno)支持半浮点(16位浮点)曲面,可用作渲染目标和纹理。某些平台上存在完全浮动支持(adreno,我相信最新的powervr),但相当罕见。

所以这很大程度上取决于你期望做什么样的计算,你可以接受什么样的精度,以及你的目标平台是什么。

还要考虑到当前的opengl es(2.0)没有完整的IEEE浮点数要求这一事实,因此结果可能会有所不同。

最后,它是否值得,但在很大程度上取决于您的批量大小;访问结果(即从渲染目标读取像素)可能会很慢,从而抵消了性能提升。

逐一解决你的要点:

  • 我可以使用多少种缓冲区?它们是什么?

你可以创建一个纹理并形成一个FBO。此外,您可以将数据作为常量(制服)或逐顶点数据流(变化/属性)提供给着色器。

  • 如何操纵这些缓冲区

您可以使用普通纹理处理函数写入纹理。

  • 使用片段着色器时,我可以操作哪个缓冲区

绑定FBO时,可以使用片段着色器向其写入。稍后,您可以通过读取绑定到FBO的纹理来访问结果。

  • 使用顶点着色器时可以操作哪个缓冲区

无。

  • GPU中是否有任何同步功能

您可以使用glFinish()刷新管道。但是,如果尝试访问纹理数据,驱动程序应该隐式导致管道刷新。

答案 1 :(得分:1)

在我进入OpenCL之前,当我有大量数字数据时,我会使用数字数据作为像素数据通过rgba图像将其提供给GPU,然后对其进行操作:这是一种很好的快速接近大数集的方法对于数学操作,虽然您必须从缓冲区复制回CPU以便能够提取更改,因此它取决于您需要操作多少数据来确定它是否值得,以及如何你有多少图形RAM和核心数量等。