7

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

4

2 回答 2

7

既定术语是聚集读取分散写入

收集阅读

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

分散写入

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

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

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

于 2012-02-25T10:48:52.237 回答
1

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

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

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

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

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

于 2012-03-03T03:18:11.447 回答