我一直在查看一些 stackoverflow 帖子(为什么 std::fill(0) 比 std::fill(1) 慢?和增强的 REP MOVSB for memcpy)和一个决定最佳 memcpy/memset 策略的因素似乎是操作是否会受到延迟或 DRAM 带宽限制。其中一点是rep movsb
切换延迟比我不理解的正常写入要长。
为什么ERMSB
rep movsb
切换延迟比movaps
memcpy/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 movsb
on of 的优点:
立即准确地发出预取请求。硬件预取在检测类似 memcpy 的模式方面做得很好,但它仍然需要几次读取才能启动,并且会“过度预取”复制区域末尾之外的许多缓存行。rep movsb 准确地知道区域大小并且可以准确地预取。
鉴于这rep movsb
是预取(比movaps
循环更有效),与循环相比,您不会期望 LFB 能够以至少 L2/LLC 切换到线路的可能性更高(或相等)movaps
。如果是这种情况,我不明白:
前者在所有缓存级别之间使用较少的带宽,但特别是在服务器芯片上,一直到内存的切换延迟很长
特别是长延迟切换是否来自。
所以我的问题是
- LFB 上的额外切换延迟从何
rep movsb
而来? - 更一般地说,是什么导致了
rep movsb
memcpy/memset 中的延迟界限?