#0 — то будет пропущена одна позиция
#1 — три
#2 — две.
Таким образом, здесь, в среднем, будет теряться [(1 + 3 + 2)/3] / 2 = половина ресурсов «line»!
Дальнейший путь по конвейеру отличается для целочисленных инструкций, и инструкций с плавающей точкой. Вначале приведем стадии для целочисленных инструкций:
Теперь перечислим стадии для инструкций с плавающей точкой.
Отображение стека x87-регистров на файл с плоской адресацией и последующее переименование (отображение номера) архитектурного регистра с плавающей точкой в аппаратный регистр для каждого из трех (максимум) mOP-ов.
Все эти стадии относятся к архитектуре К7, про архитектуру К8 известно значительно меньше подробностей. Стадии, не относящиеся к декодеру, формально не изменили своего назначения. Напротив, вместо первых шести стадий К7 в К8 мы видим следующие:
FETCH1 (соответствует FETCH К7)
FETCH2
PICK
DECODE1
DECODE2
PACK
PACK/DECODE
DISPATCH (соответствует IDEC К7)
В конечном итоге, на стадии 8 — К8 (и соответствующей ей стадии 6 — К7) декодером будет выдана тройка макроопераций. В этой статье, не строя предположений о том, что стоит за новыми стадиями, мы посмотрим на практический выигрыш от нововведений.
Вначале рассмотрим изменения качественные. Помимо двух путей декодирования, Direct Path (DP) и Vector Path (VP), уже знакомых нам по К7, в К8 мы видим новый тип — Direct Path Double (DD). Это действительно важное изменение: теперь большинство тех инструкций, которые раскладываются на 2 mOP-а и, следовательно, ранее направлялись по VectorPath, сейчас обрабатываются по-другому, как DirectPath Double. Как раз те самые «бывшие» VectorPath инструкции, которые ранее блокировали декодер, попусту «разбазаривая» часть его ресурсов. Теперь же они могут стартовать с любой позиции. Они дополняются до тройки как mOP-ами, полученными из DP-инструкций, так и отдельными mOP-ами из других DD. Последнее, но иными словами: эффективная скорость декодирования потока DD — 1.5 х86-инструкции в такт, соответствующая скорости выдачи 3 mOP-а в такт, то есть полностью заполненной «line». Замечательно! Среди DD-инструкций мы видим такие часто встречающиеся, как, к примеру, POP reg, RET, умножение (некоторые формы), а также packed-SSE2- и packed-SSE-инструкции. Отметим, что таким образом, K8 имеет существенные преимущества перед К7 при выполнении 128-разрядных SIMD-инструкций.
Теперь — изменения количественные. Скорость загрузки кода, находящегося в L2, но не в L1 I-Cache, заметна подросла — в К8 она увеличилась практически на две трети. Причины: как расширение интерфейса L2 — L1, так и появившаяся возможность сохранения битов предекодирования в L2.
И, наконец, скорость обработки последовательности DirectPath-инструкций. Алгоритм выравнивания инструкций, применявшийся в К7, не всегда обеспечивал 100%-ю эффективность (хотя, надо сказать, эффективность была достаточно высокой, в среднем выше 80-90%). Теперь, в К8, ситуация существенно изменилась. Из результатов тестов, проведенных, опять же, ixbt.com, видно, что для всех не слишком длинных инструкций (5 байт и менее) темп оказывается предельным. Для многих комбинаций из инструкций большего размера эффективность также 100%. В некоторых случаях, правда, стало немного хуже на длинных инструкциях. Но главное, что среднее число mOP-ов за такт заметно подросло! Браво инженерам AMD! И очень жаль, что все это пришлось выяснять в ходе многочисленных синтетических тестов, а не читать в документации — право, подобными достижениями можно и нужно гордиться!
Осталось добавить, что в декодере добавились этапы «переупаковки» и совместного анализа нескольких инструкций (Inter-instruction decoding). Эти этапы отвечают за переназначение потоков (lanes), в которых выполняются MOP-ы, с целью оптимизации использования функциональных устройств. Теперь за счет разнесения MOP-ов, не зависящих друг от друга, по разным потокам, удается повысить «КПД» использования исполнительных устройств. Также на этих этапах проводятся некоторые мелкие преобразования групп зависимых MOP-ов для уменьшения задержек при совместных обращениях к регистрам и к стеку.
Пресловутая "гонка гигагерц" утомила, похоже, даже ее непосредственных участников - разработчиков центральных процессоров, корпорации Intel и AMD. Постоянное увеличение тактовой частоты привело к тому, что обе компании неожиданно оказались в заложниках этой "гонки": не выпускать новые процессоры нельзя, но и продолжать увеличение тактовой частоты прежними темпами неэффективно с маркетинговой точки зрения и тяжело с технологической.
Не секрет, что подавляющему большинству бизнес приложений сегодня для комфортной работы достаточно процессора среднего уровня. Процессоры стоимостью около $100 в целом справляются с офисными и мультимедийными задачами, их производительности хватает и для игр. Разумеется, остаются еще вычислительные задачи, обработка графики, видео, звука - словом, те приложения, которым всегда необходима максимальная производительность центрального процессора. Остаются так называемые "хардкоровые" геймеры, энтузиасты... Но не они формируют спрос и не они являются ключевыми потребителями.
Отсутствие финишной прямой в "гонке гигагерц" понимают, похоже, и разработчики. Недаром же и AMD, и Intel отказались от использования тактовой частоты для маркировки процессоров. Видимо, даже в маркетинговых отделах наконец поняли, что для привлечения внимания рынка одной лишь частоты мало - необходимы качественные новшества.
64 разряда - новый вектор развития
И новшества были предложены. В 2003 году корпорация AMD выпустила Athlon 64 и Athlon 64 FX - первые настольные 64-разрядные процессоры, совместимые с архитектурой x86. Можно долго дискутировать - и мы еще этим займемся - о востребованности и целесообразности перехода на 64-разрядную среду в настольных системах. Однако факт остается фактом - предложив в сентябре 2003 года Athlon 64 и Athlon 64 FX, AMD сумела найти качественное отличие от продуктов других разработчиков процессоров. AMD удалось не только создать дополнительное конкурентное преимущество, но и добиться увеличения производительности системы без увеличения тактовой частоты.