2015-03-31 1 views
1

Процессор x86 (64 тоже) оптимизирует процесс умножения, если один из операндов умножения составляет 1.0?Умножается на 1,0 меньше времени, чем обычные умножения

PS: Я не имею в виду компилятор, оптимизирующий постоянное умножение 1.0.

+0

Есть много x86. В общем случае время умножения может зависеть от операндов на некоторых ЦП. –

ответ

2

Это не то, что я видел в документах о латентности команд или микроархитектурах процессоров Intel или AMD.

Я подозреваю, что этого не происходит, поскольку переменная задержка будет мешать конвейерным исполнительным устройствам. (несколько результатов, выходящих из одного и того же исполнительного блока в том же такте = дополнительная сложность). Кроме того, есть, вероятно, другие биты логики (планирование/очередность uop, сети пересылки результатов), которые разрабатываются вокруг каждого uop, имеющего известную задержку. (за исключением особых случаев, таких как деление/sqrt).

IIRC, один аналитик, возможно, Agner Fog или David Kanter, предположил, что некоторые устройства могли быть реализованы с задержкой в ​​2 цикла, но вместо этого выполняют 3 цикла, чтобы соответствовать другим ударам, которые может обрабатывать их порт выполнения. Поэтому постоянная латентность для операций, по-видимому, является большой проблемой для конструкций процессоров Intel, в той мере, в какой это стоило сделать операцию медленнее.

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

Процессоры Haswell могут поддерживать пропускную способность двух умножителей FP-векторов за такт. (256b векторов 4 двухместных или 8 поплавков). Latency = 5 тактов, чтобы результат был готов, независимо от ввода. Или 1 вектор целое умножить за такт. (Векторное умножение ALU находится на порте 0. Множители вектора FP находятся на порту 0 и порту 1).

Избегайте умножения, когда можете, это приводит к длительным цепям зависимостей. (Обычно это вычисляется для целочисленных умножений для вычисления индексов цикла. Компиляторы делают намного лучше, когда вы пишете свой цикл, чтобы увеличить счетчик на 16 вместо того, чтобы умножать i++ на 16 в качестве индекса массива.)