不准发言
- 积分
- 891
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2012-4-26
- 最后登录
- 1970-1-1
|
嗯,Q家uarch问题问得还是挺深的,起码比敝司问得深多了……
如果要讨论uarch的话,你又说了BP之类的东西,当然要讨论$。BP和$应该都是uarch的概念。
mem addr的RAR确实会有dependency,不过是不是true dependency我也不清楚。这个是cache consistency问题,只靠cache coherency是解决不了的。
对于多核乱序内存访问来说,对不同核之间的操作顺序是没有要求的(如果软件有要求的话那需要软件通过barrier之类的指令来自行保证);但是对于同一个核的两个读访问来说,必须保证较老的读访问不能比较新的读访问读到更新的值。
比方说,CoreA有LDR1, LDR2;CoreB有STR1,都是指向同一个地址。那么在乱序执行下,可能会有这样几个执行顺序:
1. LDR1, LDR2, STR1
2. LDR1, STR1, LDR2
3. STR1, LDR1, LDR2
4. STR1, LDR2, LDR1
5. LDR2, LDR1, STR1
6. LDR2, STR1, LDR1
前5种情况都是合法的,因为LDR1读到的值都不比LDR2新。但是在第6种情况下,LDR2读到的是old value,LDR1读到的是new value,这是违反要求的。
即使有$ coherency,这个问题也解决不了。因为$ coherency要解决的问题是保证一个核的写必然能被其他核看到,但是并不能严格保证该写操作相对于其他核的读操作之间的顺序。考虑第6种情况,假设使用MESI协议,两个核的$里都有这个地址,状态为S(也不能是别的状态了),那么会发生以下事情:
1. CoreA的LDR2从自己的cache中拿到old value X
2. CoreB要写$,发invalidation,将CoreA $变成I, CoreB自己的$变成E
3. CoreB写$,状态变成M,该地址的value变成Y。
4. CoreA的LDR1要读$,但是miss,于是向下级内存发出读请求,下级内存再向CoreB发读snoop
5. CoreB将自己的dirty line(含有value Y)写回下级内存,自己的状态变成S。
6. 下级内存将含有value Y的$ line返回给CoreA,CoreA的$ line状态变成S
7. CoreA的LDR1读到Y。
为了解决这种问题,乱序执行处理器需要有一个buffer track所有提前执行的load的地址信息,一旦该load在可以在retire之前,其所在地址的$或者translation发生了变化的话,那么该load需要被flush掉,以避免上面的情况发生。
RAR这个问题如果在面向fresh MS的面试里面问算是非常狠了,因为学校教材里面基本不会讲这个,但是工业界做的话这个问题又必须要考虑。我面别人的时候一般不会问这个,问了也只能算bonus question,答不上来也不会影响结果。我印象里我问过的人也没有能答上来的。
最后两个人比较过分了,要么是黑你要么是面之前就内定不要你了……既然有了offer也不要再纠结了。 |
|