2014-05-12 82 views
0

我想熟悉彙編程序中的編程。在開始時我選擇了隨機代碼並嘗試更新它。我還閱讀了一些關於循環展開的內容,但我不知道從哪裏開始。代碼優化和循環展開

這是我的代碼,我已經修改了一下:

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 
+3

您可能要問一個實際的問題,這是習慣在這裏 – Leeor

+0

這是一個很大的NOP ... – twalberg

+0

我想我知道如何使用循環展開,但我還是不知道如何改進代碼 – NULLexit

回答

0

循環展開是出以創作的代碼,如果它被稱爲是一個短環。這是爲了節省使用分支需要很長時間的特別嚴重的流水線處理器的循環開銷(沖洗和重新填充管道)。

基本上是:不是

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

你做的只是:

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

我不認爲你通過展開環增益什麼。

+0

這在具有並行執行單元(如PowerPC或Itanium)的處理器體系結構中更爲常見。如果指令佈置正確,PowerPC可以在一個時鐘週期內執行多個整數指令。這是否可以提高性能很大程度上取決於你在做什麼。衡量,衡量,衡量。 – jbruni

+0

是的,我忘了提及。我會提到TI C64X DSP內核。 – turboscrew

0

我讀了一些關於循環展開的內容,我想我明白了。你怎麼看待下面的代碼?

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