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

How to write fast (low level) code?

本文关键字:低级 代码 何编写      更新时间:2023-10-16

我想了解更多关于底层代码优化的知识,以及如何利用底层机器架构。我正在寻找关于在哪里阅读这个主题的好的指针。

更多细节:

我对用C/c++等低级语言进行科学计算(这是大量的数字运算,但不仅仅是)中的优化很感兴趣。我特别感兴趣的是那些不明显的优化方法,除非一个人对机器的工作原理有很好的理解(我还没有)。

例如,很明显,一个更好的算法是更快的,而不知道它运行在什么机器上。首先循环矩阵的列还是行,这一点都不明显。(最好循环遍历矩阵,以便依次读取存储在相邻位置的元素。)

关于主题的基本建议或文章的指针是最受欢迎的。

得到了很多很棒的提示的答案,比我有时间阅读的要多得多。以下是它们的列表:

  • 来自Intel的软件优化食谱(书)
  • 每个程序员都应该知道的内存(pdf书)
  • 编写伟大的代码,第二卷:低级思考,编写高级代码(书)
  • 软件优化资源Agner Fog(五个详细的pdf手册)

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

Drepper的What Every Programmer Should Know About Memory [pdf]是关于底层优化的一个很好的参考。

对于英特尔架构,这是无价的:软件优化食谱,第二版

我已经读了好几年了,但是Randall Hyde写的《写好代码,第二卷:低级思考,高级写作》非常好。它给出了C/c++代码如何转换成汇编的好例子,例如,当你有一个大的switch语句时,实际会发生什么。

此外,altdevblogaday.com专注于游戏开发,但编程文章可能会给你一些建议。

Hacker's Delight是一本关于位操作和做低级事情的聪明方法的有趣的书。

对于那些对低级代码感兴趣的人来说,这绝对值得一读。

查看:http://www.agner.org/optimize/

C和c++通常是用于此的语言,因为它们的速度快(忽略Fortran,因为您没有提到它)。您可以利用SSE指令集来处理大量浮点数运算(icc编译器可以利用很多)。另一件可能的事情是使用CUDA和Nvidia/Ati的流API分别在显卡上做非常快的浮点运算,同时让CPU自由地做其余的工作。

另一种方法是动手比较。你可以得到一个像Blitz++ (http://www.oonumerics.org/blitz/)这样的库,有人告诉我,它为数值/科学计算实现了积极的优化,然后编写一些简单的程序来做你感兴趣的操作(例如矩阵乘法)。当你使用Blitz++来执行它们时,编写你自己的类来做同样的事情,如果Blitz++证明更快,开始研究它的实现,直到你意识到原因。(如果你的速度快得多,你可以告诉Blitz++开发者!)

你最终会学到很多东西,例如:

    内存缓存访问模式
  • 表达式模板(在Google搜索结果上有一些不好的链接,你想找到的关键场景/属性是它们可以在操作链中编码许多连续的步骤,这样它们都可以在数据集的一个循环中应用)
  • 一些特定于cpu的指令(尽管我没有检查他们是否使用了这种不可移植的技术)…

我从《Inner Loops》这本书中学到了很多。这是古老的,在计算机术语,但它写得很好,里克·布斯是如此热情的主题,我仍然会说,这是值得一看,看看你需要让一个CPU飞的心态。