Memory management 多处理器中存储缓冲区的顺序一致性?
具有写缓冲区的多处理器如何保持顺序一致性? 据我所知,在单处理器中,如果缓冲区是FIFO,并且对主存上待写元素的读取由缓冲区提供,则它会保持一致性。 但是它在国会议员中是如何运作的呢?我认为如果一个处理器在他的缓冲区中放置了一个存储,另一个处理器就不能读取它,我认为这会破坏顺序一致性Memory management 多处理器中存储缓冲区的顺序一致性?,memory-management,architecture,multiprocessing,buffer,Memory Management,Architecture,Multiprocessing,Buffer,具有写缓冲区的多处理器如何保持顺序一致性? 据我所知,在单处理器中,如果缓冲区是FIFO,并且对主存上待写元素的读取由缓冲区提供,则它会保持一致性。 但是它在国会议员中是如何运作的呢?我认为如果一个处理器在他的缓冲区中放置了一个存储,另一个处理器就不能读取它,我认为这会破坏顺序一致性 在每个线程都有写缓冲区的多线程环境中,它是如何工作的?它还会破坏顺序一致性吗 你提到: 通常,CPU只能看到随机访问;内存总线被顺序访问的事实对CPU本身是隐藏的,因此从CPU的角度来看,这里不涉及FIFO 在S
A=1
r1=B
然后,在没有存储缓冲区的情况下,首先将的存储写入缓存/内存。然后从缓存/内存中读取B
但是使用存储缓冲区时,B的负载可能会超过a的存储。因此,在a的存储写入缓存/内存之前,负载将从缓存/内存中读取
SC使用存储缓冲区中断的典型示例是Dekkers算法
lock_a=1
while(lock_b==1){
if(turn == b){
lock_a=0
while(lock_b==1);
lock_a=1
}
}
因此,在顶部,您可以看到存储的lock_a=1
,后面是加载的lock_b
。由于存储缓冲区的原因,这两个线程可能会被重新排序,因此有两个线程可能会进入关键部分
解决这个问题的一种方法是在加载和存储之间添加一个[StoreLoad]围栏,它防止在存储缓冲区耗尽之前执行加载。这样可以恢复SC
注1:存储缓冲区为每个CPU;不是每个线程
注2:存储(和加载)缓冲区在缓存之前。我在这里假设为X86
存储缓冲区中的存储本身不是问题所在。例如,如果CPU只进行存储,并且存储缓冲区中的存储都按顺序退役,那么它的行为将与没有存储缓冲区的处理器完全相同。对于SC,不需要保留实时订单
您已经指出,处理器将按顺序在存储缓冲区中看到自己的存储。违反SC的部分是当存储后面跟着加载到不同地址时
想象一下
A=1
r1=B
然后,在没有存储缓冲区的情况下,首先将的存储写入缓存/内存。然后从缓存/内存中读取B
但是使用存储缓冲区时,B的负载可能会超过a的存储。因此,在a的存储写入缓存/内存之前,负载将从缓存/内存中读取
SC使用存储缓冲区中断的典型示例是Dekkers算法
lock_a=1
while(lock_b==1){
if(turn == b){
lock_a=0
while(lock_b==1);
lock_a=1
}
}
因此,在顶部,您可以看到存储的lock_a=1
,后面是加载的lock_b
。由于存储缓冲区的原因,这两个线程可能会被重新排序,因此有两个线程可能会进入关键部分
解决这个问题的一种方法是在加载和存储之间添加一个[StoreLoad]围栏,它防止在存储缓冲区耗尽之前执行加载。这样可以恢复SC
注1:存储缓冲区为每个CPU;不是每个线程
注2:存储(和加载)缓冲区在缓存之前。我们谈论的是哪种FIFO?有哪种FIFO?我只知道一种FIFO。我也接受基于软件或硬件中各种写缓冲区FIFO的答案。由CPU控制的硬件FIFO,由其他硬件控制。有锁定机制的FIFO,没有…这里的核心问题是:你的问题是关于硬件FIFO还是软件FIFO?关于硬件请问我们谈论的是什么类型的FIFO?有什么类型的FIFO?我只知道一种FIFO。我也接受基于软件或硬件中各种写缓冲区FIFO的答案。由CPU控制的硬件FIFO,co