【问题标题】:How to write fast (low level) code? [closed]如何编写快速(低级)代码? [关闭]
【发布时间】:2011-10-14 17:23:45
【问题描述】:

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

更多详情:

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

例如,很明显更好的算法更快,而无需了解运行它的机器的任何信息。如果一个人首先循环遍历矩阵的列或行,这一点并不明显。 (最好循环遍历矩阵,以便依次读取存储在相邻位置的元素。)

欢迎提供有关该主题的基本建议或文章指针。

答案

得到了很多很好的答案,比我有时间阅读的要多得多。以下是所有这些的列表:

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

【问题讨论】:

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

标签: c++ c performance optimization numerical


【解决方案1】:

对于英特尔架构,这是无价的:The Software Optimization Cookbook, Second Edition

【讨论】:

  • 从描述看来,这正是我要找的 :-)
  • 你知道有没有类似的书,但是是针对 arm 架构的?
  • @hexa:不幸的是我什么都不知道。快速搜索会发现类似amazon.com/ARM-System-Developers-Guide-Architecture/dp/… 的内容,但我从未打开过这些内容。对于我链接中的那个,我可以 100% 保证它的质量非常好,并且包含很多技巧和窍门。
【解决方案2】:

C 和 C++ 通常是用于此目的的语言,因为它们速度快(忽略 Fortran,因为您没有提到它)。您可以利用的(icc 编译器经常这样做)是用于大量浮点数运算的 SSE 指令集。另一件可能的事情是分别为 Nvidia/Ati 使用 CUDA 和 Stream API 来在显卡上进行非常快速的浮点运算,同时让 CPU 腾出时间来完成其余的工作。

【讨论】:

  • 是的,例如我想了解的一件事是如何利用 SSE:如何编写编译器可以轻松生成 SSE 代码的代码,或者如何显式地 使用 C++ 中的 SSE,而不求助于汇编语言。
  • 我认为那里有包装库,如果您可以使用 ICC 编译器(不确定它是否对某些平台免费),它会为您做很多事情。还有那个 -1 是从哪里来的?
  • 我是这么认为的,哦,好吧。我还建议研究 Stream/CUDA 以流水线化繁重的数学运算,因为显卡能够以非常快的速度做到这一点。
  • 我了解 CUDA(并且想尝试一下,但无法使用合适的 GPU,因此到目前为止从未使用过),但是我的问题的要点不是 what 要使用的技术,但如何 高效地使用 CPU,尤其是 x86/x64 CPU。
  • 如果没有广泛的答案,这很难回答,因为我们不知道您到底想做什么。我会从 SSE 开始,甚至可能是英特尔编译器(再次不确定它是否免费),然后查看另一个答案发布的书。
【解决方案3】:

Drepper 的 What Every Programmer Should Know About Memory [pdf] 很好地参考了低级优化的一个方面。

【讨论】:

  • +1,快速浏览:在 114 页中,它非常详细且技术性强,甚至谈到了不同内存类型的物理实现,但还包含一个很多与我的问题相关的信息,特别是关于使用 CPU 缓存的信息。有很多关于优化和正确基准测试的信息。
  • 关于缓存的章节对于任何不讨厌客户的程序员来说都是必读的。
【解决方案4】:

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

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

  • 内存缓存访问模式
  • 表达式模板(Google 搜索结果表达式模板顶部有一些错误链接 - 您要讨论的关键场景/属性是它们可以对一系列操作中的许多连续步骤进行编码,以便在一个数据集的循环)
  • 一些特定于 CPU 的指令(尽管我没有检查过它们是否使用了此类非便携式技术)...

【讨论】:

    【解决方案5】:

    我已经读了好几年了,但是 Randall Hyde 的 Write Great Code, Volume 2: Thinking Low-Level, Writing High-Level 相当不错。它给出了 C/C++ 代码如何转换为汇编的很好的例子,例如当你有一个大的switch 声明时,会发生什么。

    另外,altdevblogaday.com 专注于游戏开发,但编程文章可能会给您一些想法。

    【讨论】:

      【解决方案6】:

      【讨论】:

        【解决方案7】:

        Hacker's Delight 是一本关于位操作和智能处理低级事物的有趣书籍。

        这对于所有对低级编码感兴趣的人来说绝对值得一读。

        【讨论】:

          【解决方案8】:

          我从Inner Loops这本书中学到了很多东西。它现在很古老,用计算机术语来说,但它写得很好,而且 Rick Booth 对他的主题如此热情,我仍然认为值得一看,看看你需要什么样的心态才能让 CPU 飞起来。

          【讨论】:

          • 感谢您的建议!这本书也可以通过here [archive.org] 获得,但只有在特定条件下才能访问。
          猜你喜欢
          • 2014-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-15
          相关资源
          最近更新 更多