Обзор микроархитектур современных десктопных процессоров. Часть 1
Страница 10. Intel Core (P8)


 

Intel Core (P8)

Общая организация подсистемы декодирования инструкций в новом процессоре P8 напоминает организацию этой подсистемы в последнем представителе семейства P6/P6+ — процессоре P-M2 (Core Duo), и представляет собой её дальнейшее развитие. На данный момент пока что нет достаточно полной информации о новой микроархитектуре, однако на основе презентаций и замеров уже можно выявить её основные особенности.

Судя по представленным блок-схемам, в процессоре P8 по-прежнему используется схема с определителем длины инструкций. На этих схемах он назван предекодером и расположен после I-кэша. Предекодер может размечать до шести x86-инструкций за такт. После предекодера инструкции помещаются в небольшую очередь, откуда передаются в четыре параллельно работающие канала декодера. Перед попаданием в каналы декодера над одной парой инструкций может быть проведена операция объединения («макро-слияния», macro-fusion) в единую макроинструкцию: инструкция сравнения (CMP или TEST) может быть объединена с расположенной непосредственно после неё инструкцией условного перехода (Jcc). Такие пары инструкций очень часто встречаются в программах с большим числом ветвлений, содержащих конструкции If-Then-Else или Case. Объединённая макроинструкция (CMPJcc или TESTJcc) обрабатывается в одном канале декодера, преобразуется в один МОП и исполняется за один такт в соответствующем функциональном устройстве.

Таким образом, с учётом возможного объединения пары инструкций (макро-слияния), декодер процессора P8 способен принимать на вход до пяти x86-инструкций за такт. Это должно было потребовать увеличения размера порции байтов, обрабатываемой определителем длины инструкций (предекодером) за один раз. Определитель длины инструкций также должен был усложниться в связи с тем, что в инструкциях 64-битного режима EM64T (x86-64) появился дополнительный префикс REX, затрудняющий их разбор и определение длины. Кроме того, определитель теперь должен гарантированно размечать по четыре-пять x86-инструкций за такт, а не по три, как в предыдущих процессорах.

Предварительные замеры показали, что декодер процессора P8 может обрабатывать с полной скоростью инструкции, содержащие несколько префиксов (хотя пока ещё не ясно, относится ли это ко всем сочетаниям префиксов и инструкций). Данное свойство роднит его с декодером процессора AMD K8 (в котором инструкции NOP, содержащие 4 и более префиксов, обрабатываются даже медленнее, чем в P8), и отличает от предшествующего процессора P-M2 (в котором на обработку каждого префикса, начиная со второго, затрачивается дополнительный такт). По этим признакам можно было бы предположить, что информация о разметке инструкций запоминается в I-кэше для последующего использования — однако явного указания на такую организацию предекодирования в презентациях нет.

Также замеры показали, что определитель длины инструкций может обрабатывать более 16 байтов за такт. Однако длина блока, считываемого из I-кэша, не изменилась и составляет по-прежнему 16 байт. В совокупности ограничение на темп декодирования стало более мягким — теперь эта величина (16 байт/такт) ограничивает среднюю скорость декодирования потока инструкций, а не размер группы, декодируемой в каждом такте. Это также роднит новый декодер с декодером процессора K8.

Четыре параллельно работающих канала декодера организованы по несимметричной схеме (предположительно «4-1-1-1 / >4»): только первый канал может принимать сложные инструкции, порождающие более одного МОПа. Благодаря слиянию микроопераций, инструкции загрузки с исполнением (Load-Op) и выгрузки (Store) преобразуются в один МОП и не являются сложными. Все инструкции SSE (включая Load-Op) также преобразуются в один МОП. Упакованные инструкции SSE порождают «128-битные» МОПы, которые исполняются в 128-битном функциональном устройстве без расщепления и в полном темпе.

Несмотря на то, что в «простых» каналах декодера по-прежнему порождается всего один МОП, схему декодера процессора P8 было бы более правильно обозначить как «4-2-2-2 / >2», так как одна упакованная операция SSE соответствует двум МОПам в предшествующих процессорах (Intel P-III, P-M и AMD K8). Использование макро-слияния, слияния микроопераций и монолитных «128-битных» МОПов (для упакованных операций SSE) позволяет существенно уменьшить общее число порождаемых МОПов, что приводит к экономии ресурсов буферов и увеличению эффективной пропускной способности трактов процессора.

Таким образом, в процессе поэтапного эволюционного развития процессоров P-III —> P-M —> P-M2 —> P8, подсистема декодирования инструкций претерпела существенные количественные и качественные изменения. Смягчились ограничения на число префиксов и на размер инструкций, декодируемых в полном темпе. Добавился 64-битный режим целочисленной и адресной арифметики EM64T (x86-64). Число обрабатываемых за один такт x86-инструкций увеличилось с 3 до 4-5, а число порождаемых МОПов — с 3 до 4. Благодаря механизму слияния микроопераций все каналы декодера приобрели способность обрабатывать большинство машинных инструкций, и за счёт этого эффективная пропускная способность декодера и последующих трактов увеличилась дополнительно примерно в 1.3-1.5 раза. Кроме того, значительно увеличилась пропускная способность декодера для инструкций SSE, и вдвое уменьшилось число МОПов, порождаемых для упакованных операций. В результате совокупная эффективная пропускная способность декодера выросла в среднем не менее чем в два раза (в расчёте на такт), что находится в соответствии с повысившейся пропускной способностью функциональных устройств процессора (в полтора раза для логики и целочисленной арифметики, и в два-четыре раза для арифметики с плавающей точкой).

Как и в процессорах семейства P6/P6+, в новом процессоре МОПы после выхода из декодера обрабатываются и отслеживаются по отдельности. В частности, в буфере переупорядочения они размещаются плотно, без потери на фрагментацию. Для переназначения (переименования) регистров результатов используется набор внутренних (физических) регистров, общий для всех типов операций. По всей видимости, каждый физический регистр приписан к соответствующей позиции буфера переупорядочения (как и в процессорах семейства P6/P6+), и их количество равно размеру буфера. Регистры имеют длину 128 разрядов, и для хранения 128-битного регистра XMM используется один внутренний регистр.

 
« Предыдущая статья   Следующая статья »