【问题标题】:How to avoid TLB miss (and high Global Memory Replay Overhead) in CUDA GPUs?如何避免 CUDA GPU 中的 TLB 未命中(以及高全局内存重放开销)?
【发布时间】:2013-06-04 23:14:09
【问题描述】:

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

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

我认为 TLB 未命中率高是因为 NVIDIA 使用了虚拟内存,而且我在剖析器以及自费米以来分区露营不再是问题的事实。

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

感谢您对此主题的任何评论。

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

【问题讨论】:

    标签: caching cuda gpu hpc tlb


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢 tera 的解释!不幸的是,这正是我所期待的。
    猜你喜欢
    • 2020-03-26
    • 2012-11-13
    • 2013-06-22
    • 2010-11-29
    • 2012-06-15
    • 1970-01-01
    • 2013-11-09
    • 2017-08-03
    相关资源
    最近更新 更多