我一直在阅读x86内存模型的工作原理以及x86上屏障指令的重要性,并与其他架构(如ARMv8)进行比较。在x86和ARMv8架构中,内存模型似乎(无意双关)尊重传递性/累积性,即如果CPU 1看到CPU0的存储,而CPU2看到CPU1的存储只有在CPU1看到CPU0存储时才会发生,那么CPU2也必须看到CPU0的存储。我指的示例是Paul McKenney著名论文第6.1节中的示例1和2(尽管很旧,但在他最新的perf Cook book中也存在同样的事情,http://www.puppetmastertrading.com/images/hwViewForSwHackers.pdf)。如果我理解正确,x86使用存储队列(或存储顺序缓冲区)在存储变得全局可见(即写入L1D)之前对存储进行排序(以及其他微拱形优化)。我的问题是x86拱形(和其他拱形)如何实现(微架构)传递性属性?存储队列确保特定CPU的存储以特定顺序全局可见,但如何确保由一个CPU排序的存储与由不同CPU排序的存储?
在x86上,只有一个一致性域。当存储提交到L1d缓存时,其他所有核心都可以同时看到存储。总的来说,加上MESI,就足以给我们一个所有线程都能同意的总存储订单。
一些ISA(包括PowerPC)没有该属性(实际上是因为物理核心内的失效存储跨SMT线程进行存储转发)。因此,在POWER硬件上,其他两个读者可以以不同的顺序看到来自两个线程的mo\u Released存储。对不同线程中不同位置的两个原子写入是否总是以相同的顺序被其他线程看到?(大概是PowerPC上的屏障阻止了该转发。)
ARM内存模型过去允许这种IRIW(独立读取器独立写入器)重新排序,但实际上从来没有ARM HW这样做过。ARM能够加强他们的内存模型,以保证所有内核都同意由多个其他内核完成的存储的全局顺序。
(存储转发仍然意味着执行存储的核心在其变得全局可见之前就可以立即看到它。当然,负载排序要求核心能够说他们看到了有关独立写入排序的任何内容。)
如果所有内核必须就存储的全局排序达成一致,那么(在您的示例中)从Core2看到存储意味着Core1一定已经发生,并且您也可以看到它。
(假设Core2使用适当的屏障或获取加载或释放存储,以确保其存储发生在看到Core1存储的加载之后。)
可能也相关:
无障碍性(a11y) 当你设计一款扩展,需要让扩展对于诸如视觉缺陷,失聪,行动不便的残疾人没有使用障碍。 所有人 — 不仅仅是有特殊需求的人 — 都应该能从那些无障碍扩展所提供的相应模式中获益。例如,键盘的快捷键对于盲人,灵敏度较差的那些人非常重要,然而他们也能提高高级用户在无鼠标状态下的工作效率。 字幕和手抄本提供了聋人获取影音内容的通道,然而他们对语言学习者也非常有用。 人们可以通过各种方式和
如何使XML模式接受一个元素的两个属性? 我一直尝试这样编写XSD: 我还尝试用。 每次尝试用XMLLINT验证它时,它都会抛出如下所示的错误: ?
我有一个mongoose对象模式,看起来类似于以下内容: 我试图创建一个新的职位使用以下内容: 但是,一旦我保存了文章,它就会被创建为带有images属性的空数组。我做错了什么?
我想在main函数中打印Tweet数据类型的实例,但摘要特征不实现调试特征。有没有办法在特征或任何工作上实现特征。取消注释第二行并注释第一行将工作,因为字符串类型实现了显示特征。 error[E0277]: 未实现 -- 错误:由于以前的错误而中止 有关此错误的更多信息,请尝试。错误:无法编译。 要了解更多信息,请使用--verbose再次运行该命令。
问题内容: 我有一个属性指令,其限制如下: 我需要传递两个属性;一个数字和一个函数/回调,使用对象在指令中访问它们。 如果指令是元素指令,那么我可以限制为: 但是,出于某种原因,我不再赘述,我需要将该指令作为属性指令。 如何将多个属性传递到属性指令中? 问题答案: 该指令可以访问在同一元素上定义的任何属性,即使该指令本身不是该元素也是如此。 模板: 指示: 如果attribute的值将被硬编码,则
我正在使用task-launcher-sink 1.3.1发行版和SDCF 1.4.0发行版在PCF上启动我的任务。“我的任务”的默认分配堆不足以运行它,因为“我的任务”正在处理较大大小的数据。因此,它给出了堆分配错误,资源耗尽事件:JVM无法从堆中分配内存。 通过在PCF上手动提供MyTask>Setting>User Provided Environment变量中的java_opts=-xms