Как процессор узнает, когда нужно задержать этап конвейера? - PullRequest
0 голосов
/ 23 сентября 2019

Как ЦП проверяет, занята ли стадия конвейера, чтобы он мог сдержать все предыдущие стадии?То есть, в примерном трехэтапном конвейере, если стадия 2 берет несколько тактовых циклов и останавливает конвейер, как CPU узнает, что не следует перемещать стадию 1 вперед?

1 Ответ

2 голосов
/ 23 сентября 2019

Прежде всего, x86-64 не имеет большого смысла в качестве тега для этого.Существуют настоящие процессоры ARM с трехступенчатым конвейером (например, Cortex-M), но ни один процессор x86-64 никогда не был таким коротким.Декодирование x86 слишком дорого для таких коротких конвейеров, а «налог x86» потребляет слишком много места / производительности для простых процессоров.


Должно быть совершенно очевидно, что любой данный этап может определять, когда ему нужно инициировать стойло.Например, этап доступа к памяти может обнаруживать пропущенную загрузку кеша или заполнение буфера хранилища (что требует остановки конвейера на простом ЦП без какого-либо параллелизма на уровне памяти, в отличие от настоящего современного x86, который может предположительно попадать под промах или промахнуться-Мисс).Я думаю, что вы спрашиваете только, как эта информация распространяется в обратном направлении.

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

Очевидная реализация - сигнальная линия от каждой стадии до предыдущей стадии.
Если стадия не готова принять новую работу, онаподнимает этот сигнал.На фронте тактового сигнала, который обычно распространяет данные от этапа к этапу, предыдущий этап вместо этого сохраняет свои данные, если этот сигнал установлен.

Если конвейер был заполнен, остановка на последнем этапе приведет крябь назад в трубопроводе.(Стадии конвейера, которые ранее были пустыми, могут остановить распространение: они могут принять новую работу в этом цикле, даже если следующая стадия не может взять от них какую-либо работу.) Это обратное распространение может начаться раньше, чем граница часов, например, как толькопоздняя стадия обнаруживает, что ей нужно будет остановить.

На практике защелки, которые буферизуют данные между ступенями, могут поглотить часть этой задержки пульсации и убрать ее с критического пути.Как, может быть, данные всегда могут быть буферизованы защелкой на границе между ступенями, но если этот сигнал был поднят, то защелка просто удерживает его до позднего времени?

IDK, как глубоко вы хотели бы войти в цифровую логику / вентильдизайн.Картина высокого уровня состоит в том, что каждый этап может сигнализировать предыдущему этапу, что он не готов принять новую работу в этом цикле.И этот сигнал должен каким-то образом распространяться в обратном направлении.


Сноска 1 : Не все трубопроводы способны останавливаться.например, полностью конвейеризованный модуль выполнения целочисленного умножения не нуждается в управлении потоком.Он всегда может принимать новый ввод каждый цикл, несмотря ни на что.

Но да, полный конвейер ЦП, как правило, должен иметь возможность останавливаться как минимум для памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...