【问题标题】:code optimalization and loop unrolling代码优化和循环展开
【发布时间】:2014-05-12 17:05:23
【问题描述】:

我正在努力熟悉汇编程序中的编程。一开始我选择了随机代码并尝试更新它。我还阅读了一些关于循环展开的内容,但我真的不知道从哪里开始。

这是我已经修改了一点的代码:

0000: 4401000C |            | ADDI R0, 0x000C, R1
0004: 00000000 |            | NOP  
0008: 00000000 |            | NOP  
000C: 0C220000 | loop       | LDW  R2, 0x0000(R1)
0010: 00000000 |            | NOP  
0014: 00000000 |            | NOP  
0018: 1C411000 |            | ADD  R2, R1, R2
001C: 00000000 |            | NOP  
0020: 00000000 |            | NOP  
0024: 4C420004 |            | MULI R2, 0x0004, R2
0028: 00000000 |            | NOP  
002C: 00000000 |            | NOP  
0030: 18220040 |            | STW  R2, 0x0040(R1)
0034: 48210008 |            | SUBI R1, 0x0008, R1
0038: 00000000 |            | NOP  
003C: 00000000 |            | NOP  
0040: 0C230004 |            | LDW  R3, 0x0004(R1)
0044: 00000000 |            | NOP  
0048: 00000000 |            | NOP  
004C: 18230044 |            | STW  R3, 0x0044(R1)
0050: 7C01FFB8 |            | BRGE R1, loop
0054: 00000000 |            | NOP  
0058: 00000000 |            | NOP  
005C: 7000FFFC | halt       | BRZ  R0, halt
0060: 00000000 |            | NOP  
0064: 00000000 |            | NOP  

【问题讨论】:

  • 你可能想问一个实际的问题,这里很习惯
  • NOP 太多了...
  • 我想我知道如何使用循环展开,但我仍然不知道如何改进代码
  • “NOP 太多了...... – twalberg”。我也想知道。这些人不应该有床。 AVR 的流水线并没有那么繁重。
  • 那么为什么是所有的 NOP?有时它们用于对齐。但你到达那里的次数太多了。

标签: assembly loop-unrolling


【解决方案1】:

如果已知它是一个短循环,则循环展开就是将代码写出。那是为了节省循环开销,特别是流水线过多的处理器,分支需要很长时间(刷新和重新填充流水线)。

基本上:代替

for (i=0; i<3; i++)
{
   a[i] = 0;
}

你做的很简单:

a[0] = 0;
a[1] = 0;
a[2] = 0;

我认为展开循环不会有任何收获。

【讨论】:

  • 这在具有并行执行单元的处理器架构上更为常见,例如 PowerPC 或 Itanium。如果指令布局正确,PowerPC 可以在一个时钟周期内执行多个整数指令。这是否会提高性能在很大程度上取决于您在做什么。测量,测量,测量。
  • 是的,我忘了提。我会参考 TI C64X DSP 内核。
【解决方案2】:

我阅读了更多关于循环展开的内容,我想我明白了。你觉得下面的代码怎么样?

0000: 4401000C |            | ADDI R0, 0x000C, R1
0004: 00000000 |            | NOP  
0008: 00000000 |            | NOP  
000C: 0C220000 | loop       | LDW  R2, 0x0000(R1)
0010: 0C24FFF8 |            | LDW  R4, 0xFFF8(R1)
0014: 0C23FFFC |            | LDW  R3, 0xFFFC(R1)
0018: 0C25FFF4 |            | LDW  R5, 0xFFF4(R1)
001C: 1C822000 |            | ADD  R4, R2, R4
0020: 1C411000 |            | ADD  R2, R1, R2
0024: 48210008 |            | SUBI R1, 0x0008, R1
0028: 48260008 |            | SUBI R1, 0x0008, R6
002C: 4C420004 |            | MULI R2, 0x0004, R2
0030: 4C840004 |            | MULI R4, 0x0004, R4
0034: 18230044 |            | STW  R3, 0x0044(R1)
0038: 18C50044 |            | STW  R5, 0x0044(R6)
003C: 18220048 |            | STW  R2, 0x0048(R1)
0040: 18C40048 |            | STW  R4, 0x0048(R6)
0044: 00000000 |            | NOP  
0048: 00000000 |            | NOP  
004C: 7000FFFC | halt       | BRZ  R0, halt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多