编写内联汇编而不是常规c / c ++代码要快多少?

时间:2011-10-23 21:45:36

标签: c++ c assembly

我的一位资深同事通过编写内联汇编来优化函数(他正在实现图像过滤)。这真的有必要吗?现代编译器不会为我们这样做吗?通常,通过将C代码转换为汇编代码,我们获得了多少收益?如果汇编代码确实带来了很多好处,那么我们何时应该将C / C ++代码转换为汇编代码,何时应该保留代码,因为汇编代码很难读取和维护。

8 个答案:

答案 0 :(得分:7)

如果您比编译器更聪明,那么可能能够通过手动编写程序在一个特定平台上更快地编写代码。

但是,大多数大型C / C ++编译器都是好的优化器;你不可能比他们聪明。

答案 1 :(得分:4)

不,这不是必需的,而且这也使移植应用程序更加不同。这是内联汇编的主要问题。

当然,80%的时间编译器可以做得更好。

答案 2 :(得分:4)

  1. 首先找到一个有效的算法。
  2. 然后用清晰易读的代码实现它。
  3. 然后评估其表现。
  4. 如果您的代码性能不足,请考虑替代算法
  5. 重复步骤3和4,直到性能可接受或您已用尽所有算法替代
  6. 喝点咖啡。
  7. 散步。
  8. 再重复步骤3和4。
  9. 喝啤酒。
  10. 再给步骤3和4一些尝试。
  11. 休息一下
  12. 回到3和4。
  13. 花费数年时间研究代码将在其上运行的CPU的架构
  14. 现在考虑手写一些装配。

答案 3 :(得分:3)

  

我的一位资深同事通过编写内联汇编来优化函数(他正在实现图像过滤)。这真的有必要吗?

显然我不能评论你的同事的具体情况,但如果有必要,我不会感到惊讶。有许多专用指令用于图像过滤器,编译器不一定会使用这些指令。内联汇编通常是访问这些指令(或通过内在函数)的唯一方法。

  

现代编译器不会为我们这样做吗?

显然这取决于'那个'是什么,但是现代编译器肯定擅长生成代码,它们并不神奇。通常情况下,您对编译器没有(或不能)的代码有所了解。

如果您的工作涉及高性能代码,那么肯定会有一些地方可以通过内联汇编(甚至只是编译器内部函数)获得重大改进。

  

如果汇编代码确实带来了很多好处,那么我们何时应该将C / C ++代码转换为汇编代码,何时应该保留代码,因为汇编代码很难读取和维护。

以下是:

  1. 首先,对您的代码进行分析,看看有哪些潜在的好处。
  2. 查看反汇编以查看编译器正在执行的操作。如果它已经做得最好,那就没有必要进一步了。
  3. 如果有改进的机会,可以考虑在手写汇编之前使用编译器内在函数,因为它通常更容易维护和更便携。
  4. 只有当所有失败时才进入内联汇编。

答案 4 :(得分:3)

我想,对于图像过滤,您可能会受益于,例如SIMD指令的可用性,但并非所有编译器都能自动编译您的代码以使用它们,而不是所有时间。因此,内联汇编或intrinsics可以帮助解决这个问题。

答案 5 :(得分:0)

简短的回答是不是没有必要,更长的答案是......好吧,这取决于。现代编译器确实在优化代码方面做得很好,但它们并不一定能够访问人类在优化时所做的所有假设。手动编码汇编程序可以击败编译代码,但在可移植性和维护之间存在权衡。

假设您已经确定这段代码是热点,那么您应该做的第一件事是调整算法,然后调整C ++代码以使其更快(例如展开循环),然后调整编译器标志。作为最后的手段,如果您仍然无法按照自己的需要快速进行,请考虑是否需要支付手动优化的成本,考虑到维护和便携性带来的所有未来成本。

答案 6 :(得分:0)

在涉及图像处理的地方,我会谨慎,因为它取决于输入数据,算法和编译器。英特尔的ICC有一个非常好的并行化器和矢量器,用于生成SSE代码,在大多数通用图像处理案例中可能很难手动击败。另一方面,VCC可能做得不好。 但是,我希望使用编译器内在函数而不是内联汇编程序可以获得最大的好处。

答案 7 :(得分:0)

编程语言编码得很好。除非您使用非常简单的按位操作,例如add,bitshift或使用指针或新指令集,否则您应该使用实用的编程语言。你生活中的任何事情都不需要汇编语言。标准c操作调用相关的cpu指令。如果某人创建了一个新CPU并且它支持新指令并且您希望使用这些指令,则编程语言或库不支持它们,并且适应需要时间。 cpu中的新指令会使事情变得更快,但你不会在像DirectX或Opengl或MMX,SSE bla bla bla这样的团队中工作。想象有一天,像directx或opengl这样的图形库没有开发出来,而英特尔,比如说,创建了一些当前没有任何语言支持的isntruction集,或者没有开发的库中没有。然后你想从cpu调用一些方法并将你的参数传递给它,以获得更好的性能。没有cpu中的新指令,你仍然可以做同样的事情。另一个例子,intel的新cpu可以支持md5哈希检查,它并不意味着你不能使用md5,这意味着开发使用md5指令的库将更快地工作,因为cpu有一个单独的实体,里面将有效地执行操作。但通常你会等到有人发布一个在cpu中使用md5指令的库。 cpus今天为zip,哈希检查,加密等添加了指令集。您将使用汇编语言进行某些特定指令。因为你的编程语言已经以最有效的方式使用它们,所以不是为了好的旧的加,乘,减或除。