Изменение порядка следования для устранения опасностей данных в сборке RISC-V.

#computer-science #riscv

#информатика #riscv

Вопрос:

Для следующей последовательности кода RISC-V я пытаюсь определить опасности для данных, которые не могут быть устранены путем пересылки данных. Возможно ли преодолеть опасности путем переупорядочения последовательности кода? Если да, может ли кто-нибудь показать новую последовательность?

Вот мой код:

 loop: slli  s2, s1, 2
      add   s3, s2, s0
      lw    t0, 0(s3)
      add   t1, t2, t0
      sw    t1, 20(s3)
      addi  s1, s1, 1
      beq   s1, s5, loop
  

Комментарии:

1. Пожалуйста, постарайтесь, чтобы ваш заголовок как можно лучше отличался от вашего конкретного вопроса — читатель должен иметь возможность получить довольно хорошее представление о том, могут ли ответы на чужой вопрос разрешить его собственный вопрос (так, чтобы им не нужно было задавать другой ответ самостоятельно), прочитав только заголовок. Следовательно, заголовок, который просто описывает общую тему вопроса, не особенно полезен — нет конца отдельным вопросам, которые можно было бы озаглавить «Архитектура систем», поэтому исходное название ничего не делало для определения конкретного вопроса.

Ответ №1:

Какие опасности для данных могут быть устранены путем пересылки, полностью зависит от конкретной реализации используемой архитектуры RISC-V. Я возьму на себя традиционный 5-ступенчатый конвейер RISC-V с пересылкой, представленный в учебниках Паттерсона и Хеннесси, и отвечу на ваш вопрос.

Этот конвейер имеет этапы выборки команд (IF), декодирования команд (ID), выполнения (EX), памяти (MEM) и обратной записи (WB). Этап выполнения вычисляет значения для операций регистр-регистр и регистр-немедленный и вычисляет адреса для операций памяти (lw / sw) и передачи управления (переход / переход), а этап памяти считывает данные для lw и записывает данные для sw. Данные могут быть перенаправлены с конца этапов выполнения, памяти или обратной записи в начало предыдущего этапа для последующей инструкции.

В включенном вами фрагменте кода будет 5 опасностей для данных:

(1) slli s2, s1, 2 и add s3, s2, s0 , для регистра s2

Здесь регистр s2 записывается slli и считывается add . Новое значение вычисляется к концу этапа EX первой инструкции и требуется к началу этапа EX следующей инструкции, поэтому его можно разрешить с помощью пересылки.

(2) add s3, s2, s0 и lw t0, 0(s3) для регистра s3

Здесь регистр s3 записывается add и считывается lw . Новое значение вычисляется к концу этапа EX первой инструкции и требуется к началу этапа EX следующей инструкции, поэтому его можно разрешить с помощью пересылки.

(3) lw t0, 0(s3) и add t1, t2, t0 для регистра t0

Здесь регистр t0 записывается lw и считывается add . Новое значение вычисляется к концу этапа MEM первой инструкции и требуется к началу этапа EX следующей инструкции, поэтому его нельзя разрешить с помощью пересылки.

(4) add t1, t2, t0 и sw t1, 20(s3) для регистра t1

Здесь регистр t1 записывается add и считывается sw . Новое значение вычисляется к концу этапа EX первой инструкции и требуется к началу этапа MEM следующей инструкции, поэтому его можно разрешить с помощью пересылки.

(5) addi s1, s1, 1 и beq s1, s5, loop для регистра s1

Здесь регистр s1 записывается addi и считывается beq . Новое значение вычисляется к концу этапа EX первой инструкции. Обычно для конвейеров RISC-V без каких-либо оптимизаций для управления опасностями, для инструкций перехода регистры сравниваются во время EX параллельно с вычислением program counter offset для получения назначения перехода. Опасность управления здесь является отдельной проблемой, но опасность данных решаема путем пересылки.

Таким образом, из 5 опасностей только одна не устраняется путем пересылки данных. Может ли это быть устранено путем переупорядочения инструкций? ДА. Взгляните на addi s1, s1, 1 . Перед addi , s1 не считывается и не записывается ни одной инструкцией после первой slli . Если мы переместим эту инструкцию, то результирующий код будет выглядеть следующим образом:

 loop: slli  s2, s1, 2
      add   s3, s2, s0
      lw    t0, 0(s3)
      addi  s1, s1, 1
      add   t1, t2, t0
      sw    t1, 20(s3)
      beq   s1, s5, loop
  

Таким образом, lw команда, которая извлекает данные для записи, t0 завершит этап MEM к тому времени, когда новое значение t0 потребуется add t1, t2, t0 инструкции.

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