这实际上是一个2部分问题:
对于想要挤压每个时钟周期的人,人们会谈论管道,缓存局部性等。
我已经看到了这里和那里提到的这些低水平的表现技术,但我从头到尾都没有看到对这个主题的一个很好的介绍。任何资源建议? (谷歌给了我定义和论文,我非常感谢某些实用的实例/教程真实的动手实物材料)
一个人如何衡量这种事情?就像在某种形式的探查器中一样?我知道我们总是可以改变代码,回顾一下改进和理论,我只是想知道是否有成熟的工具。
(我知道算法优化是大小顺序的地方。我对这里的金属感兴趣)
答案 0 :(得分:3)
回复的合唱是“不要过早优化”。正如你所提到的,你会从更好的设计中获得更多的性能,而不是更好的循环,你的维护者也会欣赏它。
那说,回答你的问题: 学习装配。装配很多很多。当你可以换班时,不要以2的幂为MUL。了解xor的奇怪用法来复制和清除寄存器。具体参考, http://www.mark.masmcode.com/和http://www.agner.org/optimize/
是的,您需要为代码计时。在* nix上,它可以像time { commands ; }
一样简单,但您可能希望使用全功能分析器。 GNU gprof是开源的http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html
如果这真的是你的事,那就去吧,玩得开心,记住,很多很多位数学。你的维护者会讨厌你;)
答案 1 :(得分:2)
EDIT / REWRITE:
如果是书籍,你需要迈克尔·阿布拉什在这方面做得很好,汇编语言的禅,一些杂志文章,大黑图书编程等等。他所调整的大部分内容不再是问题,问题已经改变。你将从中得到的是可以导致瓶颈和各种方法解决的各种事物的想法。最重要的是计算所有时间,并了解您的计时测量如何工作,这样您就不会通过错误测量来欺骗自己。计算不同的解决方案,尝试疯狂,奇怪的解决方案,你可能会发现一个你不了解的优化,直到你暴露它才意识到。
我刚开始阅读但是看到MIPS Run(早期/第一版)到目前为止看起来不错(请注意,ARM接管MIPS作为处理器市场的领导者,所以MIPS和RISC炒作有点陈旧)。关于MIPS,有许多新旧教科书。 Mips是为性能而设计的(在某些方面以软件工程师为代价)。
今天的瓶颈属于处理器本身及其周围的I / O类别以及与I / O相关的内容。处理器芯片本身(对于高端系统)的内部运行速度比I / O可以处理的速度快得多,所以在你必须离开芯片并永远等待之前,你只能调整到目前为止。下火车,从火车到目的地,乘坐火车3个小时快半分钟,不一定是值得的优化。
关于学习硬件,你可以保持在零和零的世界,而不必进入实际的电子产品。但是,如果不真正了解接口和内部结构,您实际上无法进行太多的性能调整。您可能会重新安排或更改一些说明并获得一些提升,但要使速度提高几百倍,您需要更多。学习许多不同的指令集(汇编语言)有助于进入处理器。我建议模拟HDL,例如opencores中的处理器,以了解一些人如何进行设计并掌握如何真正挤出任务中的时钟。处理器知识很大,内存接口是一个巨大的交易,需要学习,媒体(闪存,硬盘等)和显示器和图形,网络,以及所有这些东西之间的所有类型的接口。在时钟级别或尽可能接近它的理解是它需要的。
答案 2 :(得分:1)
Intel和AMD提供x86和x86-64的优化手册。
http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html/
http://developer.amd.com/documentation/guides/pages/default.aspx
另一个优秀的资源是agner。
http://www.agner.org/optimize/
一些关键点(没有特别的顺序):
答案 3 :(得分:1)
我建议Optimizing subroutines in assembly language An optimization guide for x86 platforms。
虽然这是非常重的东西;)
答案 4 :(得分:1)
是的,衡量,是的,了解所有这些技术。
有经验的人会告诉你“不要过早优化”,我将其简单地称为“不要猜测”。
他们也会说“使用分析器来找到瓶颈”,但我有一个问题。我听到很多关于人们使用剖析器的故事,他们喜欢他们很多或者喜欢他们的输出。 SO满满的。
我没有听到很多成功案例,并且实现了加速因素。
我使用的方法非常简单,我试图提供很多例子,including this case。