GPU如何处理随机访问



我阅读了一些有关如何在OpenGL 4.3计算着着色器中实现RayTracer的教程,这使我思考了一些困扰我一段时间的东西。GPU究竟如何处理实施此类内容所需的大量随机访问读取?每个流处理器都会获得自己的数据副本吗?似乎该系统会被内存访问变得非常拥挤,但这只是我自己的,可能是不正确的直觉。

流多处理器(SM)具有缓存,但它们相对较小,对真正的随机访问无济于事。

相反,GPU试图掩盖内存访问延迟:那是每个SM分配的线程比具有内核更多的线程。在每个自由时钟周期中,它都会安排一些在内存访问中未阻止的线程。当线程所需的数据不在SM缓存中时,线程失速在数据到达之前,让其他线程被执行。

请注意,仅当计算量超过等待数据所花费的时间(例如,每像素照明计算)时,此掩蔽才能有效。如果不是这种情况(例如,仅总结很多随机分散的32位浮子),那么您可能会在内存总线带宽处瓶颈:大多数情况下,您的线程会停滞不前等待它们的位。

可以帮助SM利用率的相关事物是 Data-locality 。当多个线程访问附近的内存位置时,一个缓存线获取将带来多个线程所需的数据。例如,当纹理透视三角形时,即使每个片段的纹理坐标可能是任意的,但附近的片段仍然很可能从纹理上读取附近的Texels。因此,线程之间有很多共享的常见数据,一个缓存线的获取将取消它们的多个。

另一方面,

射线追踪在数据局域网上是可怕的。次要射线往往会差异很多,并且在整个场景中实际上是随机位置的不同表面。这使得很难将SM体系结构用于射线式交集或阴影目的。

最新更新