gpt4 book ai didi

c++ - 存储指令是否在高速缓存未命中时阻止后续指令?

转载 作者:行者123 更新时间:2023-12-01 13:34:06 26 4
gpt4 key购买 nike

假设我们有一个具有两个内核(C0和C1)的处理器,以及一条从C0最初拥有的地址k开始的缓存行。如果C1在k行的8字节插槽上发布了一条存储指令,这会影响在C1上执行的以下指令的吞吐量吗?

英特尔优化手册具有以下段落

When an instruction writes data to a memory location [...], the processor ensures that it has the line containing this memory location is in its L1d cache [...]. If the cache line is not there, it fetches from the next levels using a RFO request [...] RFO and storing the data happens after instruction retirement. Therefore, the store latency usually does not affect the store instruction itself



引用以下代码,
// core c0
foo();
line(k)->at(i)->store(kConstant, std::memory_order_release);
bar();
baz();

英特尔手册中的引言让我假设,在上面的代码中,代码的执行看起来就好像商店本质上是无人值守,并且不会影响 foo()结束与 bar()起始之间的延迟。相反,对于以下代码,
// core c0
foo();
bar(line(k)->at(i)->load(std::memory_order_acquire));
baz();

加载会影响 foo()的结束与 bar()的开始之间的延迟,因为以下代码将加载的结果作为依赖项。

这个问题主要与上述情况下的英特尔处理器(在Broadwell系列或更高版本中)如何工作有关。同样,尤其是对于上面看起来像C++的代码如何被编译为这些处理器的程序集。

最佳答案

一般而言,对于不会很快被后续代码读取的商店,该商店不会在任何现代乱序处理器(包括英特尔)上直接延迟该后续代码。

例如:

foo()
*x = y;
bar()

如果 foo()不修改 xy,并且 bar不从 *x加载,则商店是独立的,甚至可以在o​​jit_code完成之前(或什至开始之前)开始执行,并且 foo()可以在商店提交给the之前执行。缓存,并且 bar()甚至可以在o​​jit_code运行时执行,等等。

尽管几乎没有直接影响,但这并不意味着没有间接影响,实际上存储可能会主导执行时间。

如果存储未命中高速缓存,则在满足高速缓存未命中的情况下,它可能占用内核外资源。它还通常可以防止随后的存储耗尽,这可能是一个瓶颈:如果存储缓冲区已满,则前端将完全阻塞并且新指令将不再进入调度程序。

最后,一切照常取决于周围代码的细节。如果该序列重复运行,并且 bar()foo()较短,则与存储相关的未命中可能会主导运行时。毕竟,缓冲不能掩盖无限数量的商店的成本。在某些时候,您会受到商店内在吞吐量的束缚。

关于c++ - 存储指令是否在高速缓存未命中时阻止后续指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62419261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com