use*_*681 5 opengl random-access compute-shader
我阅读了一些关于如何在opengl 4.3计算着色器中实现光线跟踪器的教程,这让我想到了一段时间以来困扰我的事情.GPU究竟如何处理实现类似内容所需的大量随机访问读取?每个流处理器都有自己的数据副本吗?似乎系统会因内存访问而变得非常拥挤,但这只是我自己的,可能是不正确的直觉.
Stream Multiprocessors (SM) 有缓存,但它们相对较小,对真正的随机访问没有帮助。
相反,GPU 试图掩盖内存访问延迟:也就是说,每个 SM 被分配的线程数多于其内核数。在每个空闲时钟上,它都会调度一些不会因内存访问而阻塞的线程。当线程所需的数据不在 SM 缓存中时,线程会停止,直到数据到达,让其他线程被执行。
请注意,此屏蔽仅在计算量超过等待数据所花费的时间(例如,每像素照明计算)时才起作用。如果不是这种情况(例如,只是对大量 32 位浮点数求和),那么您可能会遇到内存总线带宽的瓶颈,并且大多数时候您的线程将停止等待它们的位到达。
可以帮助 SM 使用的一个相关的事情是data-locality。当多个线程访问附近的内存位置时,一次缓存行获取将带来多个线程所需的数据。例如,当纹理一个透视扭曲的三角形时,即使每个片段的纹理坐标可以是“随机的”,附近的片段仍然可能从纹理中读取附近的纹素。因此,线程之间共享了许多公共数据。
另一方面,光线追踪在数据局部性方面很糟糕。二次射线往往会发散很多,并在几乎随机的位置撞击不同的表面。这使得将 SM 架构用于光线场景交叉或着色目的变得非常困难。
| 归档时间: |
|
| 查看次数: |
186 次 |
| 最近记录: |