如何编写快速(低级)代码?

我想了解有关低级代码优化以及如何利用底层机器架构的更多信息。 我正在寻找关于在哪里阅读有关此主题的好指示。

更多细节:

我感兴趣的是在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飞起来。