Как промыть трубопровод?
Это теоретический вопрос, и я чувствую себя застрявшим. Предположим, я беру ARM ISA и конвейерный канал данных. Я использую предиктор ветвления, который для простоты всегда предсказывает, что ветвление берется. Как видно, это работает, если ветка действительно должна была быть взята, но не дает результата в противном случае. Если это не удается, он должен откатиться и отменить все изменения, т.е. очистить конвейер.
Как это сделать?
Что если какое-то значение записывается в какой-либо регистр?
Тогда как я могу привести этот регистр к его предыдущему значению? То же самое касается флагов?
1 ответ
Поскольку это определено в архитектуре, у вас всегда будет гарантия, что, если ветвь неверно предсказана и ей необходимо очистить конвейер, все последующие инструкции не могут оказать видимого влияния на архитектуру.
Есть несколько способов сделать это: в простой реализации (короткие конвейеры) инструкции, как правило, будут фиксироваться (т.е. записывать архитектурно-видимую модификацию), когда гарантируется, что они больше не находятся в тени ветви (нагрузки, которая может вызвать сбой).
В более сложных процессорах, более длинных конвейерах и ядрах, вышедших из строя, обычно используется метод переименования регистров:
https://en.wikipedia.org/wiki/Register_renaming
В этом случае инструкции смогут выполнить, записать результат во временный регистр или местоположение, а ЦП будет иметь механизмы либо для восстановления состояния (в случае сброса), либо только для фиксации временных результатов в архитектурных регистрах, когда он имеет гарантию, что эти результаты не могут быть сброшены больше.