如何编写快速(低级)代码?
我想了解有关低级代码优化以及如何利用底层机器架构的更多信息。 我正在寻找关于在哪里阅读有关此主题的好指示。
更多细节:
我感兴趣的是在C / C ++等低级语言中进行科学计算(这是一个很多数字运算但不仅仅是 )的优化。 我特别感兴趣的是优化方法,这些方法并不明显,除非人们对机器的工作原理有很好的了解(我还没有)。
例如,很明显,更好的算法更快,而不知道它运行的机器的任何信息。 如果首先循环遍历列或行的矩阵,那么这一点并不明显。 (最好循环遍历矩阵,以便连续读取存储在相邻位置的元素。)
关于该主题的基本建议或文章指针是最受欢迎的。
答案
得到了许多伟大指针的答案,比我有时间阅读的要多得多。 这是所有这些的列表:
- 英特尔软件优化食谱 (书)
- 每个程序员应该了解的内存 (pdf书)
- 写出伟大的代码,第2卷:思考低级,写高级 (书)
- Agner Fog的软件优化资源 (五本详细的pdf手册)
我需要一些脱脂时间来决定使用哪一个(没有时间)。
Drepper的每个程序员应该知道的内存[pdf]是对低级优化的一个方面的一个很好的参考。
对于英特尔架构而言,这是无价之宝: 软件优化手册,第二版
我阅读它已经有几年了,但Randall Hyde 撰写的Great Code,Volume 2:Thinking Low-Level,Writing High-Level非常好。 它给出了C / C ++代码如何转换为汇编的很好的例子,例如当你有一个大的switch
语句时真正发生的事情。
此外, altdevblogaday.com专注于游戏开发,但编程文章可能会给你一些想法。
Hacker’s Delight是一本关于位操作和处理低级别事物的聪明方法的有趣书籍。
对于对低级编码感兴趣的每个人来说,这绝对值得一读。
查看: http : //www.agner.org/optimize/
C和C ++通常是用于此的语言,因为它们的速度(忽略了Fortran,因为你没有提到它)。 你可以利用的(icc编译器做了很多)是SSE指令集,用于大量的浮点数运算。 另一件可能的事情是分别使用CUDA和Stream API为Nvidia / Ati在显卡上进行非常快速的浮点运算,同时让CPU自由地完成剩下的工作。
另一种方法是亲自动手比较。 您可以获得一个像Blitz ++(http://www.oonumerics.org/blitz/)这样的库 – 我被告知 – 实现对数字/科学计算的积极优化,然后编写一些简单的程序来执行您感兴趣的操作(例如矩阵乘法)。 当你使用Blitz ++来执行它们时,编写你自己的类来做同样的事情,如果Blitz ++certificate更快,就开始研究它的实现,直到你意识到为什么。 (如果你的速度明显快,你可以告诉Blitz ++开发人员!)
你最终应该学习很多东西,例如:
- 内存缓存访问模式
- 表达模板(谷歌搜索结果表达模板上有一些不良链接 – 你想要找到的关键场景/属性是他们可以编码一系列操作中的许多连续步骤,这样它们都可以在一个循环中应用数据集)
- 一些CPU特定的指令(虽然我没有检查过他们使用过这种非便携式技术)……
我从“ 内环 ”一书中学到了很多东西。 现在它很古老,从计算机的角度来看,但写得非常好,而Rick Booth对他的主题非常热衷,我仍然会说它值得一看,看看你需要什么样的心态来让CPU飞起来。