Скачиваний:
58
Добавлен:
16.04.2013
Размер:
260.1 Кб
Скачать

5.5.9. Устранение избыточной загрузки в циклах

Иногда, развертывание цикла необходимо для удаления операций копирования, созданных оптимизацией цикла. Далее дается пример устранения избыточной загрузки. В коде ниже, каждая итерация загружает два значения, одно из которых уже было загружено предыдущей исходной итерацией:

add r8 = r5,4;;

L1: ld4 r4 = [r5],4 // a[i]

ld4 r9 = [r8],4 ;; // a[i+1]

add r7 = r4,r9 ;;

st4 [r6] = r7,4

br.cloop L1 ;;

Избыточная загрузка может быть устранена путем добавления перед циклом копии первой загрузки и замены загрузки на копирование (mov):

add r8 = r5,4

ld4 r9 = [r5],4;; // a[i]

L1: mov r4 = r9 // a[i] = предыдущее a[i+1]

ld4 r9 = [r8],4;; // a[i+1]

add r7 = r4,r9 ;;

st4 [r6] = r7,4

br.cloop L1 ;;

В традиционных архитектурах, инструкция movможет быть удалена только развертыванием цикла вдвое. Одна инструкция удаляется из цикла, за счет расширения кода в два раза. ВItaniumархитектуре, свойство ротации регистров может использоваться для устранения инструкцииmovбез развертывания цикла:

add r8 = r5,4

ld4 r33 = [r5],4;; // a[i]

L1: ld4 r32 = [r8],4;; // a[i+1]

add r7 = r33,r32;;

st4 [r6] = r7,4

br.ctop L1 ;;

5.6. Итоги

Примеры в этой главе показывают, как можно использовать свойства архитектуры Itaniumдля оптимизации циклов без расширения кода, требуемого традиционными архитектурами. Ротация регистров, предикация и переходы программной конвейерной обработки циклов – все содействует этой способности. Спекуляция по управлению увеличивает перекрытие итерацийwhile-циклов. Спекуляция по данным увеличивает перекрытие итераций циклов, имеющих загрузки и сохранения, которые не могут не быть двусмысленными.