2

我一直在查看一些 stackoverflow 帖子(为什么 std::fill(0) 比 std::fill(1) 慢?增强的 REP MOVSB for memcpy)和一个决定最佳 memcpy/memset 策略的因素似乎是操作是否会受到延迟或 DRAM 带宽限制。其中一点是rep movsb切换延迟比我不理解的正常写入要长。

为什么ERMSB rep movsb切换延迟比movapsmemcpy/memset 的(或任何其他正常写入)循环更长

BeeOnRope 评论写道:

上面描述的 rep movsb 与跨各种缓冲区大小的单个核心上的 movaps 显式循环的行为与我们之前在服务器核心上看到的非常一致。正如您所指出的,竞争是在非 RFO 协议 [Read For Ownership] 和 RFO 协议之间进行的。前者在所有缓存级别之间使用较少的带宽,但特别是在服务器芯片上,一直到内存的切换延迟很长。由于单核通常具有并发限制,因此延迟很重要,并且非 RFO 协议胜出,这就是您在 30 MB L3 之外的区域中看到的情况

然而,在增强的 REP MOVSB for memcpy中,BeeOnRope 说

但是,如果您受到并发限制,那么情况会平衡,有时甚至会逆转。您有空闲的 DRAM 带宽,因此 NT 存储无济于事,它们甚至会受到伤害,因为它们可能会增加延迟,因为线缓冲区的切换时间可能比预取将 RFO 线带入 LLC(甚至L2) 然后存储在 LLC 中完成以有效降低延迟。最后,服务器非内核的 NT 存储往往比客户端的(和高带宽)慢得多,这突出了这种效果。

我无法理解非 RFO 方法rep movsb(动态随机存取存储器。

用于 memcpy的增强型 REP MOVSB帖子讨论了rep movsbon of 的优点:

立即准确地发出预取​​请求。硬件预取在检测类似 memcpy 的模式方面做得很好,但它仍然需要几次读取才能启动,并且会“过度预取”复制区域末尾之外的许多缓存行。rep movsb 准确地知道区域大小并且可以准确地预取。

鉴于这rep movsb是预取(比movaps循环更有效),与循环相比,您不会期望 LFB 能够以至少 L2/LLC 切换到线路的可能性更高(或相等)movaps。如果是这种情况,我不明白:

前者在所有缓存级别之间使用较少的带宽,但特别是在服务器芯片上,一直到内存的切换延迟很长

特别是长延迟切换是否来自。

所以我的问题是

  1. LFB 上的额外切换延迟从何rep movsb而来?
  2. 更一般地说,是什么导致了rep movsbmemcpy/memset 中的延迟界限?
4

0 回答 0