内存一致性和有关跳转指令的杂谈
浅谈体系结构中对内存一致性定义的重要性和跳转指令使用的简单理解。
内存一致性和内存模型
谈论体系结构的时候常常会讨论到体系结构的内存模型是强一致的还是弱一致的,通常还是在多核的情况下讨论,简单的来讲,一致性指的是一个处理器对内存的写是否立刻对另一个处理器可见,强的一致性保证立刻可见,弱一致性不保证。
这样来看,强一致性能够减少程序员编程的难度,在体系结构层面也就是接口层面,向程序员提供了简单的编程接口,但是随之而来的就是将难度放在了处理器对于内存访问的具体实现上,同时这种方式可能造成访问内存效率的降低。弱一致性从体系结构层面减少了对一致性的控制,将一致性的控制交给程序员,这种方式更加灵活,但是这种方式增加了程序员的编程难度,也增加了编译器的实现难度。
不能说哪种更好,但是肯定是各有各的优点。
跳转指令的使用
在 ARM 中有多种跳转指令,这里提到主要是无条件跳转 B
和 利用寄存器无条件跳转 BR
。在看到这两个寄存器的时候我时常会想到两个问题,既然有了 BR
这种指令能够处理记录任何 64 位地址空间的跳转,为什么还需要 B
指令这种有限范围(-128MB 到 128MB)的跳转指令。
后来一想,这两者还是有区别的,B
指令能够在编译时期就决定跳转的地址,但是 BR
需要在运行时期才能确定寄存器中的值才能跳转,如果用 BR
去替换所有的 B
,那几乎都要用
asm
mov x4, #address
br x4
这样的方式去替代,这样相对于 B
指令多了对寄存器的一次修改和读写,可能会降低效率。另一个很多时候跳转的地址范围在编译链接的时候很可能就在(-128MB 到 128MB)之内,就这种情况下还用 BR
代替 B
感觉是在小题大做。即使遇到了不在这个范围内的地址,获取可以考虑用 BR
来替代,这应该是编译器和链接器需要做的工作。