http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html,2012年8月,第3A卷,第三节。8.2.2:
任何两个存储都是由执行存储的处理器以一致的顺序看到的。
但这会是这样吗?
我问这个问题的原因是:考虑一下带有HyperThreading的英特尔双核处理器。根据手册的第1卷,图2-8,i7的逻辑处理器0和1共享一个L1/L2缓存,但是它的逻辑处理器2和3共享一个不同的L1/L2缓存,而所有逻辑处理器共享一个L3缓存。假设逻辑处理器0和2 --它们不共享L1/L2缓存--大约在同一时间写入相同的内存位置,并且目前写的内容并不比L2更深。逻辑处理器1和3(它们是“执行存储的处理器以外的处理器”)不能看到“两个存储的顺序不一致”吗?
为了实现一致性,逻辑处理器0和2不能发出SFENCE指令,逻辑处理器1和3不能发出LFENCE指令吗?尽管如此,“手册”似乎不这么认为,它在这一问题上的意见看上去并不仅仅是印刷错误。看起来是故意的。我很困惑。
更新
根据@Benoit的回答,下面是一个问题:因此,L1和L2的唯一目的是加速负载。是L3加快了商店的速度。是那么回事吗?
发布于 2013-01-09 05:00:45
我相信英特尔文档的意思是,x86芯片的机制将确保其他处理器始终以一致的顺序看到写操作。
因此,其他处理器在读取该内存位置时只会看到以下结果之一:
处理器1不可能在处理器0写后看到值,但同时让处理器3在处理器2写后看到值(反之亦然)。
请记住,由于允许内部处理器重新排序(见8.2.3.5节),处理器的0和2可能会有不同的看法。
发布于 2013-01-09 14:45:53
哎哟,这是个棘手的问题!但我会尽力..。
写的并不比L2更深
基本上,这是不可能的,因为英特尔使用包容性缓存。写入L1的任何数据也将在L2和L3中发生,除非通过CR0/MTRR禁用它们来阻止缓存。
尽管如此,我猜还有仲裁机制:处理器发出写数据的请求,仲裁者从来自每个请求队列的未决请求中选择哪个请求被授予。选择的请求被广播给窥探者,然后传送到缓存。我认为它将防止竞争,强制执行执行请求的处理器以外的处理器所看到的一致顺序。
https://stackoverflow.com/questions/14228235
复制相似问题