Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 [ 60 ] 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88

6.10.1.8. Инструкция, в которой используется одновременно адресация сосмещен!,, и числовые данные на Р1 не спариваются, на РММХ могут спариваться только в U-конвейе р

MOV DWORD PTR DS:[1000], О СМР BYTE PTR [ЕВХ+81, 1 СМР BYTE PTR [ЕВХ], 1 СМР BYTE PTR [ЕВХ+8], AL

не спаривается или только в и-конвейе:;с не спаривается или только в и-конвейер спаривается спаривается

Другая проблема, связанная с подобными инструкциями, выполняющимися на Р>МХ, заключается в том, что такие инструкции могут быть длинее: семи байтов, а это приводит к невозможности раскодировки больше одной инструкции за такт, подробнее это объясняется в разд. 6.12.

6.10.1.9. Обе инструкции должны быть заранее зафужены и раскодированы. Это объясняется в разд. 6.8.

6.10.1.10. Есть специальные правила спаривания ддя инсфукций ММХ на РММХ:

£1 ММХ-сдвиг, инсфукции упаковки или распаковки могут выполняться в любом конвейере, но не могут спариваться с другим ММХ-сдвигом, инсфукциями упаковки или распаковки;

Ш ММХ-инсфукции умножения могут выполняться в любом конвейер, но не могут спариваться с другими ММХ-инсфукциями умножения. Они занимают 3 такта, и последние 2 такта могут перекрыть последующие инструкции так же, как это делают инструкции плавающей запятой (см. гл. 24);

£1 ММХ-инсфукция, обращающаяся к памяти или целочисленным регисфам, может выполняться только в и-конвейер и не может спариваться с не-ММХ инсфукцией.

6.10.2 Несовершенное спаривание

Бывают сшуащш, когда две спаривающиеся инсфукции не будут выполняться одновременно или будут частично рассинхронизированы во времени. Пока обе инсфукции не выполняться (каждая на своем конвейере), ни одна другая инсфукция не начнет вьшолняться.

Несовершенное спаривание возникает в следующих случаях.

6.10.2.1. Если вторая инструкция приводит к задержке AGU (разд. 6.9).

6.10.2.2. Две инсфукции не могут обращаться к одному и тому двойному слову в памяти одновременно.

MOV AL, [ESI] / MOV BL, [ESI+1] Два операнда команд находятся внутри одного и того же двойного слова, поэтому они не могут выполняться одновременно. Пара займет два такта для выполнения. MOV AL, [ESI+3] / MOV BL, [ESI+41

MOV [ESI], ЕАХ / MOV [ESI+32000], ЕВХ MOV [ESI], ЕАХ / MOV [ESI+32004], ЕВХ

несовершенное спаривание совершенное спаривание

Спариваемые целочисленные инсфукции, которые не обращаются к памяти, фебуют один такт для выполнения, кроме неправильно предсказанных переходов. Инсфукции MOV, читающие или пишущие в память также занимают один такт, если данные находятся в кэше и правильно выравненны. Нет потери в скорости при использовании сложных способов адресации, таких, как смещение и масштабирование.

Спариваемая целочисленная инсфукция, которая читает из памяти, делает какие-то вычисления, а затем сохраняет результат в регисфах или флагах, занимает 2 такта (инструкции чтения/модифицирования).

Спариваемая целочисленная инсфукция, которая читает из памяти, делает какие-то вычисления, а затем записывает результат обратно в память, занимает 3 такта (инсфукции чтения/модифицирования/записи).

6.10.2.4. Если инсфукция чтения/модифицирования/записи спаривается с инсфукцией чтения/модифицирования шш чтения/модифицирования/записи, тогда они спарятся неидеально.

Количество тактов, которые пофебуются для выполнения такой пары, даны в табл. 6.4.

Табл. 6.4. Время выполнения некоторых спаренных целочисленных инструкций

Первая инструкция

Вторая инструкция

регистр

чтение/изменение

чтение/изменение/запись

MOV или регистр

чтение/изменение

чтение/изменение/запись

ADD [meml], ЕАХ / ADD ЕВХ, [mem2] ; 4 такта ADD ЕВХ, [mem2] / ADD [meml], EAX ; 3 такта

6.10.2.5. Когда две спаривающиеся инсфукции фебуют дополнительное время для Выполнения из-за неоптимального использования кэша, невыровненности или неправильно предсказанного условного перехода, они будут выполняться дольше, чем каждая Инсфукция по отдельности, но меньше суммы времен, требующихся на выполнение «аждой из них по отдельности.

Эти два операнда находятся в разных двойных словах, поэтому они прекрасно спари-раются и занимают всего один такт.

6.10.2.3. Правило 6.10.2.2 расширяет зону своего действия, если биты 2-4 обоих адресов одинаковы (конфликт банков кэша). Для адресов размером в двойное слово это означает, что разность между обоими адресами не должна делиться на 32.



6.10.2.6. Спариваемая инструкция с плавающей запятой и следующая за ней РХСЦ повлекут несоверщенное спаривание, если последняя не является инструкцией с плавающей запятой.

Чтобы избежать несоверщенного спаривания, нужно знать, какие инструкции пойду-г в и-конвейер, а какие - в V-конвейер. Это можно выяснить, просмотрев код и отыскав инструкции, которые неспрариваются, или спариваются только в определенном конвейере, или не могут спариваться в силу одного из вышеизложенных правил.

Несовершенного спаривания можно зачастую избежать, реорганизовав свои инструкции.

L1: MOV ЕАХ,[ESI]

MOV ЕВХ,[ESI]

INC ЕСХ

Здесь две инструкции MOV формируют несовершенную пару, потому что обе обра щаются к одной и той же области в памяти, поэтому последовательность займет 3 такта Можно улучшить этот код, реорганизовав инструкции так, чтобы INC ЕСХ спаривалас с одной из инструкции MOV.

INC MOV JMP

ЕАХ,OFFSET А ЕВХ,ЕВХ

ЕСХ, [ЕАХ] L1

Пара INC ЕВХ / MOV ЕСХ,[ЕАХ] несовершенная, потому что следующая инструкция приводит к задержке AGI. Последовательность занимает 4 такта. Если вставить NOP или какую-нибудь другую инструкцию, чтобы MOV ЕСХ,[ЕАХ] спаривался с JMP LI последовательность займет только три такта.

Следующий пример выполняется в 16-битном режиме, предполагается, что SP делится на 4:

L3: PUSH АХ PUSH ВХ PUSH СХ

PUSH DX CALL FUNC

Инструкции PUSH формируют две несовершенные пары, потому что оба операнда в каждой паре обращаются к одному и тому же слову в памяти. PUSH ВХ могла бы совершенно спариться с PUSH СХ (потому что они находятся по разные стороны от границы, отделяющей двойные слова друг от друга), но этого не происходит, потому что она уже спарена с PUSH АХ. Поэтому последовательность занимает 5 тактов. Если вставить NOP или другую инструкцию, чтобы PUSH ВХ спаривалась с PUSH СХ, а PUSH DX с CALL FUNC, последовательность займет только 3 такта. Другой путь разрешени"

данной проблемы - убедиться, что SP не кратен четырем. Правда, узнать это в 16-битном режиме довольно сложно, поэтому лучший выход - использовать 32-битный режим.

6.11. Разбивка сложных инструкций на простые (PlnPMMX)

Вы можете разбить инструкции чтения/модификации и инструкции чтения/модификации/записи, чтобы улучшить спаривание.

ADD [memli,EAX / ADD [тет2],ЕВХ ; 5 тактов

Этот код можно разбить на следующую последовательность, которая будет занимать только 3 такта:

MOV ECX,[meml] / MOV EDX,[mem2] / ADD ECX,EAX / ADD EDX,EBX MOV [meml],ECX / MOV [raem2],EDX

Таким же образом можно разбивать неспариваемые инструкции на спариваемые:

PUSH [m PUSH [m

разбивается на:

PUSH [meml]

PUSH [mem2] ; не спаривается

MOV EAX,[meml] MOV EBX, [mem2] PUSH EAX

PUSH EBX ; все спаривается

Другие примеры неспариваемых инструкций, которые можно разбить на простые спариваемые:

CDQ разбивается на MOV EDX,EAX / ,SAR EDX,31 NOT EAX мепйстся на XOR EAX,-1 NEG EAX разбивается на XOR EAX,-1 / INCEAX MOVZX EAX,BYTE PTR [mem] разбивается на XOR EAX,EAX / MOV AL,BYTE PTR [mem] JECXZ разбивается на TEST ECX,ECX / JZ bOOP разбивается на DEC ECX / JNZ XLAT меняется на MOV AL, [EBX + EAX]

Если разбивание иснтрукций не повышает скорось, можно оставить сложные или неспариваемые конструкции для уменьшения размера кода.



6.12. Префиксы (Р1 и РММХ)

Инструкция с одним или более префиксами не может исполняться в V-конвейере (смотри секцию 6.10.1.7).

На Р1 возникает задержка в один такт для каждого префикса, кроме ofh в инструкциях условного ближнего перехода.

У РММХ нет задержки раскодирования из-за префикса OFH. Префиксы сегментов и повторения занимают один такт для раскодирования. РММХ может раскодировать две инструкции, если у первой инструкции нет префиксов или есть префикс сегмента или повторения, у второй инструкции нет префиксов. Инструкции с префиксами раз-мера адреса или операнда на РММХ раскодировываются только отдельно. Инструкции с несколькими префиксами занимают по одному такту на каждый префикс.

Префиксы размера адреса нужно избегать, используя 32-битный режим. Префиксы сегментов можно избежать в 32-битном режиме, используя особенности плоской модели памяти. Использования префикса размера операнда можно избежать в 32-битном режиме, используя только 8-битные и 32-битные даннью.

Когда нельзя избежать префиксов, задержку раскодирования можно скрыть, если предыдущая инструкция занимает больше одного такта для исполнения. Правило для Р1: каждая инструкция, которая занимает N тактов для выполнения (не для раскодирования), может затенять задержку раскодирования N-1 префиксов в следующих двух (иногда трех) инструкциях или парах инструкций. Другими словами, каждый дополнительный такт, который требует инструкция для выполнения, может быть использован для раскодирования одного префикса в следующей инструкции. Этот эффект иногда распространяется даже на правильно предсказанный переход. Любая инструкция, которая занимает больше одного такта для выполнения, и любая инструкция, чье выполнение задерживается из-за AGI, неправильного использования кэша, неправильного выравнивания или неправильного предсказания перехода, создает эффект затемнения.

У РММХ есть похожий эффект затемнения, но он имеет другой механизм. Раскоди-ровываемые инструкции хранятся в прозрачном буфере FIFO, в котором может храниться до четрырех инструкций. Когда буфер пуст, инструкции выполняются сразу после раскодировки. Буфер заполняется, когда инструкции раскодировываются быстрее, чем выполняются, т. е. они неспарены или являются мультитактовыми. Буфер FIFO опустошается, когда инструкции выполняются быстрее, чем раскодировываются, т. е. когда возникают задержки из-за префиксов. Буфер FIFO становится пустым после неправильно предсказанного перехода. Буфер FIFO может получить две инструкции за такт, если у второй инструкции нет префиксов и ни одна из инструкций не длинее 7 байт. Два конвейера (U и V) могуть получать по одной инструкции за такт из буфера FIFO.

CLD / REP MOVSD

Инструкция CLD занимает два такта и поэтому затемняет задержку раскодировки префикса REP. Код занял бы на один такт больше, если бы инструкция CLD находилась достаточно далеко от REP MOVSD.

СМР DWORD PTR [ЕВХ],О / MOV ЕАХ,О / SETNZ AL

Инструкция СМР занимает два такта, потому что это инструкция чтения/модифицирования. Префикс OFH инструкции SETNZ раскодировывается во время второго такта выполнения СМР, поэтому задержка раскодирования скрыта на Р1 (у рММХ нет задержки для OFH).

Потери производительности, связанные с префиксами, на РРго, Р2 и РЗ объясняются в гл. 6.14.

6.13. Обзор конвейеров РРго, Р2 и РЗ

Архитектура микропроцессоров РРго, Р2 и РЗ хорошо объяснена и проиллюстрирована в различных руководствах Intel. Желательно для продолжения разговора начать с изучения именно этих материалов. Ниже коротко осбуждаются архитектурные особенности микропроцессоров семейства Pentium с упором на те элементы, которые необходимы для оптимизации кода.

Итак, код доставляется из кэша кода выровненными 16-байтными последовательностями в "удвоенный" буфер, в который умещаются две таких последовательности. Затем из него код поступает в декодеры в виде блоков, размером 16 байт, не обязательно выровненных на границу инструкции. Цель удвоенного буфера - сделать возможным раскодировку инструкций, которые пересекают фаницу в 16 байт.

Каждый 16-байтный блок анализируется декодером длины инсфукции, который определяет фаницы смежных инсфукций, а затем каждая из инсфукций попадает в один из декодеров инсфукций. В микропроцессорах семейства Pentium есть фи декодера, и это дает возможность декодировать до фех инструкций за такт. Группа из фех инструкций, декодируемых за один такт, называется декодируемой группой.

Декодеры переводят инструкции в микрооперации (сокращенно "мопы"). Простые инсфукции генерируют только один мои, в то время как более сложные инсфукции Могут генерировать несколько мопов. Например, инсфукция ADD ЕАХ,[МЕМ] декодируется в два мопа: один, считывающий исходный операнд из памяти, а другой, который выполняет сложение. Целью разбития инсфукций на мопы является сделать обработку инсфукций более эффективной и поддающейся конвейеризации.

Три декодера называются, соответственно, DO, D1 и D2. DO может обрабатывать любые инсфукции, в то время как D1 и D2 могут обрабатывать только простые инсфук-Чии, генерирующие только один мои.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 [ 60 ] 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88