Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于OpenGL的高效GPU随机内存访问_Opengl_Glsl_Gpu_Gpgpu_Random Access - Fatal编程技术网

基于OpenGL的高效GPU随机内存访问

基于OpenGL的高效GPU随机内存访问,opengl,glsl,gpu,gpgpu,random-access,Opengl,Glsl,Gpu,Gpgpu,Random Access,让GPU高效地计算“反功能”例程的最佳模式是什么,这些例程通常依赖于定位内存写入而不是读取? 例如,像计算直方图、排序、将数字除以百分比、将不同大小的数据合并到列表中等等。确定的术语是聚集读取和分散写入 收集阅读 这意味着您的程序将写入固定位置(如片段着色器的目标片段位置),但可以快速访问任意数据源(纹理、制服等) 分散书写 这意味着,程序接收的输入数据流不能任意寻址,但可以快速写入任意内存位置 显然,OpenGL的着色器体系结构是一个聚集系统。最新的OpenGL-4还允许在片段着色器中进行一些

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

确定的术语是聚集读取和分散写入

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

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

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


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

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

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

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

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


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

您是在询问OpenGL、OpenGL ES还是WebGL?因为这是三个不同问题的三个不同答案。虽然从技术上讲,答案总是某种形式的“这取决于硬件”。OpenGL 3比WebGL有哪些功能可以使它们与众不同?你的意思是,除了能够渲染到多个缓冲区之外?还有UBO,它允许着色器快速访问更多的数据。缓冲区纹理允许着色器访问速度较慢,但内存要多得多。还有变换反馈,它可以将顶点着色器输出存储在缓冲对象中,使紧密循环完全避免光栅化。但实际上,如果你在台式机上进行计算,你应该尝试使用OpenCL。OpenCL目前不像OpenGL那样可用。。例如,这就是我不决定支持/反对WebGL的原因。如果它对于我的目的是可用的,我希望它能够得到一个简单的部署。顺便说一下,变换反馈听起来很酷,当与几何体着色器结合使用时,它可以根据计算结果压缩或扩展数据长度。不过,这是先进的,我认为不是WebGL的可能性。感谢您设置术语“聚集”和“分散”。分散似乎总是很难优化,因为它与聚集一样违反缓存一致性,但还需要内存同步。我不确定GPU在绘图之前如何对原语进行排序。只要有一个非平凡的alpha混合或没有深度缓冲区,所有接触片段的原语都需要按照用户定义的顺序绘制。但是,使用不透明混合和深度缓冲,顺序不再重要。此外,非重叠原语可以并行绘制,但如果它们接触相同的内存行,则需要内存同步性。因此,通过大量的本地限制操作,真正的分散写入可能会表现得更好。类似于从某个局部区域(例如纹理的平铺)收集输出值,并将其渲染为中间输出。这可以重复,直到任何数据到达其最终存储位置。这与快速排序有一些相似之处,例如,快速排序可以通过这种方式有效地实现。这个答案似乎回答了另一个问题,比如“GPU程序使用什么类型的内存类型和缓存”。