如果在独占缓存访问期间发生写操作,为什么会出现数据竞争?

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

我正在阅读有关MESI协议的内容,如果我们对每个写入操作都有独占访问权限而无法理解为什么会出现数据争用,从而使其他内核缓存中的缓存行无效?在这个例子中:

CYCLE # CORE 1                        CORE 2
0   reg = load(&counter);   
1   reg = reg + 1;                reg = load(&counter);
2   store(&counter, reg);         reg = reg + 1;
3                                 store(&counter, reg);

据说整体结果是变量只增加一次,而两个核心都试图递增它(结果预计为2)。所以问题是,如果在写入操作期间两个核心都请求对高速缓存行的独占访问(因此其他核心“等待”他们轮到修改并因此也获得独占访问权限)为什么在该变量上存在数据竞争?

cpu x86-64 atomic instructions mesi
1个回答
4
投票

如果我把事情看好了,MESI就是这里的一个红鲱鱼:

0   reg = load(&counter);   

counter现已加载到CPU的寄存器中。

1   reg = reg + 1;                reg = load(&counter);

第一个处理器递增值,第二个处理器加载旧值。

2   store(&counter, reg);         reg = reg + 1;

第一个处理器存储值,第二个处理器增加其过时的值。

3                                 store(&counter, reg);

第二处理器基于过期值存储计算结果。

到目前为止应该清楚。现在,如果添加MESI状态会如何改变:

0   reg = load(&counter);   

counter在CPU 1缓存中,标记为E

1   reg = reg + 1;                reg = load(&counter);

counter仍然驻留在CPU 1缓存中,但也被加载到CPU 2缓存中。因此,两个缓存行都需要标记为S

2   store(&counter, reg);         reg = reg + 1;

现在counter被存储回缓存中。因此,CPU 1高速缓存需要标记为M,而CPU 2高速缓存则无效(标记为I)。

3                                 store(&counter, reg);

当CPU 2高速缓存失效时,需要在store操作发生之前更新,这反过来要求CPU 1高速缓存在(当然)之前写回存储器。

但是现在所做的一切,reg中的值仍然是基于过时的值计算的,并且仍然覆盖缓存中的(现在更新的)值...

添加最后的细节:操作完成后,CPU 2缓存将被标记为M和CPU 1缓存I

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