Tom*_*nto 5 cpu-architecture memory-model cpu-registers
我最近一直在阅读关于内存模型的内容,我对这是如何工作感到困惑.
引用http://cis.poly.edu/muller/CS623/weakmemory.htm
如果处理器写入一个新的X然后写一个新的Y,所有其他处理器随后执行读取Y然后读取X,将访问新的Y和新的X,旧的Y和新的X,或旧的X和旧的Y:但没有处理器会访问新的Y和旧的X.这种强烈排序的假设在某种程度上是合理的.然而,当前的计算机制造商建议程序员不依赖于存储器排序.这是因为较新的内存管理系统尝试重新排序内存访问以进行优化.允许重新排序内存请求的系统称为弱排序内存系统(模型).要检查如何使用重新排序来提高性能,请考虑以下汇编程序代码[2].
Load reg1, A // register1 = contents of memory A
Load reg2, B // register2 = contents of memory B
ADD reg3, reg1, reg2 // register3 = register1 + register2
Store reg3, C // contents of memory C = contents of register3
Run Code Online (Sandbox Code Playgroud)
如果我们假设位置B当前在高速缓存中并且位置A没有被高速缓存,那么加载A将花费比B更长的时间而不是等待A,CPU可以从其高速缓存中获取B,隐藏B的延迟:因此CPU可以执行A一旦可用就加入.通过放宽执行的强(顺序)内存模型(即A必须首先加载,然后是B),可以实现更高的性能----但重新排序可能对软件不透明.考虑下面的代码片段,它是可用于实现自旋锁信号量的代码的一部分[2].
我的问题是,如果使用较弱的内存模型可能会导致处理器可以访问新的Y和旧X.它是不是写入相同的内存(ram)或者它的工作方式不同?我假设如果一个进程修改一个变量而另一个进程在此之后读取它,它会读取最新的值.
另一件我不确定的是哪个组件允许内存访问重新排序,我现在的假设是允许编译器重新排序指令.但CPU是否也可以对它们进行重新排序?
谢谢
您必须记住,缓存位于 CPU 和内存之间。当软件写入一个值时,它肯定会进入缓存,但如果在缓存将其复制到 RAM 之前再次写入该值,它可能永远不会进入主内存(想想循环变量和局部变量)。整个讨论围绕数据实际放入 RAM 或从 RAM 读取的不同模型。在核心内,这并不重要,因为它们将使用来自缓存或 RAM 的最后写入值。
| 归档时间: |
|
| 查看次数: |
2015 次 |
| 最近记录: |