9.3.2. Особенности архитектуры процессоров Pentium и Pentium ММХ Выполнение команд

Процессор Pentium содержит два конвейера исполнения целочисленных ко­манд (U и V) и один конвейер для команд FPU. Он может выполнять две цело­численные команды одновременно и поддерживает механизм предсказания пере­ходов, значительно сокращающий частоту сброса очереди предвыборки из-за передачи управления по другому адресу.

На стадии загрузки команды процессор анализирует сразу две следующие ко­манды!, находящиеся в очереди, и, если возможно, выполняет одну из них в U-KOH-вейере, а другую' в V. Если это невозможно, первая команда загружается в U-KOH-вейер, а V-конвейер пустует.

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

команды подвержены одной из следующих регистровых зависимостей:

- первая команда пишет в регистр, а вторая читает из него;

- обе команды пишут в один и тот же регистр (кроме записи в EFLAGS). Исключения из этих правил - пары PUSH/PUSH, PUSH/POP

и PUSH/CALL, осуществляющие запись в регистр ESP; О одна из команд не находится в кэше команд (кроме случая, если первая ко­манда - однобайтная);

□ одна из команд длиннее семи байт (для Pentium);

□ одна команда длиннее восьми байт, а другая - семи (для Pentium MMX).

Помните, что простыми перестановками команд можно выиграть до 200% ско­рости в критических ситуациях.

Кэш-память

Процессор Pentium состоит из двух 8-килобайтных блоков кэш-памяти, один для кода и один для данных с длиной линейки 32 байта. Кэш данных состоит из восьми банков, причем он доступен из обоих конвейеров одновременно, только если обращения происходят к разным банкам. Когда данные или код находятся в не кэше, минимальная дополнительная задержка составляет 4 такта.

Если происходит два кэш -промаха Одновременно при записи в память из обо­их конвейеров и обе записи попадают в одно учетверенное слово (например, при записи двух слов в последовательные адреса), процессор затрачивает столько же времени, сколько и на один кэш-промах.

Очередь предвыборки

Перед тем как команды распределяются по конвейерам, они загружаются из памяти в одну из четырех 32-байтных очередей предвыборки. Если загружается команда перехода и блок предсказания переходов подтверждает, что переход про­изойдет, начинает работать следующая очередь предвыборки. Это сделано для того, чтобы, если предсказание было неверным, первая очередь продолжила вы­борку команд после невыполненной команды перехода.

Если условный переход не был предугадан, затрачивается 3 такта, когда коман­да перехода находилась в U-конвейере, и 4 такта, когда в V.

Если безусловный переход или вызов процедуры не был предугадан, затрачи­вается 3 такта в любом случае;

Конвейер FPU

Конвейер исполнения команд FPU состоит из трех участков, на каждом из ко­торых команда тратит по крайней мере один такт. Многие команды, однако, пост­роены таким образом, что позволяют другим командам выполняться на ранних участках конвейера, пока данные команды выполняются на более поздних. Кроме того, параллельно с длинными командами FPU, например FDIV, могут выпол­няться команды в целочисленных конвейерах.

Команда FXCH может выполняться одновременно почти с любой командой

FPU, что позволяет использовать ST(n) как неупорядоченный набор регистров практически без потерь в производительности.

Конвейер ММХ

Команды ММХ, также как команды FPU, используют дополнительный кон­вейер, содержащий два блока целочисленной арифметики (и логики), один блок умножения, блок сдвигов, блок доступа к памяти и блок доступа к целочислен­ным регистрам. Все блоки, кроме умножителя, выполняют свои стадии команды за один такт, умножение требует трех тактов, но имеет собственный буфбр, поз­воляющий принимать по одной команде каждый такт. Так как блоков арифмети­ки два, соответствующие операции могут выполняться одновременно в или V-конвейере. Команды, использующие блок сдвигов или умножитель, способны осуществляться в любом конвейере, но не одновременно с другими командами, применяющими тот же самый блок. А команды, обращающиеся к памяти или обычным регистрам, в состоянии выполняться только в U-конвейере и только одновременно с ММХ-командами.

Если перед командой, копирующей ММХ-регистр в память или в обычный ре­гистр, происходила запись в ММХ-регистр, затрачивается один лишний такт.