处理器优化代码的一些技巧是什么?

时间:2008-11-07 14:34:37

标签: language-agnostic optimization processor

我正在寻找重新排序代码的事情,甚至可能在多处理器的情况下破坏代码。

4 个答案:

答案 0 :(得分:13)

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

缺少内存屏障或序列化指令,处理器可以自由重新排序内存访问。某些处理器架构限制了它们可以重新排序的程度; Alpha被认为是最弱的(即可以重新排序最多的那个)。

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

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

答案 1 :(得分:0)

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

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

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

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

每个人都应该注意这一点:)

答案 2 :(得分:0)

维基百科有一个相当全面的优化技术列表here

答案 3 :(得分:0)

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

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

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