【问题标题】:efficient GPU random memory access with OpenGL使用 OpenGL 的高效 GPU 随机内存访问
【发布时间】:2012-03-15 11:48:05
【问题描述】:

让 GPU 有效计算“反功能”例程的最佳模式是什么,这些例程通常依赖于定位的内存写入而不是读取? 例如。比如计算直方图、排序、将数字除以百分比、将不同大小的数据合并到列表中等等。

【问题讨论】:

  • 您问的是 OpenGL、OpenGL ES 还是 WebGL?因为这是三个不同问题的三个不同答案。虽然从技术上讲,答案总是某种形式,“这取决于硬件。”
  • 会有哪些功能,例如。 OpenGL 3 已经超越了 WebGL,这可以让它们与众不同?
  • 你的意思是,除了能够渲染到多个缓冲区之外?嗯,有 UBO,它允许着色器快速访问更多数据。有缓冲区纹理,允许着色器较慢的访问,但更多更多的内存。有变换反馈,可以将顶点着色器输出存储在缓冲区对象中,使紧密循环完全避免光栅化。但实际上,如果您在台式机上进行计算,您应该尝试使用 OpenCL。
  • OpenCL 目前不像 OpenGL 风格那样可用。这就是为什么我不决定支持/反对 WebGL 的原因。如果它可用于我的目的,我希望它能够轻松部署。顺便说一句,变换反馈听起来很酷,当与几何着色器结合使用时,它可以根据计算结果压缩或扩展数据长度。然而,我认为这是先进的,而不是 WebGL 的可能性。

标签: opengl glsl gpu gpgpu random-access


【解决方案1】:

既定术语是gather readsscatter writes

收集阅读

这意味着您的程序将写入固定位置(如片段着色器的目标片段位置),但可以快速访问任意数据源(纹理、制服等)

分散写入

这意味着,程序接收到一个输入数据流,它不能任意寻址,但可以快速写入任意内存位置。

显然,OpenGL 的着色器架构是一个聚集系统。最新的 OpenGL-4 还允许在片段着色器中进行一些分散写入,但速度很慢。

那么,如今,用 OpenGL 模拟“散射”最有效的方法是什么。到目前为止,这是使用对像素大小的点进行操作的顶点着色器。您可以发送尽可能多的数据点来处理,并通过相应地设置它们的位置将它们分散在目标内存中。您可以使用几何和曲面细分着色器来生成在顶点单元中处理的点。您可以使用纹理缓冲区和 UBO 进行数据输入,使用顶点/点索引进行寻址。

【讨论】:

  • 感谢您设置术语“聚集”和“分散”。
  • 似乎 scatter 总是很难优化,因为它违反了gather 的缓存一致性,但还需要内存同步。我不确定 GPU 在绘制之前如何对图元进行排序。只要有非平凡的 alpha 混合或没有深度缓冲区,所有接触片段的图元都需要按用户定义的顺序绘制。但是,使用不透明混合和深度缓冲区,顺序不再重要。此外,可以并行绘制不重叠的图元,但如果它们接触相同的内存行,则需要内存同步。
  • 因此,大量的本地受限操作可能会优于真正的分散写入。就像从某个本地区域收集输出值一样,例如。一块纹理,并将其渲染到中间输出。这可以重复,直到任何数据到达其最终存储位置。这与快速排序有一些相似之处,例如,可以通过这种方式有效地实现?
【解决方案2】:

GPU 采用多种内存类型构建。一种类型是主机 CPU 和 GPU 可访问的 DDRx RAM。在 OpenCL 和 CUDA 中,这称为“全局”内存。对于 GPU,全局内存中的数据必须在 GPU 和主机之间传输。它通常安排在银行中以允许流水线内存访问。因此,对“全局”内存的随机读/写相对较慢。访问“全局”内存的最佳方式是按顺序访问。
它的大小范围为每台设备 1G - 6B。

下一种类型的内存是 GPU 上的。它是一个共享内存,可供计算单元/多处理器中的多个线程/warp 使用。这比全局内存快,但不能从主机直接访问。 CUDA 称之为共享内存。 OpenCL 调用这个本地内存。这是用于随机访问数组的最佳内存。 CUDA 有 48K,OpenCL 有 32K。

第三种内存是 GPU 寄存器,在 OpenCL 中称为私有或在 CUDA 中称为本地。私有内存是最快的,但可用的内存比本地/共享内存少。

优化随机访问内存的最佳策略是在全局内存和本地/共享内存之间复制数据。因此,GPU 应用程序会将其全局内存的一部分复制到本地/共享,使用本地/共享工作并将结果复制回全局。

复制到本地、使用本地处理和复制回全局的模式是理解和学习在 GPU 上良好编程的重要模式。

【讨论】:

  • 这个答案似乎回答了另一个问题,例如“GPU 程序使用什么样的内存类型和缓存”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 2017-01-08
  • 2017-05-15
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多