Лекция
Привет, Вы узнаете о том , что такое конфликты в конвейере, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое конфликты в конвейере, pipeline hazards , настоятельно рекомендую прочитать все из категории Теория цифровых автоматов.
В области проектирования центральных процессоров (ЦП) опасности представляют собой проблемы с конвейером инструкций в микроархитектурах ЦП, когда следующая инструкция не может быть выполнена в следующем тактовом цикле и потенциально может привести к некорректным результатам вычислений. Три распространенных типа опасностей — это опасности данных, структурные опасности и опасности управления (опасности ветвления) .
Для борьбы с опасностями используется несколько методов, включая задержки /всплытие в конвейере, пересылку операндов , а в случае неочередного выполнения — метод скоринговых таблиц и алгоритм Томасуло .
В конвейерном процессоре инструкции выполняются в несколько этапов, так что в любой момент времени несколько инструкций обрабатываются на различных этапах конвейера, таких как выборка и выполнение. Существует множество различных микроархитектур конвейера инструкций , и инструкции могут выполняться вне порядка . Конфликт возникает, когда две или более таких одновременных (возможно, выполняемых вне порядка) инструкций конфликтуют.
Различают три класса таких конфликтов:
Структурная опасность возникает, когда двум (или более) инструкциям, уже находящимся в конвейере, требуется один и тот же ресурс. В результате инструкции должны выполняться последовательно, а не параллельно на определенном участке конвейера. Структурные опасности иногда называют опасностями, связанными с ресурсами.
Пример: Ситуация, когда несколько инструкций готовы к выполнению, но имеется только одно АЛУ (арифметико-логическое устройство). Одним из решений этой проблемы нехватки ресурсов является увеличение доступных ресурсов за счет наличия нескольких портов в основную память и нескольких АЛУ.
Конфликт управления возникает, когда логика управления неверно предсказывает, какой переход будет выполнен в рамках программы, и, следовательно, в конвейер поступает последовательность инструкций, которые впоследствии отбрасываются. Термин «конфликт ветвлений» также относится к конфликту управления.
Структурные конфликты ( англ. structural hazards ) в конвейере возникают чаще всего там, где функциональные устройства, отвечающие непосредственно за вычисления, конвейеризированы не полностью, или количество их недостаточно для выполнения произвольной комбинации загруженных в конвейер машинных команд .

