存储指令是否阻止高速缓存未命中的后续指令?

问题描述 投票:2回答:1

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

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

当一条指令将数据写入存储位置时,处理器确保其包含此存储位置的行在其L1d缓存中。如果高速缓存行不存在,它将使用RFO请求RFO从下一层进行提取,并在指令退出后存储数据。因此,存储延迟通常不会影响存储指令本身]

参考以下代码,

// core c0
foo();
line(k)->at(i)->store(kConstant, std::memory_order_release);
bar();
baz();

intel手册中的引言使我假设,在上面的代码中,代码的执行将看起来像商店本质上是无操作的,并且不会影响foo()末尾与C0之间的延迟。 bar()的开始。相反,对于以下代码,

// core c0
foo();
bar(line(k)->at(i)->load(std::memory_order_acquire));
baz();

foo()的末尾与bar()的开始之间的等待时间将受到负载的影响,因为以下代码将负载的结果作为依赖项。


此问题主要与上述情况下的英特尔处理器(在Broadwell系列或更高版本中)如何工作有关。另外,尤其是关于如何将类似于上面的C ++代码编译为这些处理器的汇编。

假设我们有一个具有两个内核(C0和C1)的处理器,以及一个从地址k开始的缓存行,该行最初由C0拥有。如果C1在第k行的8字节插槽上发出存储指令,则将...

c++ concurrency x86 cpu-architecture cpu-cache
1个回答
0
投票

通常来说,对于不会被后续代码很快读取的商店,该商店不会直接

© www.soinside.com 2019 - 2024. All rights reserved.