Пусть в программе встретилась некоторая последовательность команд :
A = B*6
C = E*12
A = A*D
C = C+1
где переменные А и С хранятся в оперативной памяти, В, D и Е – на регистрах процессора
Рассмотрим последовательность действий процессора при выполнении данной последова-
тельности команд.
1)Вычисляем значение В*6 и записываем его в регистр(3 такта)
2)Записываем значение из регистра в оперативную память(10 тактов)
3)Вычисляем значение Е*12 и записываем его в регистр(3 такта)
4)Записываем значение из регистра в оперативную память(10 тактов)
5)Загружаем переменную А из оперативной памяти в регистр(10 тактов)
6)Вычисляем значение А*D и записываем его в регистр(3 такта)
7)Записываем значение из регистра в оперативную память(10 тактов)
8)Загружаем переменную С из оперативной памяти в регистр(10 тактов)
9)Инкрементируем регистр(1 такт)
10)Записываем значение из регистра в оперативную память(10 тактов)
Всего 70 тактов
Теперь изменим порядок следования данных команд:
A = B*6
A = A*D
C = E*12
С = С + 1
Последовательность действий процессора при выполнении данной последовательности
команд:
1)Вычисляем значение В*6 и записываем его в регистр(3 такта)
2)Вычисляем значение А*D и записываем его в регистр(3 такта)
3)Записываем значение из регистра в оперативную память(10 тактов)
4)Вычисляем значение Е*12 и записываем его в регистр(3 такта)
5)Инкрементируем регистр(1 такт)
6)Записываем значение из регистра в оперативную память(10 тактов)
Всего 30 тактов
Как видно из вышеприведенного примера, более чем двукратное увеличение производи-
тельности появилось при простой перестановке команд местами. Данный пример носит
иллюстративный характер (такую оптимизацию должен производить компилятор), на са-
мом деле изменение порядка следования команд используется для более полной загрузки
конвейерных устройств.
Размер блока, внутри которого может быть произведена перестановка команд, для Pentium
4 равен 126, при этом процессор не останавливается, а производит перестановку “на лету”