GPU的参考位置值得担心吗?


9

是否引用的局部性化妆一样多GPU性能差异,因为它确实CPU的性能?

例如,如果我向GPU发送200条绘制命令,如果每个命令的数据在内存中是连续的,而不是在缓冲区/纹理贴图上跳转,我是否会(可能)看到明显的不同?

附带问题:我假设GPU通过使大多数资源保持不变来确保避免错误共享问题。但是,如果不是这样,为什么线程总是执行四个片段的工作呢?

Answers:


10

引用的位置确实很重要,但是您不必担心太多 ...因为您没有绝对的控制权。

当使用OpenGL / DirectX时,通常对内存布局的控制有限,其余的将由驱动程序完成。例如,您可以尝试多种顶点缓冲区布局,例如使用交错的或非交错的顶点数据,并且取决于您的数据/驱动程序/ GPU性能的不同。剖析并选择最适合您的应用程序。

例如在GPU Gems Pipeline优化中,两次提到了引用位置,第一个是:

以相对顺序的方式访问顶点数据。现代GPU在获取顶点时会缓存内存访问。像在任何内存层次结构中一样,引用的空间局部性有助于最大程度地提高高速缓存中的命中率,从而减少带宽需求。

第二

针对T&L之后的顶点缓存进行优化。现代GPU有一个小的先进先出(FIFO)缓存,用于存储最近转换的顶点的结果。命中此缓存将保存所有转换和光照工作以及管道中较早完成的所有工作。要利用此缓存,必须使用索引基元,并且必须对顶点进行排序,以使网格上的参考局部最大化。有可用的工具(包括D3DX和NVTriStrip(NVIDIA 2003))可以帮助您完成此任务。

在我看来,这些建议遵循我在说的内容,并暗示您对内存布局没有绝对的控制权,但是您拥有的控制权(例如,每个VBO顶点的布局方式可能会对性能产生影响)。

如果您的应用程序性能受到影响,则应首先检测瓶颈,这可能不是参考数据的问题所在,但可能是因为有大量数据没有剔除,例如您没有执行平截头剔除。等等你可以在这里查看我关于这个问题的答案。

我认为您在使用OpenCL / CUDA时应该更加担心引用的局部性,因为您通常可以完全控制内存布局。


3

最初,GPU仅用于显示很少数据重用的多媒体应用程序。随着GPU越来越多地用于通用应用程序(因此称为GPGPU),它们现在具有大型硬件管理的缓存,例如,Fermi GPU具有768 KB的末级缓存,Kepler GPU具有1536 KB的缓存。最后一级缓存,而Maxwell GPU具有2048 KB的最后一级缓存。这以及对GPU缓存的大量研究表明,数据局部性对于GPU绝对重要。有关上述详细信息和参考,请参见我的调查论文

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.