23. СООБРАЖЕНИЯ О ДРУГИХ МИКРОПРОЦЕССОРАХ
=========================================
Большинство оптимизаций, описанных в этом документе может иметь очень
маленькую, а может и вообще отрицательную, эффективность на других, не-Intel
микропроцессорах, но о некоторых проблемах лучше быть осведомленным.
Использование полного регистра, после записи в его часть вызовет серьезные
задержки на 80486 и небольшие задержки на PentiumPro. Например:
MOV AL,[EBX] / MOV ECX,EAX
На PentiumPro может быть анулированно обнулением полного регистра перед
записью:
XOR EAX,EAX / MOV AL,[EBX] / MOV ECX,EAX
или используя MOVZX EAX,BYTE PTR [EBX]
При планировании кода с плавающей точкой на Pentium, обычно используется
много инструкций FXCH. Это замедлит исполнение кода на ранних микропроцессорах,
но не на PentiuPro, поздних Intel и не-Intel процессорах.
Как упомянуто во введении, Intel заявил о создании новых версий процессора
Pentium с набором MMX инструкций, предназначеных для векторных операций. Эти
инструкции будут очень полезны для параллельных расчетов большого числа
целочисленных операций.
Чип PentiumPro во многих отношениях быстрее, чем Pentium, но с другой стороны
кое в чем медленнее. Знание сильных и слабых стороны PentiumPro позволит вам
делать ваш код максимально быстрым для обоих процессоров.
Наиболее важное преимущество PentiumPro то, что он делает большую часть
оптимизаций для вас: переупорядочивание инструкций и разложение сложных
инструкций на более простые. Но отлично оптимизированный код - различается
у обоих процессоров.
Оба процессора имеют одинаковое число модулей исполнения, так что
производительность их примерно равна. PentiumPro имеет раздельные модули для
чтения и записи в память, таким образом он может делать три операции чтения
одновременно, но не может делать два чтения и запись, или две операции записи
и одну чтения одновременно, тогда как Pentium может.
PentiumPro лучше, чем Pentium в следующих случаях:
- порядок выполнения
- один промах кеша не задерживает последующие инструкции
- разбиение сложных инструкций на меньшие микро-операции
- автоматическое анулирование регистра, для анулирования не необходимых
задержек
- лучший механизм предсказания переходов, чем на Pentium без MMX
- многие неспариваемые или слабо оптимизированные на Pentium инструкции
выполняются лучше на PentiumPro, т.н. целочисленное умножение, MOVZX,
CQD, битовое сканирование, битовый тест, сдвиги CL и загрузка чисел с
плавающей точкой
- числа с плавающей точкой и целые числа операции могут обрабатываться
одновременно
- чтение и запись в память не занимает ALU
- инструкции косвенно обращающиеся к памяти не вызывают остановку AGI
- новые инструкции перемещения данных могут использоваться вместо инструкций
условных переходов
- новая инструкция FCOMI устраняет потребность в медленной FNSTSW AX
- более высокая частота
PentiumPro уступает Pentium в следующем:
- непредсказанные переходы очень медленные (10-15 тактов!)
- низкая производительность 16 битного кода и сегментной модели
- медленно декодируются префиксы (кроме 0FH)
- большие потери при смешивании 8, 16 и 32 битных регистров
- FADD, FSUB, FMUL, FCHS медленнее
- не возможны два чтения или записи в память
- некоторые комбинации инструкций не могут исполняться параллельно, например
push + push, push + условный переход
Таким образом, PentiumPro может быть действительно медленнее Pentium, хорошо
оптимизированный код, с большим количеством непредсказанных переходов и
большим количеством операций с плавающей точкой может действительно работать
с весьма разной скоростью.
Большинство недостатков каждого процессора могут быть обойдены тщательным
оптимизированием и использованием режима адресации FLAT. Но проблема с
непредсказанными условными переходами не может анулироваться, за исключением
случаев, где вы сможете заменить их инструкциями условного перемещения.
Использование преимуществ MMX и PentiumPro процессоров создаст значительные
трудности, если вы захотите, что бы ваш код был совместим с более ранними
микропроцессорами. Решением может быть написание нескольких версий кода,
оптимизированного под каждый из процессоров. Ваша программа должна
автоматически определять тип используемого процессора и выбирать
соответствующую версию кода. Такой сложный способ целесообразно применять
только в критических частях вашей программы.
|