Трубопроводы дот-продукта - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь понять концепцию конвейерной обработки и суперскалярных процессоров, используя пример, который мы привели в университете.

Рассмотрим ЦП с:
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 инструкции за цикл?

...