获得GPU有效计算“反功能”例程的最佳模式是什么,这通常取决于定位内存写入而不是读取? 例如。比如计算直方图,排序,按百分比划分数字,将不同大小的数据合并到列表等等。
答案 0 :(得分:7)
既定条款是收集读取和分散写入
这意味着您的程序将写入固定位置(如片段着色器的目标片段位置),但可以快速访问任意数据源(纹理,制服等)。
这意味着程序接收的输入数据流无法正常寻址,但可以快速写入任意存储位置。
显然,OpenGL的着色器架构是一个聚集系统。最新的OpenGL-4还允许片段着色器中的一些分散写入,但它们很慢。
那么,最近用OpenGL模拟“散射”的最有效方法是什么呢?到目前为止,这是使用在像素大小的点上操作的顶点着色器。您通过数据点发送尽可能多的点来处理,并通过相应地设置它们的位置将它们分散到目标内存中。您可以使用几何和细化着色器生成在顶点单元中处理的点。您可以使用纹理缓冲区和UBO进行数据输入,使用顶点/点索引进行寻址。
答案 1 :(得分: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上编程的重要模式。