оптимизация кода и развертывание циклов

Я пытаюсь познакомиться с программированием на ассемблере. В начале я выбрал случайный код и попытался его обновить. Также я читал некоторые вещи о развертывании цикла, но я действительно не знаю, с чего начать.

Это мой код, который я уже немного изменил:

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  

person NULLexit    schedule 12.05.2014    source источник
comment
Возможно, вы захотите задать актуальный вопрос, здесь это принято   -  person Leeor    schedule 12.05.2014
comment
Это много NOP...   -  person twalberg    schedule 12.05.2014
comment
я думаю, что понял, как использовать разворачивание цикла, но все еще не знаю, как улучшить код   -  person NULLexit    schedule 13.05.2014
comment
Это много NOP... – twalberg. Мне было интересно то же самое. Для них не должно быть кровати. AVR не так сильно конвейеризирован.   -  person turboscrew    schedule 13.05.2014
comment
Итак, почему все NOP? Иногда они используются для выравнивания. Но это слишком много, что вы там получили.   -  person Mysticial    schedule 13.05.2014


Ответы (2)


Развертывание цикла — это запись кода, если известно, что это короткий цикл. Это делается для того, чтобы избежать накладных расходов на зацикливание с особо сильно конвейеризированными процессорами, для которых ветвление занимает много времени (очистка и повторное заполнение конвейера).

В основном: вместо

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

вы делаете просто:

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

Я не думаю, что вы что-то получите, развернув свою петлю.

person turboscrew    schedule 12.05.2014
comment
Это чаще встречается в процессорных архитектурах с параллельными исполнительными модулями, таких как PowerPC или Itanium. PowerPC может выполнять несколько целочисленных инструкций за один такт, если инструкции расположены правильно. Улучшит ли это производительность, сильно зависит от того, что вы делаете. Мерить, мерить, мерить. - person jbruni; 13.05.2014
comment
Да, я забыл упомянуть об этом. Я бы сослался на ядро ​​TI C64X DSP. - person turboscrew; 13.05.2014

я прочитал немного больше о развертывании цикла, и я думаю, что понял. Что вы думаете о следующем коде?

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
person NULLexit    schedule 13.05.2014