Задержка инструкций процессора на процессорах x86 и x64

14

Я ищу какую-то таблицу или что-то подобное, что может помочь мне рассчитать эффективность кода сборки.

Как я знаю, сдвиг бит занимает 1 такт процессора, но я действительно смотрю, сколько нужно сложения (вычитание должно быть одинаковым), умножения и как предположительно рассчитать время деления, если я знаю значения, которые делятся.

Мне действительно нужна информация о целочисленных значениях, но приветствуется также время выполнения с плавающей запятой.

ST3
источник
То же самое возможно на SO: stackoverflow.com/questions/692718/…
Ciro Santilli 法轮功 病毒 审查 六四 事件 法轮功

Ответы:

10

В общем, каждая из этих операций также выполняет один тактовый цикл, если аргументы находятся в регистрах на различных этапах конвейера.

Что вы подразумеваете под латентностью? Сколько циклов проводит операция в АЛУ?

Вы можете найти эту таблицу полезной: http://www.agner.org/optimize/instruction_tables.pdf

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

Многие инструкции x86 могут проходить несколько циклов, если они сложны (например, команды REP или MWAIT хуже).

Джон Брауэр
источник
3
Умножение целых чисел составляет не менее 3 с задержки на всех последних процессорах x86 (и выше на некоторых старых процессорах). На многих процессорах он полностью конвейеризован, поэтому пропускная способность равна 1 за такт, но этого можно достичь только при наличии трех независимых умножений в полете. (Умножение FP на Haswell составляет 5 с задержкой, 0,5 с пропускной способностью, поэтому вам нужно 10 в полете для насыщения пропускной способности). Деление ( divи idiv) еще хуже: оно микрокодируется и имеет гораздо большую задержку, чем addили shr, и даже не полностью конвейеризовано на любом процессоре. Все это прямо из таблиц инструкций Агнера Фога, так что хорошо, что вы связали это.
Питер Кордес
7

Вычисление эффективности кода сборки - не лучший путь в наши дни для конвейеров Super Scalar. Это будет зависеть от типа процессора. Это зависит от инструкций как до, так и после (вы можете добавить дополнительный код и иногда запускать его быстрее!). Некоторые операции (особенно деление) могут иметь диапазон времени выполнения даже на более старых и более предсказуемых чипах. На самом деле синхронизация большого количества итераций - единственный путь.

Брайан Кноблаух
источник
Я знаю это, но мне это нужно не в реальном проекте, а в одном забавном проекте программирования.
ST3
Нужно ли вам это для реального или для удовольствия, не меняет ответ для этой линии процессора. Вы рассматривали возможность перехода на более детерминированный процессор, такой как чип Propeller?
Брайан Кноблаух
3
Даже со скаляром неправильные прогнозы веток реализации и ошибки в кеше могут привести к изменению времени выполнения.
Пол А. Клейтон,
Для чисто связанных с процессором вещей (без ошибок кэша, без ошибок ветвления) поведение процессора понимается достаточно подробно, так что статический анализ часто может почти точно предсказать, сколько циклов за итерацию цикл займет на конкретном процессоре (например, Intel Haswell). например, посмотрите этот SO-ответ, где, глядя на сгенерированный компилятором asm, позвольте мне объяснить, почему версия с разветвлением работала почти точно в 1,5 раза быстрее, чем версия CMOV на процессоре Sandybridge OP, но гораздо ближе на моем Skylake.
Питер Кордес
Если вы пишете asm вручную по соображениям производительности, то на самом деле полезно искать узкие места задержки и пропускной способности на процессорах Intel и AMD. Хотя это сложно, и иногда то, что оптимально для AMD, не то, что оптимально для Intel.
Питер Кордес
4

Вы можете найти информацию о процессоре Intel в руководствах для разработчиков программного обеспечения Intel . Например, задержка составляет 1 цикл для сложения целых чисел и 3 цикла для умножения целых чисел.

Я не знаю о умножении, но я ожидаю, что сложение всегда займет один цикл.

UmNyobe
источник
Один цикл, за исключением случаев, когда он «свободен» (параллельно, когда конвейеры выстроены правильно) или занимает больше времени из-за отсутствия кэша. :-)
Брайан Кноблаух
2
В настоящее время (2018 г.) эта информация доступна в Приложении C под названием «Задержка и пропускная способность инструкций» документа 248966 «Справочное руководство по оптимизации архитектур Intel® 64 и IA-32», также доступного на странице, указанной в ответе
stefanct