【问题标题】:ASM faster with looping?ASM 通过循环更快?
【发布时间】:2013-03-05 23:12:14
【问题描述】:

汇编器中的代码循环是否更快/等于/更慢,然后只需编写指令 x 次,这是需要的吗?还是依赖于代码? 但是机器何时执行二进制文件更快:如果 16 位 CPU 直接读取其 16 位还是返回 32 位?

最后; asm中的循环是什么意思?

【问题讨论】:

  • 在汇编中,一切都依赖于代码和机器。在现代处理器(例如 x86-64)中,最快的计算方法需要在保持所有内核和所有 CPU 线程对所有时钟都忙碌之间找到最佳折衷方案,通过优化使用缓存来避免 CPU 停顿(如果数据适合缓存,也就是说),如果任务允许,则使用矢量化指令等。当只有并行执行是 CPU/FPU 并行时,对于 486 和更早的处理器来说事情很简单。如今,为了获得最快的代码,您需要注意所有几个内核每个时钟都做一些有用的事情。
  • 所以如果指令数量大于循环指令能够处理(跳回),那么 asm 循环几乎不能被处理? -也就是说,如果我的文件不超过 512 个字节,那么我不能在最后一个字节进行循环调用。 -> 或者如果我要在 16 位 cpu 上添加 32 位和 32 位,cpu 必须自动将此操作拆分为一个循环。然后,将 1 位添加 16 次的循环与将 16 位添加到零/空寄存器一样快。那么还有一个问题是,在执行代码时,允许使用哪些寄存器循环指令,哪些寄存器可以相交。
  • 首先,这不是关于进程,而是关于处理器内核。其次,loop 不一定是最快的循环指令。第三,你应该检查stackoverflow.com/questions/8389648/…和Mysticial对它的出色回答。

标签: assembly


【解决方案1】:

这取决于。重复一些指令可能会更快。这种技术通常称为loop unrolling。未展开的循环也可以变得更有效,因为代码会更小,并且许多 CPU 能够并且通常可以识别循环模式并预测它。也可以有一个部分展开的循环。例如,与其直接执行 20 条指令或执行 20 次循环迭代,不如执行 5 次循环迭代,每次执行 4 条指令。

通常,如果不知道您所针对的架构(即 CPU 的品牌和型号),就很难判断什么是最好的。这就是为什么人们不会真正编写大量汇编代码的原因——分析不同方法的优缺点、执行成本以及为不同的 CPU 品牌和型号生成不同的代码是编译器开发人员要做的事情。然后其他人用他们选择的语言编写代码,编译器为目标平台生成可能的最佳程序集,这在 99% 的情况下都有效。

要回答您的问题,您可能会自己编写这两个版本并分析它们以查看哪个版本获胜。或者,您可以用 C 编写代码并为您的平台启用优化(即使用-O3-march 开关),然后查看编译器生成什么——它肯定会做正确的事情。

希望对您有所帮助。祝你好运!

【讨论】:

  • 同意,这在很大程度上取决于。仅当展开的代码不会破坏 CPU 执行的各种指令缓存级别的大小时,展开循环才是有益的。至少如果缓存未命中的惩罚高于分支/分支预测未命中的惩罚,情况会如此。正如您所说,部分展开通常是有益的 - 例如一次迭代处理至少一个高速缓存行的数据,或一个“整行”向量寄存器。与紧密循环相比,部分展开的循环通常还提供更多“隐藏延迟”(即混合加载/存储操作与 ALU 操作)的机会。
【解决方案2】:

loop 在 asm 中通常表示 branch-if-equal 或类似的东西。如果您使用的是 HLE 并且不在一个在一条指令中进行比较和分支的平台上工作,则它可能是一个伪指令,相当于 x86 cmpl 然后是 je

MIPS 分支指令:http://en.wikibooks.org/wiki/MIPS_Assembly/Control_Flow_Instructions#Branch_Instructions

同时查看问题:

【讨论】:

    猜你喜欢
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 2020-02-17
    相关资源
    最近更新 更多