From 9143c0d9047515dea0fe47946700b7a1c7a06cec Mon Sep 17 00:00:00 2001 From: myeuler Date: Wed, 13 May 2020 23:42:43 +0800 Subject: [PATCH] =?UTF-8?q?update=20source/=E8=AE=A1=E7=AE=97=E5=AD=90?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F/=E5=86=85=E5=AD=98=E8=AE=BF=E9=97=AE?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B.rst.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\277\351\227\256\346\250\241\345\236\213.rst" | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git "a/source/\350\256\241\347\256\227\345\255\220\347\263\273\347\273\237/\345\206\205\345\255\230\350\256\277\351\227\256\346\250\241\345\236\213.rst" "b/source/\350\256\241\347\256\227\345\255\220\347\263\273\347\273\237/\345\206\205\345\255\230\350\256\277\351\227\256\346\250\241\345\236\213.rst" index 4eaa90a..8c6e669 100644 --- "a/source/\350\256\241\347\256\227\345\255\220\347\263\273\347\273\237/\345\206\205\345\255\230\350\256\277\351\227\256\346\250\241\345\236\213.rst" +++ "b/source/\350\256\241\347\256\227\345\255\220\347\263\273\347\273\237/\345\206\205\345\255\230\350\256\277\351\227\256\346\250\241\345\236\213.rst" @@ -399,6 +399,7 @@ todo:920的Cache QoS特性 ,这个性能无法接受。但作为和其他方案对比,我们把这个方式称为绝对顺序模型。 业界比较常见的内存顺序协议有两种,Total Store Ordering和Weak Memory Ordering。 +后续行文用TSO和WMO来分别指代两种内存访问模型。 这两个名字也不是严格的定义,不同的体系结构对它们有不同的细节要求,但我们总的来 说,它们的原理基本是一致的,我们这里重点讨论这个基本原理。 @@ -424,20 +425,21 @@ mem[1]一个个写下来,到mem[17]写VALID,其他核看到mem[17]=VALID的 print(mem[1]); print(mem[0]); 假定mem里一开始都是0,cpu1上,我们先写mem[0],然后读mem[1]。而cpu2上,我们先写 -mem[1],再读mem[0]。按TSO,它只保证cpu1上的mem[0]写和cpu2上的mem[1]写也是有序 -的,但读在什么时候发生作用是不保证的,那么这些读的结果就可以表现为::: +mem[1],再读mem[0]。按TSO,它只保证cpu1上的mem[0]写和cpu2上的mem[1]写是有序 +的,这里所谓的有序是指cpu1和cpu2看到的写顺序要么是mem[0] = 1,然后mem[1] = 1, +要么是mem[1] = 1,然后是mem[0] = 1,但读在什么时候发生作用是不保证的,因此对于下面四种读输出::: mem[0, 1] = 0, 1 mem[0, 1] = 1, 0 mem[0, 1] = 1, 1 mem[0, 1] = 0, 0 -其中,0,0这个结果在绝对顺序模型中是不会发生的,因为cpu 1已经看到mem[1]是0了, -说明这时mem[0]肯定已经是1了,但TSO只保证了Store的顺序。 +最后一个0,0这个结果在TSO模型中是不会发生的,因为无论两个cpu看到的写顺序是mem[0]先写还是mem[1]先写, +两个cpu看到的写的顺序是一样的,因此,也就一定会有一个cpu读到的数据不可能是0。 -除了这种情形,大部分情形下,TSO是可以保证系统的顺序的。但TSO保证这个顺序,是有 -成本的:很多实现是在每个内存使用者(比如CPU)上设计一个写操作FIFO,所有的写操 -作都需要进行排队,而读操作则需要先从FIFO上看有没有重叠操作,然后再到总线外取得 +TSO模型相对于WMO在一定程度上能简化程序的复杂性,但凡事有利就有弊, +TSO保证写顺序,是有成本的:很多实现是在每个内存使用者(比如CPU)上设计一个写操作FIFO, +所有的写操作都需要进行排队,而读操作则需要先从FIFO上看有没有重叠操作,然后再到总线外取得 数据,这中间存在一个外部的对齐点,读操作需要保证在这个对齐点上同步数据: .. figure:: tso_stall.svg -- Gitee