Как работает пересылка данных для данных угроз, в конвейерных диаграммах - PullRequest
0 голосов
/ 04 февраля 2020

У меня возникли некоторые трудности с пониманием опасностей трубопровода, особенно опасностей данных и того, как мы можем использовать циклы задержки и пересылку данных для устранения этих опасностей. Вот пример кода сборки MIPS с данными и опасностями использования нагрузки (указано):

B0: sll $t2, $a0, 2                        
B1: add $t1, $a0, $a1
B2: lw $t0, 4($t1)                           #data hazard $t1
B3: slt $v0, $t1, $a1                        #data hazard $t1
B4: sub $v1, $v0, $t3                        #data hazard $v0
B5: addi $t0, $t0, 4
B6: lw $t1,8($t0)                            #data hazard $t0
B7: sll $t1, $a1, 1
B8: add $t2, $t1, $v0                        #data hazard $t1
B9: lw $v0, 0($t2)                           #data hazard $t2
B10: lw $t3, 0($v0)                          #load-use hazard $v0
B11: and $v0, $t3, $a2                       #data hazard $t3
B12: sll $a1, $t3, 1                         #data hazard $t3

Для этого кода мы получили конвейерную «диаграмму», где мы должны заполнить циклы остановки и данные вперед. Поскольку диаграмма имеет 20 циклов, я покажу только первые 5 циклов и данные вперед в этих 5 циклах. Конвейерный цикл - первые 5 циклов с пересылкой данных.

На диаграмме видно, что с BO мы переходим с EX до EX в B1, но почему ? Поскольку нам не нужен ни один из двух регистров из B0 в B1 или B2, нет опасности для данных относительно $t2 или $a0, поэтому нет необходимости в пересылке данных.

Кроме того, как мне узнать, нужно ли мне переадресовать с EX или MEM, потому что иногда я не уверен, нужно ли мне go с EX до EX, EX до MEM, MEM до EX или MEM до EX. Я хотел бы получить разъяснения по этому вопросу.

1 Ответ

0 голосов
/ 05 февраля 2020

Природа этих опасностей конвейерной работы заключается в том, будет ли конвейер в противном случае пытаться работать с устаревшими значениями или нет. Конвейерная передача распределяет выполнение одной инструкции по этапам (каждый этап происходит в последующем цикле), что позволяет каждому этапу иметь более короткое время цикла. Чтобы не снижать производительность, конвейерные процессоры перекрывают выполнение последовательных инструкций. Именно это совпадение ускоряет производительность и создает потенциальные опасности.


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

Аналогично, в конвейерном процессоре файл регистров используется для операндов для выполняемой инструкции: это происходит специально на этапе ID.

Однако для любых двух последовательных инструкций этап WB 1-й инструкции произойдет после этапа ID 2-й инструкции - и это является источником опасности.

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

Для получения правильной, большей -создание значений, как правило, без остановки процессора (как было бы необходимо, если бы мы ожидали завершения этапа WB 1-й инструкции перед выполнением этапа ID 2-й инструкции - это было бы задержкой в ​​два цикла).

Дело в том, что у нас есть три варианта:

  • для go перекрывающегося выполнения - что не является опцией для производительности
  • задержка при наличии зависимости - также не очень хорош для производительности
  • использование прямого или байпасного режима

прямой / байпас работает с наблюдением, что самое раннее время, когда нужное значение доступно, находится в конце EX стадия (для опасностей ALU), и что самое последнее время, которое мы могли бы предоставить наиболее актуальную ценность, находится в начале стадии EX. Таким образом, если мы можем получить значения до go с выхода ALU на вход ALU между циклами, мы сможем избежать опасности, не вводя срывов.

Вперед (или обход) имеет два механизма:

  • Решите, когда необходимо задействовать
  • Как задействовать

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

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

Когда такая зависимость найдена устаревшие значения, которые были считаны на этапе идентификации, должны быть заменены правильными значениями - в случае опасности ALU, затем выход из ALU (выход). Таким образом, механизм обхода, когда он включается, игнорирует этап ID, предоставленный значения операнда, и переопределяет одно (или другое, или оба) выходным значением ALU.

...