Недостаточное дублирование некоторых ресурсов
Одним из типичных примеров таких конфликтов служит конфликт из-за доступа к подсистеме памяти. Из табл. 30.1 видно, что в случае, когда операнды и команды находятся в одном запоминающем устройстве, начиная с такта 3, работу конвейера придется постоянно приостанавливать, поскольку различные команды в одном и том же такте обращаются к подсистеме памяти на считывание команды, выборку операнда, запись результата.
Борьба с конфликтами такого рода проводится путем увеличения количества однотипных функциональных устройств, которые могут одновременно выполнять одни и те же или схожие функции.
В подсистемах памяти ядер современных процессоров с этой целью разделяют кэш-память первого уровня на кэш-память для хранения команд и кэш-память для хранения данных, а также используют многопортовую схему доступа к регистровой памяти, при которой к регистрам можно одновременно обращаться по нескольким каналам для записи и считывания информации.
Конфликты из-за функциональных (исполнительных) устройств обычно сглаживаются введением в состав ядра процессора дополнительных блоков. Например, для обработки целочисленных данных имеется 4 АЛУ. При этом появляется возможность параллельной обработки информации в нескольких конвейерах.
Ядра процессоров, имеющие в своем составе более одного конвейера подготовки команд, принадлежащих одному программному потоку, называются суперскалярными.
Недостатком суперскалярных ядер процессоров является необходимость синхронного продвижения команд в каждом из конвейеров.
Для обеспечения правильной работы суперскалярного ядра процессора при возникновении затора в одном из конвейеров должны приостанавливать свою работу и другие конвейеры. В противном случае может нарушиться исходный порядок завершения команд программы. Но такие приостановки существенно снижают быстродействие процессора.
Разрешение этой ситуации состоит в том, чтобы дать возможность выполняться командам в одном конвейере вне зависимости от ситуации в других конвейерах, а аппаратные средства ядра процессора должны гарантировать, что результаты выполненных команд будут записаны в приемник в том порядке, в котором команды записаны в программе. Это обеспечивается путем использования, так называемого принципа неупорядоченного выполнения команд. Суть его заключается в следующем. Блок выборки и декодирования выбирает команды из подсистемы памяти и заносит их в буфер команд. По мере готовности операндов и исполнительного блока команды соответствующего типа извлекаются из буфера для обработки. Порядок их выполнения может отличаться от порядка, предписанного программой.
Результаты этапа выполнения команды сохраняются в специальном буфере восстановления последовательности команд. Запись результата очередной команды из этого буфера в приемник результата проводится лишь после того, как выполнены все предшествующие команды и записаны их результаты. Преимущества такого подхода очевидны: команды максимально используют возможности всех конвейеров, присутствующих в структуре ядра процессора, что обеспечивает его максимальную производительность.