【发布时间】:2020-04-22 19:41:25
【问题描述】:
在文章“A formal kernel memory-ordering model”中,提出了以下违反直觉的记忆模型试金石:
P0(int *a, int *b)
{
WRITE_ONCE(*a, 1); //1
smp_wmb();
WRITE_ONCE(*b, 1); //2
}
P1(int *a, int *b)
{
int r1;
WRITE_ONCE(*b, 2); //3
smp_mb();
r1 = READ_ONCE(*a); //4
}
exists
(b=2 /\ 1:r1=0)
观察b == 2 暗示 3) 在 2) 之后完成。并且由于 2) 是在 1) 之后排序的,因此观察 r1 == 0 永远不可能。给出的解释是对b == 2 的观察并不意味着 3) 是在 2) 之后排序的。相反,一个 hart 较早发出的内存写入可能会覆盖另一个 hart 稍后发出的内存写入。 this presentation 的第 71-72 页显示了一种可能发生这种情况的机制。
这真的发生在当前的硬件中吗?例如,RISC-V 在其specification(第 88 页)中有以下“加载值公理”:
每次加载的每个字节i返回由以下存储中全局内存顺序最新的存储写入该字节的值:
在全局内存顺序中写入该字节并在 i 之前的存储
写入该字节并且在程序顺序中位于 i 之前的存储
这是否禁止观察到较早的写入可以覆盖以后的写入?
【问题讨论】:
-
“hart”是“core”的误译吗,就像在 CPU core 中一样?
-
“hart”是“硬件线程”的缩写
-
好吧,显然这个词是为 RISC-V 编造的。 RiscV spec references the word 'hart' - what does 'hart' mean?。我从未见过它在任何其他计算机架构讨论中使用过。我想有一个简短的词来表示“逻辑核心”会很有用。
标签: linux riscv memory-barriers memory-model