GPU如何处理随机访问?

10

我阅读了一些关于如何在OpenGL 4.3计算着色器中实现光线追踪器的教程,这让我想起了一直困扰我的问题。GPU到底如何处理实现这样东西所需的大量随机访问读取?每个流处理器都会得到自己的数据副本吗?似乎系统会因为内存访问而变得非常拥挤,但这只是我的、可能不正确的直觉。

1个回答

7

流多处理器(SM)具有缓存,但它们相对较小,不能帮助实现真正的随机访问。

相反,GPU试图掩盖内存访问延迟:即每个SM被分配更多的线程来执行比其核心数更多的操作。在每个空闲时钟周期中,它会调度一些未被阻塞在内存访问上的线程。当一个线程所需的数据不在SM缓存中时,该线程会停滞,直到该数据到达,让其他线程先执行。

请注意,只有当计算量超过等待数据时间时(例如每像素照明计算),此掩盖才有效。如果不是这种情况(例如仅对大量随机散布的32位浮点数进行求和),则很可能会在内存总线带宽处出现瓶颈:大部分时间您的线程将停滞等待它们的数据到达。

有关SM利用率的相关事项是数据局部性。当多个线程访问附近的内存位置时,一个缓存行获取将带来多个线程所需的数据。例如,在纹理化透视变形三角形时,尽管每个片段的纹理坐标可以是任意的,但附近的片段仍然可能从纹理中读取附近的纹素。因此,线程之间有许多共享数据,并且一个缓存行获取将解锁其中的多个线程。

另一方面,光线追踪对于数据局部性非常糟糕。次要光线往往会分散很多,并在整个场景中实际上随机命中不同的表面位置。这使得利用SM架构进行光线场景相交或着色目的非常困难。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接