2008-11-07 54 views
7

我正在寻找诸如在多处理器的情况下甚至可能破坏代码的重新排序代码的事情。处理器如何优化代码有哪些技巧?

+0

可否请你更新到这一短语在问题的形式? – 2008-11-07 14:36:58

+0

你的意思是编译器吗?因为你会得到截然不同的答案... – 2008-11-07 14:36:59

+0

哪个编译器?哪个平台? – 2008-11-07 14:37:31

回答

0

维基百科的优化技术here相当全面的清单。

0

是的,但究竟是什么问题?

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

有香草萨特的一个很好的视频说起这个位置:

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

每个人都应该看这个:)

13

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

缺少内存隔离或序列化指令,处理器可自由重新排序内存访问。一些处理器体系结构对它们可重新排序的次数有限制; Alpha被认为是最弱的(即可以重新排序最多的那个)。

在Linux内核源文档的Documentation/memory-barriers.txt处可找到有关该主题的非常好的处理方法。大多数情况下,最好使用来自编译器或标准库的锁定原语;这些都经过了充分的测试,应该具备所有必要的内存屏障,并且可能是相当优化的(优化锁定原语是非常棘手的;即使专家有时也会让它们错误)。

0

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

这是一个很好的网页,解释问题以及如何在javas记忆模型中处理它。

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