Как процессоры VLIW работают с операциями с переменным временем? - PullRequest
1 голос
/ 30 января 2020

Концепция архитектуры процессора с очень длинным командным словом достаточно проста; как указано в https://en.wikipedia.org/wiki/Very_long_instruction_word

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

Понятно, как это работает, если каждая операция занимает один цикл, что операции ALU могут очень хорошо do.

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

Но загрузка может занять от нескольких циклов до нескольких сотен, в зависимости от того, попадет ли она в кэш или должна go всю дорогу до основной памяти , Так что же тогда происходит? Добавление и умножение будет выполнено, но загрузка все еще продолжается. Если центральный процессор переходит ко второй, третьей и т. Д. Инструкциям c, он должен отслеживать постоянно увеличивающееся отставание ожидающих нагрузок, сводя на нет точку продажи VLIW, заключающуюся в отсутствии необходимости тратить какие-либо аппаратные ресурсы на бухгалтерию. Если он ожидает, пока все операции в текущей инструкции не будут выполнены, модули сложения и умножения будут бездействовать, когда они могли бы продолжить полезную работу (и имели бы это в неработающем процессоре).

Как с этим справляются в реальных процессорах VLIW?

Для более конкретного примера предположим, что мы хотим выполнить следующие операции:

r1 += r2, r10 = [r11]
r1 += r3
r1 += r4
r1 += r5

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

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