我想了解有关低级代码优化以及如何利用底层机器架构的更多信息。我正在寻找关于在哪里阅读有关此主题的好指示。
更多详情:
我感兴趣的是在C / C ++等低级语言中进行科学计算(很多数字运算,但不仅仅是)的优化。我特别感兴趣的是优化方法并不明显,除非人们对机器的工作原理有很好的了解(我还没有)。
例如,很明显,更好的算法更快,而不知道它运行的机器的任何信息。如果首先在矩阵的行或行中循环,那么这一点并不明显。 (最好循环遍历矩阵,以便连续读取存储在相邻位置的元素。)
非常欢迎有关该主题或文章指示的基本建议。
答案
得到了许多伟大指针的答案,比我有时间阅读的要多得多。这是所有这些的列表:
我需要一点脱脂时间来决定使用哪一个(没有时间)。
答案 0 :(得分:17)
Drepper的What Every Programmer Should Know About Memory [pdf]是对低级优化的一个方面的一个很好的参考。
答案 1 :(得分:12)
对于英特尔架构,这是无价的:The Software Optimization Cookbook, Second Edition
答案 2 :(得分:6)
我阅读它已经有几年了,但兰德尔海德的Write Great Code, Volume 2: Thinking Low-Level, Writing High-Level非常好。它给出了C / C ++代码如何转换为汇编的很好例子,例如:当你有一个很大的switch
陈述时会发生什么。
此外,altdevblogaday.com专注于游戏开发,但编程文章可能会给你一些想法。
答案 3 :(得分:6)
有关位操作和处理低级别事物的智能方法的一本有趣的书是Hacker's Delight。
对于对低级编码感兴趣的每个人来说,这绝对值得一读。
答案 4 :(得分:5)
答案 5 :(得分:4)
C和C ++通常是用于此的语言,因为它们的速度(忽略了Fortran,因为你没有提到它)。你可以利用(icc编译器做了很多)的SSE指令集用于大量的浮点数运算。另一件事可能是分别使用CUDA和Stream API为Nvidia / Ati在显卡上进行非常快速的浮点操作,同时让CPU自由地完成剩下的工作。
答案 6 :(得分:2)
另一种方法是动手比较。您可以获得一个像Blitz ++(http://www.oonumerics.org/blitz/)这样的库 - 我被告知 - 对数字/科学计算实施积极的优化,然后编写一些简单的程序来执行您感兴趣的操作(例如矩阵乘法)。当你使用Blitz ++来执行它们时,编写你自己的类来做同样的事情,如果Blitz ++证明更快,就开始研究它的实现,直到你意识到为什么。 (如果你的速度明显快,你可以告诉Blitz ++开发人员!)
你最终应该学习很多东西,例如:
答案 7 :(得分:1)
我从书中Inner Loops学到了很多东西。现在它很古老,从计算机的角度来看,但写得非常好,而Rick Booth对他的主题非常热衷,我仍然会说它值得一看,看看你需要什么样的思维模式让CPU飞起来。