当前位置: 首页 > 知识库问答 >
问题:

优化的汇编代码

司徒斌
2023-03-14

因此,通常关于通过汇编代码提高性能的问题的答案是“不要打扰,编译器比你聪明”。我明白了。

但是,我注意到优化的线性代数库(例如ACML)可以比标准编译库实现2到5倍的性能改进。例如,在我的8核机器上,与现有的单线程BLAS实现相比,优化的矩阵乘法运行速度快了30倍以上,这意味着,在考虑了由于使用所有内核而提高的8倍之后,仅仅通过优化仍然可以提高4倍。

所以在我看来,优化的汇编代码确实可以带来巨大的变化。我错过了什么吗?

我在问,因为如果它不是异常困难,我可能会倾向于在其他代码段上尝试这个。没什么复杂的,但是如果我可以通过在汇编中编写它来对一些小的内部循环进行2倍的改进,这可能是值得的。

共有2个答案

郎祯
2023-03-14

优化的汇编代码可以为您带来巨大的速度提升。

我的研究表明,关于“编译器更好”的说法是有偏见的,与现实生活无关。这是一个神话。

只有当你把用真正好的编译器编译的写得好的HLL程序和写得差的汇编程序相比较,编译器才更好。

没有那么多优秀甚至体面的汇编程序员,这是另一回事

鱼渝
2023-03-14

矩阵-矩阵乘积的加速部分是由于使用汇编代码。在一个简单的实现中,主要的瓶颈是内存访问。大多数时候,你的CPU会等待进行实际的计算。

首先,您必须修改矩阵-矩阵乘法的算法,以便尽可能频繁地重用L2和L1缓存中的数据。这可以用C(或C或Fortran或...).这将导致当矩阵大小变得大于您的缓存时,实现不会崩溃。这也意味着实现可以一直进行计算(CPU寄存器中需要的数据几乎总是在L1缓存中,L1缓存中需要的数据几乎总是在L2缓存中,...).

下一步是优化完成所有计算的热点。这只涉及C代码的几行(在我的GEMM教程中只有10行)。汇编代码在指令流水线、循环展开(用于改进分支预测)、预取(用于减少缓存未命中)、使用SSE(或AVX)方面进行优化。

类似的技术可用于其他BLAS级功能。实际上,他们中的大多数使用GEMM函数的内部东西(所谓的微内核)。

在ulmBLAS基准测试中,您可以看到,大约所有BLAS Level 3功能都可以实现大致相同的性能。

为了更彻底地阅读,我建议你写一篇很好的论文《编程矩阵计算的科学》,作者是罗伯特·范·德·盖恩和恩里克·金塔纳-奥尔蒂。您可能还想看看BLIS,其中大多数想法都采用并简化了ulmBLAS。

 类似资料:
  • 我正在为64位mips机器使用gcc编译器。我注意到生成的一段汇编代码很有趣。下面是详细信息: 通常,bnez将立即跳到0xb0。但在0xb0之后的块中,我确信程序必须使用a1作为参数。但是我们可以看到,在0xb0之后,a1从未出现在块中。 但是a1在0x58中使用,就在bnez(0x54)之后。 那么0x54和0x58指令有可能同时执行吗?超标量处理器通过同时将多条指令分派到处理器上的冗余功能单

  • 我经常遇到这种情况。乍一看,我认为,“这是糟糕的编码;我正在执行一个方法两次,必然会得到相同的结果。”但想到这里,我不得不怀疑编译器是否像我一样聪明,并能得出相同的结论。 编译器的行为是否取决于 方法的内容?假设它看起来像这样(有点类似于我现在的真实代码): 除非对这些对象来自的任何存储进行处理不当的异步更改,否则如果连续运行两次,肯定会返回相同的内容。但是,如果它看起来像这样(为了论证而无意义的

  • Donald Knuth "过早的优化是一切罪恶的根源" 本章处理用策略让Python代码跑得更快。 先决条件 line_profiler gprof2dot 来自dot实用程序 2.4.1 优化工作流 让它工作起来:用简单清晰的方式来写代码。 让它可靠的工作:写自动的测试案例,以便真正确保你的算法是正确的,并且如果你破坏它,测试会捕捉到。 通过剖析简单的使用案例找到瓶颈,并且加速这些瓶颈,寻找更

  • 我编译了以下C代码: 使用命令 .下面是输出中的 Bar 函数: 我有几个关于这个汇编代码的问题: > 如果函数体中既没有使用也没有使用rsp,那么"",""和""的目的是什么? 为什么和自动包含C函数的参数(分别为和)而不从堆栈中读取它们? 我尝试将Foo的大小增加到88字节(11s),指令变成了。将我的结构设计为“圆形”大小以避免乘法指令(以优化数组访问)是否有意义?指令被替换为:

  • 我目前正在编写一些C99标准库字符串函数的高度优化版本,如< code>strlen()、< code>memset()等,使用带有SSE-2指令的x86-64汇编。 到目前为止,我已经设法在性能方面取得了出色的成绩,但是当我试图进一步优化时,我有时会遇到奇怪的行为。 例如,添加甚至删除一些简单的指令,或者简单地重组一些与跳转一起使用的本地标签会完全降低整体性能。而且在代码方面绝对没有理由。 所以

  • 有没有代码写的漂亮的大佬,看看这个代码怎么优化,一直写前端的,突然被叫去搞java,发现很多技术都不太相同,例如动态的key去调用之类,导致写出这样的恶心代码,自己都看不下去了 明明js可以写的这么短小优雅,java有没有办法做到这样子的呢