gpt4 book ai didi

c++ - 原子增量正在刷新其他缓存行(提供的代码和结果)?

转载 作者:太空狗 更新时间:2023-10-29 21:42:58 24 4
gpt4 key购买 nike

设置:Intel Ivy Bridge Core i7,在 64 位模式下编译,MSVC(2012) 和 Win 7 64 位。

我想了解原子增量是否会导致缓存未命中。

我设置了一个测试,其中一个原子变量和另一个变量在同一个缓存行中,而不在同一个缓存行中,然后比较缓存未命中。代码和结果如下。

结果

不同的缓存行:

  • 原子增量,无 L1 缓存未命中
  • d.a 的两个增量都遭受了 40-50% 的 L1 缓存未命中。

相同的缓存行

  • 递增 d.a 没有缓存未命中
  • 递增原子遇到 100% L1 缓存未命中

有人可以解释一下吗?!我期望当 atomic 与 d.a 位于同一缓存行时,d.a 将遭受 100% 缓存未命中,而当它们位于不同的缓存行时 d.a 不会受到影响。

#include <atomic>
#include <iostream>
#include <iomanip>
#include <vector>

//Structure to ensure not in same cache line
__declspec(align(64)) struct S{
volatile double a,b,d,c,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t;
volatile std::atomic<short> atom;
};

//Structure to ensure same cache line
/*__declspec(align(64)) struct S{
volatile std::atomic<short> atom;
volatile short a;
};*/


int main(){

volatile S d;

for(long long i=0; i<1000000000; i++){
d.a++;
d.atom++;
d.a++;
}
}

更新这里是一些汇编:

    /* _Atomic_fetch_add_2, _Atomic_fetch_sub_2 */
inline _Uint2_t _Fetch_add_seq_cst_2(volatile _Uint2_t *_Tgt, _Uint2_t _Value)
{ /* add _Value to *_Tgt atomically with
mov word ptr [_Tgt],dx
mov qword ptr [rsp+8],rcx
push rdi
sequentially consistent memory order */

return (_INTRIN_SEQ_CST(_InterlockedExchangeAdd16)((volatile short *)_Tgt, _Value));
movzx eax,word ptr [_Value]
mov rcx,qword ptr [_Tgt]
lock xadd word ptr [rcx],ax
}
pop rdi

最佳答案

看这个序列:

for(long long i=0; i<1000000000; i++){
d.a++;
d.atom++;
d.a++;
}

我们可以(大致)将其重写为:

for(long long i=0; i<1000000000 / 4; i+=4){
d.a++;
d.atom++;
d.a++;
d.a++;
d.atom++;
d.a++;
d.a++;
d.atom++;
d.a++;
d.a++;
d.atom++;
d.a++;
}

我可以继续进一步扩展循环,但很明显在 d.atom++ 之后有两个 d.a++ 连续出现。

换句话说,根据循环末尾的 d.a++d.a++ 用于循环的下一次迭代。任何与此的差异都是测量错误(我认为缓存未命中是根据统计数据测量的,而不是精确行上的精确步骤)。

在 d.a 和 d.atom 位于不同缓存行的情况下,显然 d.atom++ 获取了该特定地址上的所有缓存未命中,解释了这种情况下的 100% 数字.

我不是 100% 确定锁定操作的定义(“锁定操作”= x86 领域的原子)需要缓存刷新,但它肯定需要“独占访问”,这意味着所有其他 CPU( cores) 将需要被告知“您现在必须从缓存中清除此数据的任何拷贝”。从您的测试来看,至少在这种处理器型号上,这相当于“刷新该行的所有缓存”,包括当前保存数据的缓存。

关于c++ - 原子增量正在刷新其他缓存行(提供的代码和结果)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24102832/

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