Конфликты в конвейере команд

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

1) попыткой нескольких команд одновременно обратиться к одному и тому же ресурсу (структурный риск);

2) взаимосвязью команд по данным (риск по данным);

3) неоднозначностью при выборке следующей команды в случае команд перехода (риск по управлению).

Структурный риск возникает тогда, когда несколько команд, находящихся на разных ступенях конвейера, пытаются одновременно использовать один и тот же ресурс, например, память. В рассмотренном примере сразу три этапа ВК, ВО, ЗР связаны с обращением к памяти, которые могут выполняться одновременно. Для устранения таких коллизий используется модульный принцип построения памяти. В этом случае оперативная память состоит из нескольких независимых модулей, обращение к которым может происходить одновременно. Для уменьшения структурного риска используется также и разделенная кэш- память, т.е. когда используются два КЭШа: кэш команд и кэш данных. В этом случае одновременно можно производить чтение команд и данных, которые находятся в разных КЭШах. В некоторых случаях конфликты из-за одновременного обращения к памяти могут и не возникать, поскольку некоторые команды не требуют этапов выборки операндов и записи результатов. В целом, влияние структурного риска на производительность конвейера по сравнению с другими видами риска невелико.

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

Пусть две команды на конвейере i-ая и j-ая предусматривают обращение к одной и той же переменной x, а команда i предшествует команде j. Тогда между этими командами возможны три типа конфликта по данным.

а) Чтение после записи (ЧПЗ). Для правильного выполнения программы команд j-ая должно прочитать переменную x после ее изменения предшествующей командой i. Если же команда j читает x до того, как команда i успела записать новое значение x, т.е. команда j ошибочно читает старое значение x вместо нового, то возникает конфликт, нарушающий правило: “Чтение после записи”.

Это наиболее частый тип конфликта по данным, поскольку операция чтения (этап ВО) предшествует операции записи (этап ЗР).

в) Запись после чтения (ЗПЧ). Конфликт такого типа возникает в том случае, если команда j записывает новое значение x раньше, чем предшествующая команда i успела прочитать старое значение x, т.е. команда i ошибочно получает новое значение переменной x вместо ее старого значения. Таким образом, возникает конфликт, нарушающий правило “Запись после чтения”.

Если команды на конвейере следуют в порядке, определенном программой, то конфликты такого типа не возможны, поскольку запись результата всегда идет после чтения операнда. Однако конфликты такого типа возникают в случае, если команды на конвейере выполняются не в том порядке, как это определено программой. Например, выполнение команды i приостановлено из-за какого-то конфликта, и в результате команда j будет выполнена раньше, чем команда i. Тогда и возможен конфликт типа ЗПЧ.

с) Запись после записи (ЗПЗ). Конфликт такого типа возникает в том случае, если команда j записывает новое значение переменной x прежде, чем команда i успела записать свое значение x. Тогда в памяти ЭВМ будет ошибочно содержаться старое значение переменной x вместо нового, поскольку команда i на место нового значения x записало старое значение.

Конфликты типа ЗПЗ в случае выполнения команд в порядке, определенном программой, не возможны, поскольку запись результата всегда производится на последнем этапе, а не раньше. В случае нарушения естественного порядка выполнения команд конфликты такого типа возможны, если одна команда догоняет другую из-за ее приостановки.