Задержка инструкций процессора на процессорах x86 и x64
Я ищу какую-то таблицу или что-то подобное, что может помочь мне рассчитать эффективность кода сборки.
Как я знаю, для сдвига битов требуется 1 такт процессора, но я действительно смотрю, сколько нужно сложения (вычитание должно занимать то же самое), умножения и как предположительно рассчитать время деления, если я знаю значения, которые делятся.
Мне действительно нужна информация о целочисленных значениях, но приветствуется также время выполнения с плавающей запятой.
3 ответа
В общем, каждая из этих операций также выполняет один тактовый цикл, если аргументы находятся в регистрах на различных этапах конвейера.
Что вы подразумеваете под латентностью? Сколько циклов проводит операция в АЛУ?
Эта таблица может оказаться полезной: http://www.agner.org/optimize/instruction_tables.pdf
Поскольку современные процессоры являются суперскалярными и могут выполняться не по порядку, часто можно получить общее количество команд за цикл, превышающее 1. Аргументы для макрокоманды являются наиболее важными, но операция также имеет значение, поскольку деление занимает больше времени, чем XOR (<1 задержка цикла).
Многие инструкции x86 могут проходить несколько циклов, чтобы пройти некоторые этапы, если они сложные (например, команды REP или MWAIT хуже).
Вычисление эффективности кода сборки - не лучший путь в наши дни для конвейеров Super Scalar. Это будет зависеть от типа процессора. Это будет зависеть от инструкций как до, так и после (вы можете добавить дополнительный код и иногда запускать его быстрее!). Некоторые операции (в частности, деление) могут иметь диапазон времени выполнения даже на более старых и более предсказуемых чипах. На самом деле синхронизация большого количества итераций - единственный путь.
Вы можете найти информацию о процессоре Intel в руководствах для разработчиков программного обеспечения Intel. Например, задержка составляет 1 цикл для сложения целых чисел и 3 цикла для умножения целых чисел.
Я не знаю о умножении, но я ожидаю, что сложение всегда займет один цикл.