В компьютерной архитектуре , A слот задержки представляет собой слот команд выполняются без эффектов предыдущей инструкции. Наиболее распространенной формой является одиночная произвольная инструкция, расположенная сразу после инструкции перехода в архитектуре RISC или DSP ; эта инструкция будет выполняться, даже если будет предпринята предыдущая ветвь. Таким образом, по замыслу инструкции выполняются в нелогичном или неправильном порядке. Ассемблеры обычно автоматически меняют порядок инструкций по умолчанию, скрывая неудобства от разработчиков сборки и компиляторов. [ необходима цитата ]
Когда задействована инструкция ветвления, местоположение следующей инструкции слота задержки в конвейере может называться слотом задержки ветвления . Слоты задержки переходов встречаются в основном в архитектурах DSP и более старых архитектурах RISC . MIPS , PA-RISC , ETRAX CRIS , SuperH и SPARC - это архитектуры RISC, каждая из которых имеет один слот задержки перехода; PowerPC , ARM , Alpha и RISC-V их не имеют. Архитектуры DSP , каждая из которых имеет один слот задержки ветвления, включают VS DSP, μPD77230 и TMS320C3x . SHARC DSP и MIPS-X использовать двойной слот задержки ветви; такой процессор выполнит пару инструкций, следующих за инструкцией перехода, прежде чем переход вступит в силу. TMS320C4x использует тройной слот задержки ветви.
В следующем примере показаны отложенные переходы на языке ассемблера для SHARC DSP, включая пару после инструкции RTS. Регистры с R0 по R9 очищаются до нуля по порядку номера (регистр, очищаемый после R6, становится R7, а не R9). Ни одна инструкция не выполняется более одного раза.
R0 = 0; ВЫЗОВ fn (DB); / * вызываем функцию под меткой "fn" * / R1 = 0; / * первый слот задержки * / R2 = 0; / * второй слот задержки * / / ***** здесь разрыв (ЗВОНОК вступает в силу) ***** / R6 = 0; / * CALL / RTS возвращается сюда, а не на "R1 = 0" * / Конец прыжка (DB); R7 = 0; / * первый слот задержки * / R8 = 0; / * второй слот задержки * / / ***** здесь разрыв (Прыжок вступает в силу) ***** / / * следующие 4 инструкции вызываются сверху, как функция "fn" * / fn: R3 = 0; РТС (БД); / * возврат к вызывающему, минуя интервалы задержки вызывающего * / R4 = 0; / * первый слот задержки * / R5 = 0; / * второй слот задержки * / / ***** здесь разрыв (RTS вступает в силу) ***** / конец: R9 = 0;
Целью конвейерной архитектуры является выполнение инструкции каждый такт. Чтобы поддерживать эту скорость, конвейер должен быть всегда заполнен инструкциями. Слот задержки перехода - это побочный эффект конвейерных архитектур из-за опасности перехода , то есть того факта, что переход не будет разрешен, пока инструкция не проработает свой путь через конвейер. Простая конструкция будет вставлять задержки в конвейер после инструкции ветвления до тех пор, пока новый целевой адрес ветвления не будет вычислен и загружен в счетчик программы.. Каждый цикл, в который вставляется стойло, считается одним слотом задержки перехода. Более сложный дизайн будет выполнять программные инструкции, которые не зависят от результата инструкции ветвления. Эта оптимизация может выполняться программно во время компиляции , перемещая инструкции в слоты задержки перехода в потоке инструкций в памяти, если оборудование поддерживает это. Другой побочный эффект заключается в том, что требуется особая обработка при управлении точками останова в инструкциях, а также при пошаговом выполнении отладки в слоте задержки перехода.
Идеальное количество слотов задержки перехода в конкретной реализации конвейера определяется количеством этапов конвейера, наличием пересылки регистров , на каком этапе конвейера вычисляются условия перехода, используется ли целевой буфер перехода (BTB). и многие другие факторы. Требования совместимости программного обеспечения диктуют, что архитектура не может изменять количество слотов задержки от одного поколения к другому. Это неизбежно требует, чтобы новые аппаратные реализации содержали дополнительное оборудование, чтобы гарантировать соблюдение архитектурного поведения, несмотря на то, что оно больше не актуально.
Слот задержки загрузки - это инструкция, которая выполняется сразу после загрузки (регистра из памяти), но не видит и не требует ожидания результата загрузки. Слоты задержки загрузки очень редки, потому что задержки загрузки очень непредсказуемы на современном оборудовании. Нагрузка может выполняться из ОЗУ или из кеша и может замедляться из-за нехватки ресурсов. Задержки загрузки наблюдались на очень ранних процессорах RISC. MIPS I ISA (реализованный в R2000 и R3000 микропроцессоров) страдает от этой проблемы.
Следующий пример - это ассемблерный код MIPS I, показывающий как слот задержки загрузки, так и слот задержки ветвления.
lw v0 , 4 ( v1 ) # загрузить слово из адреса v1 + 4 в v0 nop # впустую слот задержки загрузки jr v0 # перейти на адрес, указанный в v0 nop # потраченный впустую слот задержки перехода