假设我们有一个具有两个内核(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字节插槽上发出存储指令,则将...
通常来说,对于不会被后续代码很快读取的商店,该商店不会直接