Пузырёк
Пузырек в третьем такте обработки задерживает исполнение
Когда в выполнении по каким-либо причинам случается небольшой сбой или задержка, в конвейере получается «пузырёк», в котором не происходит ничего полезного. Во втором такте обработка фиолетовой инструкции задерживается и вместо стадии расшифровки в третьем такте теперь находится пузырёк. Всё, что находится «за» фиолетовой инструкцией, испытывает задержку в один такт, тогда как всё, что находится «перед» фиолетовой инструкцией продолжает исполняться.
Очевидно, что наличие пузырька в конвейере даёт суммарное время исполнения в 8 тактов вместо 7 на схеме исполнения, показанной выше.
Пузырьки — это как заглушки, в которых не происходит ничего полезного при их прочтении, раскодировании, исполнении и записи результата. Они могут быть выражены при помощи инструкции NOP[1][2][3] ассемблера.
Пример 1
Допустим, типичная инструкция для сложения двух чисел это СЛОЖИТЬ A, B, C. Эта
инструкция суммирует значения, находящиеся в ячейках памяти A и B, а затем кладет результат в ячейку памяти C. В конвейерном процессоре контроллер может разбить эту операцию на последовательные задачи вида
ЗАГРУЗИТЬ A, R1
ЗАГРУЗИТЬ B, R2 СЛОЖИТЬ R1, R2, R3 ЗАПИСАТЬ R3, C
загрузить следующую инструкцию
Ячейки R1, R2 и R3 являются регистрами процессора. Значения, которые хранятся в ячейках памяти, которые мы называем A и B, загружаются (то есть копируются) в эти регистры, затем суммируются, и результат записывается в ячейку памяти C.
Вданном примере конвейер состоит из трех уровней — загрузки, исполнения и записи. Эти шаги называются, очевидно, уровнями или шагами конвейера.
Вбесконвейерном процессоре, только один шаг может работать в один момент времени, поэтому инструкция должна полностью закончиться прежде, чем следующая инструкция в принципе начнется. В конвейерном процессоре, все эти шаги могут выполняться одновременно на разных инструкциях. Поэтому когда первая инструкция находится на шаге исполнения, вторая инструкция будет на стадии раскодирования, а третья инструкция будет на стадии прочтения.
Конвейер не уменьшает время, которое необходимо для того, чтобы выполнить инструкцию, но зато он увеличивает объём (число) инструкций, которые могут быть выполнены одновременно и таким образом уменьшает задержку между выполненными инструкциями — увеличивая т. н.
пропускную способность. Чем больше уровней имеет конвейер, тем больше инструкций могут выполняться одновременно и тем меньше задержка между завершенными инструкциями. Каждый микропроцессор, произведенный в наши дни, использует как минимум двухуровневый конвейер.
Пример 2
Теоретический трёхуровневый конвейер:
Шаг |
Англ. название |
Описание |
Выборка |
Fetch |
Прочитать инструкцию из памяти |
Исполнение |
Execute |
Исполнить инструкцию |
Запись |
Write-back |
Записать результат в память и/или регистры |
Псевдоассемблерный листинг, который нужно выполнить:
ЗАГРУЗИТЬ |
40, |
A |
; загрузить число |
40 в A |
||
КОПИРОВАТЬ |
A, |
B |
; скопировать A в |
B |
||
СЛОЖИТЬ |
20, |
B |
; |
добавить |
20 к B |
|
ЗАПИСАТЬ |
B, |
0x0300 |
; |
записать |
B в ячейку памяти 0x0300 |
Как это будет исполняться:
Такт |
Выборка |
Исполнение |
Запись |
Такт 1 ЗАГРУЗИТЬ
Такт 2 КОПИРОВАТЬ ЗАГРУЗИТЬ
Такт 3 СЛОЖИТЬ |
КОПИРОВАТЬ ЗАГРУЗИТЬ |
Пояснение
Инструкция ЗАГРУЗИТЬ читается из памяти.
Инструкция ЗАГРУЗИТЬ выполняется, инструкция КОПИРОВАТЬ читается из памяти.
Инструкция ЗАГРУЗИТЬ находится на шаге записи результата, где её результат (то есть число 40) записывается в регистр А. В это же время, инструкция КОПИРОВАТЬ исполняется. Так как она должна скопировать содержимое регистра A в регистр B, она должна дождаться окончания инструкции ЗАГРУЗИТЬ.