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

31

我想了解更多关于低级别代码优化的内容,以及如何利用底层机器架构。我正在寻找有关此主题的好指导。

更多细节:

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

例如,一个更好的算法比机器上运行时的任何信息都要快。如果一个人按列而不是按行循环遍历矩阵,这并不明显。(最好遍历矩阵,以便连续读取存储在相邻位置的元素。)

关于这个主题的基本建议或指向相关文章的链接都非常欢迎。

答案:

收到了很多很棒的指针,比我有时间阅读的还多。以下是所有指针的列表:

我需要一点时间浏览一下,以决定使用哪一个(没有时间阅读所有内容)。


感谢所有的回答。虽然我只能接受一个答案,但所有的回答都非常有帮助。不幸的是,我无法获得英特尔的书,我怀疑它对我来说可能比被接受的答案更有用。 - Szabolcs
8个回答

17

从快速浏览来看:这本书有114页,非常详细和技术性,甚至涉及不同内存类型的物理实现,但也包含了很多与我的问题相关的信息,特别是关于使用CPU缓存的内容。书中有大量关于优化和正确基准测试的信息。 - Szabolcs
1
缓存章节对于任何不想让客户恨他们的程序员来说都是必读的。 - Crashworks

12

从描述来看,这正是我正在寻找的 :-) - Szabolcs
你知道是否有一本类似的书,但是关于ARM架构的吗? - Vinicius Kamakura
@hexa:很遗憾,我不知道有什么好的书籍推荐。快速搜索结果显示像http://www.amazon.com/ARM-System-Developers-Guide-Architecture/dp/1558608745这样的书籍,但我从未打开过这些书籍。对于我链接中的那本书,我可以百分之百地保证它具有出色的质量,并且充满了技巧和诀窍。 - Remus Rusanu

6
《Hacker's Delight》是一本关于位操作和低级编程的有趣书籍,对于所有对低级编码感兴趣的人来说都值得一读。

6


4

通常使用C和C++来进行此操作,因为它们速度快(不考虑Fortran,因为您没有提到它)。您可以利用SSE指令集(这是icc编译器经常使用的)来进行大量浮点数运算。另一种可能性是使用CUDA和Stream API分别为Nvidia / Ati,以在图形卡上进行非常快的浮点运算,同时使CPU空闲以执行其余工作。


是的,比如说我想学习的一个东西就是如何利用SSE:如何编写代码,让编译器能够轻松生成SSE代码,或者如何在C++中明确地使用SSE,而不必求助于汇编语言。 - Szabolcs
我认为有一些包装库可以使用,如果你能够获得ICC编译器(不确定是否免费适用于某些平台),它可以为你完成很多工作。另外,那个-1是从哪里来的? - Jesus Ramos
我本来就是这么想的,好吧。我还建议研究一下Stream/CUDA,以便将重型数学运算进行流水线处理,因为显卡能够以惊人的速度完成这项工作。 - Jesus Ramos
我了解CUDA(并且想尝试它,但是迄今为止没有适合的GPU可供使用),然而我的问题不在于选择什么技术,而在于如何高效地使用CPU,特别是x86/x64 CPU。 - Szabolcs
这个问题很难回答,因为我们不知道你具体想做什么。我建议先从SSE开始,甚至可能使用英特尔编译器(不确定是否免费),并查看其他答案中发布的书籍。 - Jesus Ramos
试试英特尔的ISPC编译器吧,它是开源的,所以你可以看到自动向量化的效果(或者如果它生成的代码足够快,直接使用也可以)。 - user755921

2
另一种方法是进行实际比较。您可以获取类似Blitz++(http://www.oonumerics.org/blitz/)的库,据我所知,该库实现了用于数值/科学计算的积极优化,然后编写一些简单的程序来执行您感兴趣的操作(例如矩阵乘法)。使用Blitz++执行它们时,请编写自己的类以执行相同的操作,如果Blitz++被证明更快,请开始调查其实现直到您意识到原因。(如果您的程序显着更快,则可以告诉Blitz++开发人员!)
您应该学到很多东西,例如:
- 内存缓存访问模式 - 表达式模板(在Google搜索结果的顶部有一些错误的链接关于表达式模板 - 您想要找到的关键场景/属性是它们可以编码许多连续的操作步骤,以便它们都可以在对数据集的一次循环中应用) - 一些特定于CPU的指令(尽管我没有检查它们是否使用了这种非可移植技术)...

1

我从Inner Loops这本书中学到了很多东西。虽然在计算机领域,它现在已经有些古老了,但它写得非常好,Rick Booth对他的主题非常热情,我仍然认为值得一看,以了解你需要让CPU飞起来的那种心态。


谢谢建议!这本书也可以在这里[archive.org]找到,但是只有在特定条件下才能访问。 - Szabolcs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接