[отпатрулированная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Addbot (обсуждение | вклад)
м Интервики (всего 10) перенесены на Викиданные, d:q295018
→‎Выборка и декодирование инструкций: викификация, оформление, стилевые правки
Строка 11:
=== Выборка и декодирование инструкций ===
 
Основная проблема декодирования инструкций x86 заключается в том, что они имеют различную длину (от 1 до 15 байт). В K8 эта проблема решается путём разделения процесса разметки потока инструкций и собственно декодирования на две отдельные подзадачи исполняемые в разных блоках процессора. Дело в том, что перед помещением в [[Гарвардская архитектура|кэш первого уровня для инструкций]] (''L1I'') проходят через процедуру предекодирования в темпе по 4 байт инструкций за такт. А информация о разметке помещается в специальный массив тегов ассоциированный с L1I''L1''. Благодаря этому упрощается дальнейшее, рабочее декодирование и сокращается конвейер. Такое решение является уникальным, так как в иных процессорах x86''x''86 (за исключением K7) используются иные техники решения этой проблемы. Так в процессорах ''Intel P6'' разметка осуществляется «на лету», а в ''Intel'' ''[[NetBurst]]'' инструкции проходят декодирование '''''до''''' сохранения в L1I кэше''L1'' (вместо стандартного кэша инструкций используется специальная, довольно сложная структура хранящая уже декодированные микрооперации  — кэш трасс).
 
K8 располагает 2двухканальным наборно-х канальным [[наборноассоциативный кэш L1I|наборноассоциативнымассоциативным кэшем L1I]] полезным объёмом 64 Кбайт со [[строка кэша|строкой]] равной 64 байт. Однако помимо собственно инструкций в процессоре также хранится [[массив тегов разметки]]  — 3 бит на один байт L1I''L1'', то есть порядка 21 Кбайт, а также [[дескрипторы предсказателя ветвлений]]  — порядка 8 Кбайт.
 
Из L1I''L1'' инструкции выбираются сразу 16-байтными блоками, которые отправляются одновременно, через специальный буфер (''fetch''-буфер), на исполнительный конвейер и в блок предсказания ветвлений (''branch predictor''). В предсказателе ветвлений блок инструкций анализируется с использованием специального буфера адресов переходов (''BTB'') размером 2048 записей и ассоциированных с ним таблиц истории переходов (''BHT'') полной ёмкостью 16К записей, а также некоторых вспомогательных устройств. В случае если в блоке инструкции содержался переход, то выборка следующего блока будет выполнена уже с предсказанного адреса. К сожалению ''branch predictor '' — слишком сложное устройство, чтобы работать в полном темпе процессора, поэтому все предсказания выполняются с [[латентность]]ю 2 такта, то есть, если процессор встречает переход, то следующая выборка из L1I''L1'' будет выполнена только через такт. В большинстве случаев эта задержка нивелируется тем что в одном 16-байт блоке содержится много инструкций, и общий темп выборки является опережающим.
 
Из fetch-буфера инструкции попадают на декодер. Каждую инструкцию x86 K8 относит к одному из трёх классов: DirectPath — инструкции перекодирующиеся в один МОП (микрооперацию); DirectPathDouble — инструкции перекодирующиеся в 2 МОПа; и VectorPath — инструкции декодирующиеся в набор более чем из 2-х МОПов. DirectPath и DirectPathDouble считаются простыми, а VectorPath сложными. Фактически в K8 имеется 2 различных блока декодеров работающие параллельно и дополняющие друг друга. Основной блок представляет собой комплекс из 3-х простых декодеров работающих совместно и декодирующих до 3-х DirectPath и DirectPathDouble инструкций за такт, в любой комбинации. Второй блок занимается исключительно VectorPath инструкциями и декодирует по одной такой инструкции за такт. Когда работает VectorPath декодер, соответствующие стадии простых декодеров блокируются. Таким образом декодер K8 можно считать довольно эффективным и производительным устройством умеющим перекодировать до трёх простых или одной сложной инструкции за такт. Результаты декодирования, МОПы через промежуточные буферы перепаковываются в специальные группы по три МОПа в группе (лайны). Мопы в группе следуют строго в порядке изначального кода программы, перестановка не производится. Мопы DirectPath и DirectPathDouble инструкций могут смешиваться как угодно (кроме инструкции умножения, которая декодируется в 2 МОПа и всегда помещается в один лайн), мопы одной DirectPathDouble инструкции даже могут быть расположены в разных лайна, но все мопы VectorPath инструкций должны следовать в целом числе групп и не могут смешиваться с мопами от простых инструкций, что ведёт к некоторой фрагментации и неполному заполнению групп, но впрочем не является частой ситуацией, так как абсолютное большинство инструкций в K8 являются простыми.
Из ''fetch''-буфера инструкции попадают на декодер. Каждую инструкцию ''x''86 K8 относит к одному из трёх классов:
* ''DirectPath'' — инструкции перекодирующиеся в один МОП (микрооперацию);
* ''DirectPathDouble'' — инструкции перекодирующиеся в 2 МОПа; и
* ''VectorPath'' — инструкции декодирующиеся в набор более чем из 2-х МОПов.
 
Из fetch-буфера инструкции попадают на декодер. Каждую инструкцию x86 K8 относит к одному из трёх классов: DirectPath — инструкции перекодирующиеся в один МОП (микрооперацию); DirectPathDouble — инструкции перекодирующиеся в 2 МОПа; и VectorPath — инструкции декодирующиеся в набор более чем из 2-х МОПов. ''DirectPath'' и ''DirectPathDouble'' считаются простыми, а ''VectorPath'' сложными. Фактически в K8 имеется 2 различных блока декодеров работающие параллельно и дополняющие друг друга. Основной блок представляет собой комплекс из 3-хтрёх простых декодеров работающих совместно и декодирующих до 3-хтрёх ''DirectPath'' и ''DirectPathDouble'' инструкций за такт, в любой комбинации. Второй блок занимается исключительно ''VectorPath ''-инструкциями и декодирует по одной такой инструкции за такт. Когда работает ''VectorPath ''-декодер, соответствующие стадии простых декодеров блокируются. Таким образом декодер K8 можно считать довольно эффективным и производительным устройством умеющим перекодировать до трёх простых или одной сложной инструкции за такт. Результаты декодирования, МОПы через промежуточные буферы перепаковываются в специальные группы по три МОПа в группе (лайны). Мопы в группе следуют строго в порядке изначального кода программы, перестановка не производится. Мопы ''DirectPath'' и ''DirectPathDouble'' инструкций могут смешиваться как угодно (кроме инструкции умножения, которая декодируется в 2 МОПа и всегда помещается в один лайн), мопы одной ''DirectPathDouble'' инструкции даже могут быть расположены в разных лайна, но все мопы ''VectorPath'' инструкций должны следовать в целом числе групп и не могут смешиваться с мопами от простых инструкций, что ведёт к некоторой фрагментации и неполному заполнению групп, но впрочем не является частой ситуацией, так как абсолютное большинство инструкций в K8 являются простыми.
 
=== Исполнение и отставка ===