На рисунке изображена ситуация, которая влечет за собой структурный конфликт. Здесь предполагается, что процессор имеет только одно устройство для осуществления операции умножения, выполняющее эту операцию за два машинных цикла и, соответственно, не допускает дальнейшего измельчения на отдельные стадии. Стадия же конвейера имеет длительность одного машинного цикла.
В конвейер последовательно загружены две команды умножения, не имеющие конфликтов данных, но совмещение выполнения этих команд на стадии непосредственного умножения невозможно, ведь не может быть обеспечено разделение между ними устройства умножения. Об этом говорит сайт https://intellect.icu . Поэтому для второй из команд конвейер останавливается на машинном цикле.
Чтобы избежать такой остановки, в состав процессора может быть введено дополнительное устройство умножения, или конвейеризировано имеющееся или ускоренное его быстродействие (доведено до продолжительности одного цикла конвейера).
Задержка в конвейере , также называемая разрывом конвейера или остановкой конвейера , — это метод предотвращения конфликтов данных, структурных конфликтов и конфликтов ветвлений. По мере выборки инструкций управляющая логика определяет, может ли/произойдет ли конфликт. Если это так, то управляющая логика не вставляет в конвейер операции ( NOP ). Таким образом, до выполнения следующей инструкции (которая вызовет конфликт), предыдущая будет иметь достаточно времени для завершения и предотвращения конфликта. Если количество операций NOP равно количеству этапов в конвейере, процессор очищен от всех инструкций и может продолжать работу без конфликтов. Все формы задержки вводят задержку перед возобновлением выполнения процессором.
Очистка конвейера происходит, когда инструкция перехода переходит к новой ячейке памяти, аннулируя все предыдущие этапы конвейера. Эти предыдущие этапы очищаются, позволяя конвейеру продолжить работу с новой инструкции, указанной в инструкции перехода.
Конфликты данных ( англ. data hazards ) — конфликты , возникающие в случаях, когда существуют зависимости между данными в разных командах, находящихся в конвейере .
Есть три варианта зависимости:
Пример
i1. R2<- R1 + R3
i2. R4<- R2 + R3
Способы решения
Для решения проблем, связанных с угрозами безопасности данных, используется несколько основных решений и алгоритмов:
В случае выполнения операций вне установленного порядка может использоваться следующий алгоритм:
Задача устранения зависимостей данных может быть делегирована компилятору, который может заполнить соответствующее количество инструкций NOP между зависимыми инструкциями для обеспечения корректной работы или изменить порядок инструкций, где это возможно.
Например, чтобы записать значение 3 в регистр 1 (который уже содержит 6), а затем добавить 7 к регистру 1 и сохранить результат в регистре 2, то есть:
i0: R1 = 6 i1: R1 = 3 i2: R2 = R1 + 7 = 10
После выполнения регистр 2 должен содержать значение 10. Однако, если i1 (запись 3 в регистр 1) не полностью выходит из конвейера до начала выполнения i2, это означает, что R1 не содержит значение 3, когда i2 выполняет сложение. В таком случае i2 добавляет 7 к старому значению регистра 1 ( 6 ), и поэтому регистр 2 содержит 13 вместо этого, т.е.:
i0: R1 = 6 i2: R2 = R1 + 7 = 13 i1: R1 = 3
Эта ошибка возникает потому, что i2 считывает регистр 1 до того, как i1 зафиксирует/сохранит результат операции записи в регистр 1. Поэтому, когда i2 считывает содержимое регистра 1, регистр 1 по-прежнему содержит 6 , а не 3 .
Пересылка (описанная ниже) помогает исправлять такие ошибки, опираясь на тот факт, что выход i1 (который равен 3 ) может быть использован последующими инструкциями до того, как значение 3 будет зафиксировано/сохранено в регистре 1.
Применение пересылки в данном примере означает, что нет ожидания для фиксации/сохранения выходного значения i1 в регистре 1 (в этом примере выходное значение равно 3 ) перед тем, как это значение станет доступно последующей инструкции (в данном случае, i2). В результате i2 использует правильное (более актуальное) значение регистра 1: фиксация/сохранение происходит немедленно, без конвейерной обработки.
При включенной пересылке данных этап декодирования/выполнения инструкций (ID/EX) конвейера теперь имеет два входа: значение, считанное из указанного регистра (в этом примере — значение 6 из регистра 1), и новое значение регистра 1 (в этом примере — значение 3 ), которое передается со следующего этапа выполнения инструкций/доступа к памяти (EX/MEM). Для определения того, какой вход использовать, используется дополнительная управляющая логика.
Для предотвращения угроз управлению микроархитектуры могут:
В случае, если переход вызывает «пузырь» в конвейере после того, как в конвейер поступили некорректные инструкции, необходимо принять меры, чтобы предотвратить любое влияние неправильно загруженных инструкций на состояние процессора, за исключением потерь энергии, затраченных на их обработку до того, как было обнаружено, что они были загружены неправильно.
Конфликты управления ( англ. control hazards ) — разновидность конфликтов в конвейере , вызванных особенностями конвейерного выполнения команд перехода.
Пусть i и j — две машинные команды , и j в программе следующая за i . Говорят , что j зависит от перехода от i , когда решение о необходимости выполнения или невыполнение j принимается исходя из результата, полученного во время выполнения i . То есть, j зависит от i по переходу, если i – команда перехода.
Проблематичность конвейерного выполнения таких фрагментов программного кода состоит в том, что заранее неизвестно, выполнение какой команды начнется в результате перехода (т.е. произойдет он или нет). В случае последовательного (неконвейеризированного) исполнения решение о переходе получается до того, как следующая команда будет загружена в исполнительное устройство. Но в конвейерной модели этапы выполнения разных команд совмещаются во времени, то есть этап непосредственного вычисления результата одной команды совмещается с загрузкой следующей и т. д., и невозможно узнать в процессе этой загрузки, нужно ли оно вообще, ведь результат команды перехода еще не вычислен.

Эта ситуация изображена на рисунке. Для такого конвейера выполнение перехода означает остановку конвейера на три такта, чтобы выгрузить ненужные теперь команды и загрузить необходимые из другой ветки программы. Очевидно, что чем больше стадий в конвейере, и чем дальше от начала стадия вычисления адреса перехода, тем значительнее будут потери быстродействия.
Задержка доступа к памяти — еще один фактор, на который должны обратить внимание разработчики, поскольку задержка может снизить производительность. Разные типы памяти имеют разное время доступа к памяти. Таким образом, выбрав подходящий тип памяти, разработчики могут улучшить производительность конвейерного пути передачи данных.
Исследование, описанное в статье про конфликты в конвейере, подчеркивает ее значимость в современном мире. Надеюсь, что теперь ты понял что такое конфликты в конвейере, pipeline hazards и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Теория цифровых автоматов
Комментарии