10

我正在寻找诸如在多处理器的情况下甚至可能破坏代码的代码重新排序之类的东西。

4

4 回答 4

13

最重要的是内存访问重新排序。

没有内存栅栏或序列化指令,处理器可以自由地重新排序内存访问。一些处理器架构对它们可以重新排序的数量有限制;Alpha 以最弱(即最能重新排序)而闻名。

可以在 Linux 内核源文档的Documentation/memory-barriers.txt中找到对该主题的非常好的处理。

大多数时候,最好使用编译器或标准库中的锁定原语;这些都经过了很好的测试,应该有所有必要的内存屏障,并且可能已经非常优化(优化锁定原语很棘手;即使是专家有时也会弄错)。

于 2008-11-07T14:48:34.580 回答
0

是的,但你的问题到底是什么?

然而,因为这是一个有趣的话题:编译器和处理器用来优化代码的技巧不应该破坏代码,即使是多个处理器,在代码中没有竞争条件的情况下。这称为顺序一致性保证:如果您的程序没有任何竞争条件,并且所有数据在访问之前都被正确锁定,那么代码的行为就好像它是按顺序执行的一样。

Herb Sutter 有一个非常好的视频在这里谈论这个:

http://video.google.com/videoplay?docid=-4714369049736584770

每个人都应该看这个:)

于 2008-11-07T14:39:08.157 回答
0

维基百科在这里有一个相当全面的优化技术列表。

于 2008-11-07T14:44:42.277 回答
0

DavidK 的回答是正确的,但是了解您的语言/运行时的内存模型也非常重要。即使没有竞争条件并且具有顺序一致性和互斥锁使用情况,当运行在 cpu 不同内核中的不同线程缓存数据时,您的代码仍然可能中断。一些语言,Java 就是一个例子,在使用互斥锁时确保线程之间的数据状态,但是仅仅确保没有两个线程可以同时访问数据是不够的。您需要以正确的方式使用互斥锁,以确保语言运行时同步两个线程之间的数据状态。在java中,这是通过让两个线程在同一个对象上同步来完成的。

这是一个很好的页面,解释了这个问题以及它是如何在 javas 内存模型中处理的。

http://gee.cs.oswego.edu/dl/cpj/jmm.html

于 2008-11-07T14:58:03.500 回答