如何编写快速(低级)代码
How to write fast (low level) code?
我想了解更多关于底层代码优化的知识,以及如何利用底层机器架构。我正在寻找关于在哪里阅读这个主题的好的指针。
更多细节:
我对用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飞的心态。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 如何将高级/低级编程代码直接转换为机器代码
- C 优化 - 低级代码
- 低级键盘挂钩:区分键代码
- 如何编写快速(低级)代码