理解内存模型

5

最近我一直在研究内存模型,但是对于它的工作原理感到有些困惑。

引用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

如果我们假设位置B当前在缓存中,而位置A没有被缓存,那么加载A将比B需要更长的时间。CPU可以从其缓存中获取B,隐藏B的延迟,而不是等待A,因此CPU可以在A可用时立即执行加法。通过放宽强(顺序)执行内存模型(即A必须先加载,然后是B),可以实现更高的性能,但重新排序可能对软件不透明。考虑下面的代码片段,它是可以用来实现自旋锁信号量的代码的一部分[2]。
我的问题是,一个更弱的内存模型怎么可能导致处理器访问新的Y和旧的X。它不是写入同一内存(RAM)吗?还是有所不同?我认为如果一个进程修改了一个变量,另一个进程在此之后读取它,它会读取最新的值。
另一件我不确定的事情是哪个组件允许内存访问重新排序,我现在的假设是编译器允许重新排序指令。但是CPU也可以重新排序它们吗?
谢谢
2个回答

4

您必须记住,缓存位于CPU和内存之间。当软件写入一个值时,它肯定会落在缓存中,但如果该值在缓存将其复制到RAM之前再次被写入,则可能根本不会进入主内存(考虑循环变量和本地变量)。整个讨论围绕着数据实际何时放置在RAM中或从RAM中读取的不同模型展开。在核心内部,这并不重要,因为它们将使用最后一个写入的值,无论它来自缓存还是RAM。


0

编译器和 CPU 都可以重新排序指令。请参见内存排序


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接