opengl - GPU 如何处理随机访问?

标签 opengl gpu compute-shader random-access

我阅读了一些关于如何在 opengl 4.3 计算着色器中实现光线追踪器的教程,这让我想到了一些困扰我一段时间的事情。 GPU 究竟是如何处理实现此类操作所需的大量随机访问读取的?每个流处理器都有自己的数据副本吗?似乎系统会因内存访问而变得非常拥挤,但这只是我自己的,可能是不正确的直觉。

最佳答案

流多处理器 (SM) 具有缓存,但它们相对较小,无助于真正的随机访问。
相反,GPU 正在尝试 屏蔽内存访问延迟 :也就是说,每个 SM 分配的执行线程比它拥有的内核多。在每个空闲时钟上,它都会调度一些在内存访问中未被阻塞的线程。当一个线程所需的数据不在 SM 缓存中时,该线程会暂停,直到该数据到达,让其他线程代替执行。
请注意,仅当计算量超过等待数据所花费的时间(例如,每像素照明计算)时,此屏蔽才有效。如果不是这种情况(例如,只是将大量 32 位浮点数相加),那么您可能会在内存总线带宽上遇到瓶颈,并且大多数情况下您的线程将停止等待它们的位到达。
可以帮助使用 SM 的相关内容是 数据局部性 .当多个线程访问附近的内存位置时,一个缓存行获取将带来多个线程所需的数据。例如,在对透视扭曲三角形进行纹理处理时,即使每个片段的纹理坐标可以是“随机的”,但附近的片段仍然可能从纹理中读取附近的纹素。因此,线程之间共享了许多公共(public)数据。
另一方面,光线追踪在数据局部性方面很糟糕。二次射线往往发散很多,并在几乎随机的位置撞击不同的表面。这使得很难将 SM 架构用于光线场景交叉或着色目的。

关于opengl - GPU 如何处理随机访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41411314/

相关文章:

c++ - 如何在没有主要功能的情况下使用片段着色器

assembly - 现代 CPU 与 GPU 可以完成多少级流水线?

haskell - 是否有在 GPU 上运行的函数式编程语言?

c++ - 使用 OpenGL 计算着色器的朴素框模糊非常慢

opengl - 非单调深度缓冲区; OpenGL 中的循环重叠

arrays - 大型数组中的几何着色器错误

python - 与 GPU 一起使用时,packed_pa​​dded_sequence 会出错

c++ - vulkan glsl 中的非均匀纹理访问

opengl - 在 OpenGL 中渲染数据 : Vertices and Compute shaders

java - 使用 libgdx 渲染的 3D 对象没有使用搅拌器创建时使用的颜色