3

标题可能比我的实际问题更具体,尽管我相信回答这个问题会解决一个更普遍的问题,即:如何减少来自随机(但合并)全局的高延迟(~700 个周期)的影响GPU中的内存访问。

一般来说,如果一个人以合并的负载访问全局内存(例如,我读取了 128 个连续字节),但合并访问之间的距离非常大(256KB-64MB),那么一个人会获得很高的 TLB(翻译后备缓冲区)未命中率。如此高的 TLB 未命中率是由于 TLB 查找表中使用的内存页面的数量有限(~512)和大小(~4KB)。

我想高 TLB 未命中率是因为 NVIDIA 使用了虚拟内存,我在分析器中获得高(98%)全局内存重放开销和低吞吐量(45GB/s,使用 K20c)和事实上,自从费米以来,分区露营就不是问题了。

是否有可能以某种方式避免高 TLB 未命中率?如果我正在访问沿 X 维度合并并沿 Z 维度具有 X*Y“步幅”的 (X x Y x Z) 立方体,3D 纹理缓存会有所帮助吗?

对此主题的任何评论表示赞赏。

约束:1)全局数据不能重新排序/转置;2)内核是通信绑定的。

4

1 回答 1

4

您只能通过更改内存访问模式来避免 TLB 未命中。内存中数据的不同布局可以帮助解决这个问题。
3D 纹理不会改善您的情况,因为它会在额外的两个维度中改进空间局部性,而不是在第三维度中减少空间局部性。因此,您将不必要地沿 Y 轴读取邻居的数据。

但是,您可以做的是减轻由此产生的延迟对吞吐量的影响。为了在b = 250GB/s的全局内存带宽下隐藏t = 700 个延迟周期,您需要随时为b / t = 175 KB 的数据进行内存事务处理(或每个 12.5 KB 14 SMX)。但是,由于内存接口满载且 TLB 未命中率很高,您会发现延迟接近 2000 个周期,每 sm 需要大约 32 KB 的传输事务。

由于运行中的内存读取事务的每个字都需要一个寄存器,一旦值到达就会存储在该寄存器中,因此隐藏内存延迟必须与寄存器压力相平衡。保持 32 KB 的传输数据需要 8192 个寄存器,或 SMX 上可用寄存器总数的 12.5%。

(请注意,对于上述粗略估计,我忽略了KiBKB之间的差异)。

于 2013-06-10T20:46:10.780 回答