2

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

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

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

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

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

  1. 1GHz 双核 ARM Cortex-A9 CPU,
  2. 1GB 内存
  3. 运行频率为 333MHz 的 Nvidia 超低功耗 GeForce GPU,以及 512MB 闪存

它可以在 FFT(128*128) 上获得 3 倍的加速。我认为这些结果很好。大家觉得值不值得去做。那么主要的瓶颈是内存访问权限吗?

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

4

2 回答 2

4

某些平台不支持任何浮点格式。一些平台(powervr、tegra、adreno)支持半浮点(16 位浮点)表面,既可以用作渲染目标,也可以用作纹理。某些平台(adreno,我相信最新的 powervr)上存在完全浮动支持,但很少见。

因此,这在很大程度上取决于您期望进行什么样的计算,您可以接受什么样的精度,以及您的目标平台是什么。

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

最后,是否值得在很大程度上取决于您的批量大小;访问结果(即,从渲染目标读回像素)可能非常慢,以至于抵消了性能增益。

要一一解决您的要点:

  • 我可以使用多少种缓冲液?这些是什么?

您可以创建纹理并从中形成 FBO。此外,您可以将数据作为常量(uniforms)或每个顶点数据流(variings/attribs)提供给着色器。

  • 如何操作这些缓冲区

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

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

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

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

没有任何。

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

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

于 2012-12-17T09:44:25.943 回答
1

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

于 2012-12-17T13:25:40.667 回答