Я пытаюсь понять концепцию конвейерной обработки и суперскалярных процессоров, используя пример, который мы привели в университете.
Рассмотрим ЦП с:
2 единицами нагрузки с задержкой 4 цикла
1 добавляемая единица - задержка 3 цикла
1 мульт унив c - задержка 5 циклов
Мы смотрим на конвейерное вычисление точечного произведения двух векторов x и y.
Часть выполнения выглядела бы так (не учитывая развертывание l oop для повышения эффективности ADD):
| UNIT | LOAD | LOAD | MULT | ADD |
|-------|------|------|------------------|------------|
| Cycle | | | | |
| 1 | x[0] | y[0] | | |
| 2 | x[1] | x[1] | | |
| 3 | x[2] | y[2] | | |
| 4 | x[3] | x[3] | | |
| 5 | ... | ... | temp0= x[0]*y[0] | |
| 6 | | | temp1= x[1]*y[1] | |
| 7 | | | temp2= x[2]*y[2] | |
| 8 | | | ... | |
| 9 | | | ... | |
| 10 | | | ... | res+=temp0 |
| 11 | | | | |
| 12 | | | | |
| 13 | | | | res+=temp1 |
Я не уверен, правильно ли я понимаю:
задержка 4 для единицы нагрузки означает, что этапам конвейера нужно 4 цикла, прежде чем другой исполнительный блок сможет использовать результат. Таким образом, умножение x [0] * y [0] не может начаться до 5-го цикла.
Фактическая загрузка / умножение занимает только 1 цикл на модуле LOAD / MULT. Эта операция происходит на одном из этапов и фактически блокирует исполнительный блок для этого цикла. Вот почему мы можем начать загрузку x [1] только через 1 цикл после загрузки x [0], даже если у нас пока нет результата для x [0], поскольку произойдет этап, соответствующий фактической загрузке x [1] 1 цикл после загрузки x [0].
Я действительно хотел бы знать, все ли это правильно.
Считаем ли мы это суперскалярным четырехсторонним алгоритмом, поскольку мы начинаем выполнять до 4 инструкции за цикл?