如何避免CUDA GPU中的TLB未命中(以及高全局内存重播开销)?

时间:2013-06-08 22:36:18

标签: caching cuda gpu hpc tlb

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

一般情况下,如果一个人通过合并加载访问全局内存(例如,我读取128个连续字节),但在合并访问之间具有非常大的距离(256KB-64MB),则会获得高TLB(Translation Lookaside Buffer)未命中率。这种高TLB未命中率是由于TLB查找表中使用的存储器页面的数量(~512)和大小(~4KB)有限。

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

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

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

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

1 个答案:

答案 0 :(得分:3)

您只能通过更改内存访问模式来避免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之间的差异。