Зарегистрировать переименование
![]() | В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
В компьютерной архитектуре переименование регистров — это метод, который отделяет логические регистры от физических. С каждым логическим регистром связан набор физических регистров. Когда инструкция машинного языка обращается к определенному логическому регистру, процессор на лету транспонирует это имя в один конкретный физический регистр. Физические регистры непрозрачны, и к ним нельзя обращаться напрямую, а только через канонические имена.
Этот метод используется для устранения ложных зависимостей данных , возникающих в результате повторного использования регистров последовательными инструкциями , между которыми нет никаких реальных зависимостей данных. Устранение этих ложных зависимостей данных демонстрирует больший параллелизм на уровне команд в потоке команд, который можно использовать с помощью различных дополнительных методов, таких как суперскалярное выполнение и выполнение вне очереди, для повышения производительности .
Проблемный подход [ править ]
Программы состоят из инструкций, которые оперируют значениями. Инструкции должны называть эти значения, чтобы отличать их друг от друга. Типичная инструкция может гласить: добавить и и вставьте результат . В этой инструкции , и — это названия мест хранения.
Обычно значения, которыми манипулируют, используются несколько раз подряд. Регистровые машины используют это преимущество, вводя ряд регистров процессора , которые представляют собой высокоскоростные ячейки памяти, в которых хранятся эти значения. Инструкции, использующие регистры в качестве промежуточных значений, будут выполняться намного быстрее, чем те, которые обращаются к основной памяти . Такое увеличение производительности является ключевым элементом конструкции процессора RISC , который использует регистры для всех своих основных математических и логических инструкций. Набор регистров в конкретном проекте известен как его файл регистров .
Отдельные регистры в файле обозначаются номером в машинном коде . Для кодирования числа в машинном коде требуется несколько битов. Например, в Zilog Z80 в файле было восемь регистров общего назначения. Для выбора одного из восьми значений требуется три бита, так как 2 3 = 8. Большее количество регистров в файле приведет к повышению производительности, поскольку в файле можно хранить больше временных значений и, таким образом, избежать дорогостоящих операций сохранения или загрузки из памяти. Как правило, более современные процессоры и процессоры с большими командными словами по возможности используют больше регистров. Например, архитектура набора команд IA-32 имеет 8 регистров общего назначения, x86-64 — 16, многие RISC — 32, а IA-64 — 128.
Преимущества файла регистров большего размера нивелируются необходимостью использовать больше битов для кодирования номера регистра. Например, в системе, использующей 32-битные инструкции, вам может понадобиться три регистра, чтобы можно было выполнять операции типа = . Если файл регистров содержит 32 записи, каждая из ссылок потребует 5 бит, и таким образом набор из трех регистров занимает 15 бит, оставляя 17 для кодирования операции и другой информации. Расширение файла регистров до 64 записей потребует 6 бит, всего 18 бит. Хотя это может привести к увеличению производительности, это также означает, что для кодирования инструкции останется меньше битов. Это приводит к попыткам сбалансировать размер файла с количеством возможных инструкций.
Вышел из строя [ править ]
Ранние компьютеры часто работали синхронно со своей основной памятью, что уменьшало преимущества больших файлов регистров. Распространенной особенностью рынка миникомпьютеров 1960-х годов было то, что регистры должны быть физически реализованы в основной памяти, и в этом случае преимущество в производительности заключалось просто в том, что инструкция могла напрямую ссылаться на местоположение, а не использовать второй или два байта. чтобы указать полный адрес памяти. Это сделало инструкции меньше и, следовательно, быстрее читаемыми. Подобный дизайн, который максимизировал производительность за счет тщательной настройки набора команд до минимального размера, был распространен до 1980-х годов. Примером такого подхода является MOS 6502 , который имел только один регистр, и в этом случае он назывался аккумулятором , и специальный режим адресации «нулевой страницы», который обрабатывал первые 256 байтов памяти, как если бы они были регистрами. . Размещение кода и данных на нулевой странице означало, что инструкция имела длину всего два байта вместо трех, что значительно повышало производительность за счет предотвращения операций чтения.
Широкое внедрение динамической оперативной памяти в 1970-х годах изменило этот подход. Со временем производительность центральных процессоров (ЦП) возросла относительно памяти, к которой они были подключены, и использовать основную память в качестве регистров стало неразумно. Это привело к увеличению размера файлов регистров, внутренних для ЦП, чтобы избежать обращения к памяти, где это возможно. Однако на практике полностью избежать доступа к памяти невозможно, и по мере того, как разница в скорости росла, каждый такой доступ становился все более и более дорогим с точки зрения количества инструкций, которые могли бы быть выполнены, если бы значение находилось в регистре.
Разные инструкции могут занять разное количество времени; например, процессор может быть способен выполнять сотни инструкций между регистрами, пока выполняется одна загрузка из основной памяти. Ключевым достижением в повышении производительности является возможность выполнения этих быстрых инструкций, пока другие ожидают данных. Это означает, что инструкции больше не выполняются в том порядке, в котором они указаны в машинном коде, а выполняются вне порядка .
Рассмотрим этот фрагмент кода, работающий на вышедшем из строя процессоре:
r1 ≔ m[1024] ;read the value in memory location 1024
r1 ≔ r1 + 2 ;add two to the value
m[1032] ≔ r1 ;save the result to location 1032
r1 ≔ m[2048] ;read value in 2048
r1 ≔ r1 + 4 ;add 4
m[2056] ≔ r1 ;save it to 2056
Инструкции в последних трех строках не зависят от первых трех инструкций, но процессор не может завершить выполнение. r1 ≔ m[2048]
до предыдущего m[1032] ≔ r1
завершено, так как это добавит четыре к значению 1032, а не 2048.
Если доступен другой регистр, это ограничение можно устранить, выбрав разные регистры для первых трех и вторых трех инструкций:
r1 ≔ m[1024]
r1 ≔ r1 + 2
m[1032] ≔ r1
r2 ≔ m[2048]
r2 ≔ r2 + 4
m[2056] ≔ r2
Теперь последние три инструкции могут выполняться параллельно с первыми тремя. Программа будет работать быстрее, чем раньше, за счет устранения зависимости данных, вызванной ненужным использованием одного и того же регистра в обеих последовательностях. Компилятор может обнаруживать независимые последовательности команд и, если есть регистры, доступные для использования, выбирать разные регистры во время выделения регистров в процессе генерации кода .
Однако для ускорения кода, генерируемого компиляторами, которые не выполняют эту оптимизацию, или кода, для которого не было достаточного количества регистров для выполнения этой оптимизации, многие высокопроизводительные процессоры предоставляют файл регистров с большим количеством регистров, чем указано в наборе команд. а в аппаратном обеспечении переименовывать ссылки в регистрах, определенных набором команд, для ссылки на регистры в файле регистров, чтобы исходная последовательность команд, использующая только r1, вела себя так, как если бы она была:
rA ≔ m[1024]
rA ≔ rA + 2
m[1032] ≔ rA
rB ≔ m[2048]
rB ≔ rB + 4
m[2056] ≔ rB
с регистром r1, «переименованным» во внутренний регистр rA для первых трех инструкций и во внутренний регистр rB для вторых трех инструкций. Это устраняет ложную зависимость данных, позволяя выполнять первые три инструкции параллельно со вторыми тремя инструкциями.
Опасности для данных [ править ]
Когда более одной инструкции ссылается на определенное место в качестве операнда, либо читая его (как вход), либо записывая в него (как выход), выполнение этих инструкций в порядке, отличном от исходного порядка программы, может привести к трем видам: угроз данных :
- Чтение после записи (RAW)
- чтение из регистра или ячейки памяти должно возвращать значение, помещенное туда последней записью в программном порядке, а не какую-либо другую запись. Это называется истинной зависимостью или зависимостью потока и требует, чтобы инструкции выполнялись в программном порядке.
- Запись после записи (WAW)
- последующие записи в определенный регистр или ячейку памяти должны оставить эту ячейку, содержащую результат второй записи. Эту проблему можно решить путем сжатия (также известного как отмена, аннулирование или обсуждение) первой записи, если это необходимо. Зависимости WAW также известны как выходные зависимости .
- Запись после чтения (ВОЙНА)
- чтение из регистра или ячейки памяти должно возвращать последнее предшествующее значение, записанное в эту ячейку, а не записанное программно после чтения. Это своего рода ложная зависимость , которую можно устранить путем переименования. Зависимости WAR также известны как антизависимости .
Вместо того, чтобы откладывать запись до завершения всех операций чтения, можно сохранить две копии местоположения: старое значение и новое значение. Операции чтения, которые в программном порядке предшествуют записи нового значения, могут обеспечиваться старым значением, даже если другие операции чтения, следующие за записью, обеспечиваются новым значением. Ложная зависимость разрушается и создаются дополнительные возможности для внеочередного выполнения. Когда все операции чтения, требующие старого значения, удовлетворены, его можно отбросить. Это основная концепция переименования регистров.
Все, что читается и пишется, можно переименовать. Хотя чаще всего обсуждаются регистры общего назначения и регистры с плавающей запятой, регистры флагов и состояния или даже отдельные биты состояния также обычно переименовываются.
Ячейки памяти также можно переименовывать, хотя обычно это не делается в той степени, в которой это практикуется при переименовании регистров. Закрытый буфер хранения процессора Transmeta Crusoe представляет собой форму переименования памяти.
Если бы программы воздерживались от немедленного повторного использования регистров, не было бы необходимости в переименовании регистров. Именно по этой причине некоторые наборы команд (например, IA-64 ) определяют очень большое количество регистров. Однако у этого подхода есть ограничения:
- Компилятору очень сложно избежать повторного использования регистров без значительного увеличения размера кода. Например, в циклах последовательные итерации должны будут использовать разные регистры, что требует репликации кода в процессе, называемом развертыванием цикла , или использования самомодифицирующегося кода для изменения целей операнда на каждой итерации.
- Большое количество регистров требует большего количества битов для указания регистра в качестве операнда в инструкции, что приводит к увеличению размера кода.
- Многие наборы команд исторически определяли меньшее количество регистров и не могут быть изменены, сохраняя при этом обратную совместимость.
Увеличение размера кода важно, поскольку чем больше программный код, тем чаще происходит пропуск инструкций в кэше, и процессор останавливается в ожидании новых инструкций.
физические Архитектурные и регистры
Программы на машинном языке определяют чтение и запись в ограниченный набор регистров, определенный архитектурой набора команд (ISA). Например, Alpha ISA определяет 32 целочисленных регистра шириной 64 бита каждый и 32 регистра с плавающей запятой шириной 64 бита каждый. Это архитектурные регистры. Программы, написанные для процессоров, выполняющих набор инструкций Alpha, будут определять операции чтения и записи этих 64 регистров. Если программист останавливает программу в отладчике, он может наблюдать за содержимым этих 64 регистров (и нескольких регистров состояния), чтобы определить ход работы машины.
Один конкретный процессор, реализующий эту ISA, Alpha 21264 с плавающей запятой , имеет 80 целочисленных и 72 физических регистра . На чипе Alpha 21264 имеется 80 физически отдельных ячеек, в которых могут храниться результаты целочисленных операций, и 72 ячейки, в которых могут храниться результаты операций с плавающей запятой. (На самом деле мест еще больше, но эти дополнительные места не имеют отношения к операции переименования регистра.)
В следующем тексте описаны два стиля переименования регистров, которые отличаются схемой, которая удерживает данные готовыми для исполнительного устройства.
Во всех схемах переименования машина преобразует архитектурные регистры, на которые имеются ссылки в потоке команд, в теги. Там, где архитектурные регистры могут быть указаны от 3 до 5 бит, теги обычно представляют собой числа от 6 до 8 бит. Файл переименования должен иметь порт чтения для каждого входа каждой инструкции, переименовываемой в каждом цикле, и порт записи для каждого вывода каждой инструкции, переименовываемой в каждом цикле. Поскольку размер файла регистров обычно увеличивается пропорционально квадрату числа портов, файл переименования обычно физически велик и потребляет значительную мощность.
В стиле файла регистров, индексированных по тегам , существует один большой файл регистров для значений данных, содержащий по одному регистру для каждого тега. Например, если машина имеет 80 физических регистров, то она будет использовать 7-битные теги. 48 из возможных значений тега в этом случае не используются. В этом стиле, когда инструкция выдается исполнительному устройству, теги исходных регистров отправляются в физический файл регистров, где значения, соответствующие этим тегам, считываются и отправляются в исполнительный модуль.
В стиле станции резервирования имеется множество небольших файлов ассоциативных регистров, обычно по одному на входах каждого исполнительного устройства. Каждый операнд каждой инструкции в очереди задач имеет место для значения в одном из этих файлов регистров. В этом стиле, когда инструкция выдается исполнительному блоку, записи файла регистра, соответствующие записи очереди выдачи, считываются и пересылаются исполнительному блоку.
- Файл архитектурного реестра или файл реестра выбытия (RRF)
- Зафиксированное состояние регистра машины. ОЗУ индексируется по номеру логического регистра. Обычно записывается, когда результаты удаляются или фиксируются из буфера переупорядочения.
- Будущий файл
- Наиболее спекулятивное состояние регистра машины. ОЗУ индексируется по номеру логического регистра.
- Активный файл реестра
- Термин группы Intel P6 для обозначения будущего файла.
- Буфер истории
- Обычно используется в сочетании с будущим файлом. Содержит «старые» значения регистров, которые были перезаписаны. Если производитель все еще находится в работе, он может быть проиндексирован в ОЗУ по номеру буфера истории. После неправильного предсказания ветвления необходимо использовать результаты из буфера истории — либо они копируются, либо поиск будущих файлов отключается, а буфер истории представляет собой память с адресацией по содержимому (CAM), индексируемую по номеру логического регистра.
- Буфер переупорядочения (ROB)
- Структура, которая последовательно (циклически) индексируется для каждой операции для инструкций в полете. Он отличается от буфера истории, поскольку буфер переупорядочения обычно располагается после файла будущего (если он существует) и перед файлом архитектурного регистра. Буферы переупорядочения могут быть без данных или с полным объемом данных. Некоторые примеры: В ROB Уилламетта записи ROB указывают на регистры в файле физических регистров (PRF), а также содержат другую бухгалтерскую информацию. Это также был первый дизайн «Не в порядке», выполненный Энди Глю из Иллинойса совместно с HaRRM. ROB P6, записи ROB содержат данные; отдельного PRF нет. Значения данных из ROB копируются из ROB в RRF при выводе из эксплуатации. Одна небольшая деталь: если существует временная локальность в записях ROB (т. е. если инструкции расположены близко друг к другу в последовательности команд фон Неймана, они записывают обратно близко друг к другу во времени), возможно, можно выполнить объединение записей записей ROB и, таким образом, иметь меньше портов, чем отдельный ROB/PRF будет). Неясно, имеет ли это значение, поскольку PRF следует хранить в банке. ROB обычно не имеют ассоциативной логики, и уж точно ни один из ROB, разработанных Энди Глю, не имеет CAM. Кейт Дифендорф на протяжении многих лет настаивал на том, что ROB имеют сложную ассоциативную логику. Первое предложение ROB, возможно, имело CAM.
Регистровый файл, индексированный по тегам [ править ]
Этот стиль переименования используется в MIPS R10000 , Alpha 21264 и в разделе FP AMD Athlon .
На этапе переименования каждый архитектурный регистр, на который ссылаются (для чтения или записи), просматривается в архитектурно-индексированном файле преобразования . Этот файл возвращает тег и бит готовности. Тег не готов, если в него находится поставленная в очередь инструкция, которая еще не выполнена. Для операндов чтения этот тег заменяет архитектурный регистр в инструкции. При каждой записи в регистр новый тег извлекается из FIFO свободных тегов, и новое сопоставление записывается в файл перераспределения, так что будущие инструкции по чтению архитектурного регистра будут ссылаться на этот новый тег. Тег помечен как неготовый, поскольку инструкция еще не выполнена. Предыдущий физический регистр, выделенный для этого архитектурного регистра, сохраняется вместе с инструкцией в буфере переупорядочения , который представляет собой FIFO, в котором хранятся инструкции в программном порядке между этапами декодирования и градации.
Инструкции затем помещаются в различные очереди выдачи . По мере выполнения инструкций теги их результатов передаются широковещательно, и очереди задач сопоставляют эти теги с тегами их неготовых исходных операндов. Соответствие означает, что операнд готов. Файл переназначения также соответствует этим тегам, чтобы можно было пометить соответствующие физические регистры как готовые. Когда все операнды инструкции в очереди выполнения готовы, эта инструкция готова к выполнению. Очереди задач выбирают готовые инструкции для отправки различным функциональным блокам в каждом цикле. Неготовые инструкции остаются в очередях выдачи. Такое неупорядоченное удаление инструкций из очередей задач может сделать их большими и энергозатратными.
Выданные инструкции считываются из индексированного по тегам файла физического регистра (минуя только что переданные операнды), а затем выполняются. Результаты выполнения записываются в индексированный по тегам файл физического регистра, а также передаются в обходную сеть, предшествующую каждому функциональному блоку. Градация помещает предыдущий тег для письменного архитектурного регистра в свободную очередь, чтобы его можно было повторно использовать для новой декодированной инструкции.
Исключение или неправильное предсказание ветвления приводит к тому, что файл переотображения возвращается в состояние переотображения по последней допустимой инструкции посредством комбинации снимков состояния и циклического перемещения по предыдущим тегам в упорядоченной очереди предварительного преобразования. Поскольку этот механизм необходим и поскольку он может восстановить любое состояние переотображения (а не только состояние до завершения инструкции в данный момент), неправильные прогнозы ветвления могут быть обработаны до того, как ветвь достигнет завершения, потенциально скрывая задержку неправильного прогнозирования ветвления.
Станции бронирования [ править ]
Этот стиль используется в разделе целых чисел в конструкциях AMD K7 и K8.
На этапе переименования каждый архитектурный регистр, на который ссылаются при чтении, просматривается как в архитектурно-индексированном будущем файле, так и в файле переименования. Будущее чтение файла дает значение этого регистра, если еще нет невыполненной инструкции для записи в него (т. е. он готов). Когда инструкция помещается в очередь выдачи, значения, считанные из будущего файла, записываются в соответствующие записи на станциях резервирования. Запись регистра в инструкции приводит к записи нового, неготового тега в файл переименования. Номер тега обычно присваивается последовательно в порядке инструкций — FIFO свободных тегов не требуется.
Как и в случае со схемой с индексацией тегов, очереди задач ждут неготовых операндов, чтобы увидеть соответствующие широковещательные сообщения тегов. В отличие от схемы с индексацией тегов, совпадающие теги приводят к записи соответствующего широковещательного значения на станцию резервирования записи очереди задач.
Выданные инструкции считывают свои аргументы со станции резервирования, обходят только что переданные операнды и затем выполняются. Как упоминалось ранее, файлы регистров станции резервирования обычно небольшие, примерно восемь записей.
Результаты выполнения записываются в буфер переупорядочения , на станции резервирования (если запись очереди задач имеет соответствующий тег) и в будущий файл, если это последняя инструкция, нацеленная на этот архитектурный регистр (в этом случае регистр помечен как готовый) .
Градация копирует значение из буфера переупорядочения в файл архитектурного регистра. Единственное использование файла архитектурного регистра — восстановление исключений и неправильных предсказаний ветвей.
Исключения и неверные предсказания ветвей, распознаваемые при выпуске, приводят к копированию архитектурного файла в будущий файл, а все регистры помечаются как готовые в файле переименования. Обычно нет способа восстановить состояние будущего файла для какой-либо инструкции, промежуточной между декодированием и градуировкой, поэтому обычно нет способа выполнить раннее восстановление после неправильных предсказаний ветвей.
Сравнение схем [ править ]
В обеих схемах инструкции вставляются в очереди выполнения по порядку, но удаляются не по порядку. Если очереди не сжимают пустые слоты, то в них либо будет много неиспользуемых записей, либо потребуется какое-то кодирование с переменным приоритетом, когда несколько инструкций одновременно готовы к работе. Очереди, которые схлопывают дыры, имеют более простое кодирование приоритетов, но требуют простой, но большой схемы для продвижения инструкций по очереди.
Станции резервирования имеют лучшую задержку от переименования до выполнения, поскольку этап переименования находит значения регистров напрямую, а не ищет физический номер регистра, а затем использует его для поиска значения. Эта задержка отображается как компонент задержки неправильного прогнозирования ветвления.
Станции резервирования также имеют лучшую задержку от выдачи инструкции до ее выполнения, поскольку каждый файл локального регистра меньше, чем большой центральный файл схемы с индексированием по тегам. Генерация тегов и обработка исключений также проще в схеме станции резервирования, как описано ниже.
Файлы физических регистров, используемые станциями резервирования, обычно сжимают неиспользуемые записи параллельно с очередью выдачи, которую они обслуживают, что в совокупности увеличивает размер этих файлов регистров, потребляет больше энергии и усложняет их, чем более простые файлы регистров, используемые в схеме индексации тегов. . Хуже того, каждая запись на каждой станции резервирования может быть записана каждой результирующей шиной, так что машина станции резервирования, например, с 8 записями очереди задач на функциональный блок, обычно будет иметь в 9 раз больше обходных сетей, чем эквивалентная машина, индексированная по тегам. машина. Следовательно, пересылка результатов потребляет гораздо больше энергии и места, чем в схеме с индексацией тегов.
Кроме того, схема станции резервирования имеет четыре места (Файл будущего, Станция резервирования, Буфер переупорядочения и Архитектурный файл), в которых может храниться результирующее значение, тогда как схема с индексированием тегов имеет только одно место (файл физического регистра). Поскольку результаты функциональных блоков, передаваемые во все эти места хранения, должны достигать гораздо большего числа мест в машине, чем в схеме с индексацией тегов, эта функция потребляет больше энергии, площади и времени. Тем не менее, на машинах, оснащенных очень точными схемами прогнозирования ветвей, и если задержки выполнения являются серьезной проблемой, станции резервирования могут работать очень хорошо.
История [ править ]
IBM System/360 Model 91 была первой машиной, поддерживавшей выполнение инструкций вне порядка; здесь использовался алгоритм Томасуло , использующий переименование регистров.
POWER1 , — первый микропроцессор который использовал переименование регистров и выполнение вне очереди в 1990 году.
В исходной конструкции R10000 не было ни схлопывающихся очередей задач, ни кодирования с переменным приоритетом, и в результате возникали проблемы с голоданием - самая старая инструкция в очереди иногда не выполнялась до тех пор, пока декодирование обеих инструкций не прекращалось полностью из-за отсутствия регистров переименования, а все остальные инструкции не выполнялись. был выпущен. В более поздних версиях конструкции, начиная с R12000, для решения этой проблемы использовался энкодер с частично изменяемым приоритетом.
Ранние вышедшие из строя машины не разделяли функции переименования и хранения ROB/PRF. В этом отношении некоторые из первых, такие как RUU компании Sohi или Metaflow DCAF, объединяли планирование, переименование и хранение в одной и той же структуре.
Большинство современных машин переименовывают, индексируя в ОЗУ таблицу сопоставления с номером логического регистра. Например, P6 сделал это; будущие файлы делают это и хранят данные в той же структуре.
Однако более ранние машины использовали память, адресуемую по содержимому в переименовании (CAM). Например, HPSM RAT или таблица псевдонимов регистров по существу использовала CAM для номера логического регистра в сочетании с различными версиями регистра.
Во многих отношениях история неупорядоченной микроархитектуры связана с тем, как эти CAM постепенно устранялись. Небольшие CAM полезны; большие CAM непрактичны. [ нужна ссылка ]
Микроархитектура P6 была первой микроархитектурой Intel, реализовавшей как внеочередное выполнение, так и переименование регистров. Микроархитектура P6 использовалась в микропроцессорах Pentium Pro, Pentium II, Pentium III, Pentium M, Core и Core 2. Cyrix M1 , выпущенный 2 октября 1995 года. [1] был первым процессором x86, который использовал переименование регистров и выполнение вне порядка. Другие процессоры x86 (такие как NexGen Nx686 и AMD K5 ), выпущенные в 1996 году, также отличались переименованием регистров и внеочередным выполнением RISC -операций (вместо собственных инструкций x86). [2] [3]
Ссылки [ править ]
- ^ «Процессор Cyrix 6x86» .
- ^ «НексГен Nx686» .
- ^ «PC Mag, 6 декабря 1994 г.» . Зифф Дэвис. 06.12.1994.
- Смит, Дж. Э .; Плешкун, А.Р. (июнь 1985 г.). «Реализация точных прерываний в конвейерных процессорах». Новости компьютерной архитектуры ACM SIGARCH . 13 (3): 36–44. дои : 10.1145/327070.327125 . S2CID 6616701 .
- Смит, Дж. Э .; Плешкун, А.Р. (май 1988 г.). «Реализация точных прерываний в конвейерных процессорах». IEEE Транс. Вычислить. 37 (5): 562–573. дои : 10.1109/12.4607 .
- Смит, Дж. Э .; Плешкун, А.Р. (1998). «Реализация точных прерываний в конвейерных процессорах» . 25 лет международным симпозиумам по компьютерной архитектуре (избранные статьи) - ISCA '98 . стр. 291–299 . дои : 10.1145/285930.285988 . ISBN 1581130589 .