2011-12-11 25 views

回答

1

我不确定这是不是你想要的,但是IIRC已经有一些架构存在弱存储访问的问题,因为它们可以被任意指定,并且你必须插入内存屏障来确保特定的顺序。

现代处理器使用所谓的“加载存储队列”来隐藏存储器重新排序,使其看起来好像按照程序顺序发生。读取通常会被重新排序(但要谨慎),写入操作可能不按顺序进行,但按顺序执行(尽管对同一位置的多次写入进行了整合),读取和写入操作只是小心翼翼地和推测性地重新排序。后者被称为“提升”,其中在写入之前进行推测(在指令序列中较早出现),并且如果前面的写入会影响它,则可以取消(如错误预测的分支)。另外,如果内存被标记为未高速缓存,则CPU通常推断意味着它是I/O空间并且不执行访问重新排序。 x86和SPARC是这样的。但是,PowerPC仍然会将读取次数重新排列到I/O内存空间,我们必须使用EIEIO(确保执行I/O)指令来强制执行特定的排序。 IIRC,我们还必须在PA-RISC和Alpha上使用内存屏障。此外,x86上有内存障碍,但我不熟悉它们的使用(可能确保访问缓存内存空间的顺序)。

你提到了多核系统。一般来说,采用精心设计的高速缓存一致性协议来使所有内存访问看起来符合某些交织规则,这样,如果没有高速缓存,访问将按照可能的顺序来访问最后一级高速缓存和主内存。

1

许多现代处理器现在使用乱序执行来隐藏内存延迟来提高性能。这与多个处理器/内核无关,可以使用单核处理器独立完成。出于这个原因,你不应该依赖记忆顺序。