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

时间:2011-07-28 00:00:31

标签: c++ c performance optimization numerical

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

更多详情:

我感兴趣的是在C / C ++等低级语言中进行科学计算(很多数字运算,但不仅仅是)的优化。我特别感兴趣的是优化方法并不明显,除非人们对机器的工作原理有很好的了解(我还没有)。

例如,很明显,更好的算法更快,而不知道它运行的机器的任何信息。如果首先在矩阵的行或行中循环,那么这一点并不明显。 (最好循环遍历矩阵,以便连续读取存储在相邻位置的元素。)

非常欢迎有关该主题或文章指示的基本建议。

答案

得到了许多伟大指针的答案,比我有时间阅读的要多得多。这是所有这些的列表:

我需要一点脱脂时间来决定使用哪一个(没有时间)。

8 个答案:

答案 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 ++开发人员!)

你最终应该学习很多东西,例如:

  • 内存缓存访问模式
  • 表达模板(谷歌搜索结果表达模板上有一些不良链接 - 您想要找到的关键场景/属性是他们可以编码一系列操作中的许多连续步骤,以便它们全部应用于数据集上的一个循环)
  • 一些特定于CPU的指令(虽然我没有检查过他们使用过这种非便携式技术)......

答案 7 :(得分:1)

我从书中Inner Loops学到了很多东西。现在它很古老,从计算机的角度来看,但写得非常好,而Rick Booth对他的主题非常热衷,我仍然会说它值得一看,看看你需要什么样的思维模式让CPU飞起来。