Я хотел бы знать, избегает ли текущий процессор умножения двух чисел, когда хотя бы одно из них равно нулю. Спасибо
Пропускают ли современные процессоры умножение на ноль?
Ответы (2)
Это сильно зависит от ЦП и (в некоторых случаях) типа (ов) операндов.
Старые/более простые процессоры обычно используют примерно такой алгоритм умножения:
integer operator*(integer const &other) {
unsigned temp1 = other.value;
unsigned temp2 = value;
unsigned answer = 0;
while (temp1 != 0) {
if (temp1 & 1)
answer += temp2;
temp2 <<= 1;
temp1 >>=1;
}
return integer(answer);
}
Поскольку цикл выполняется только тогда/если temp1 != 0
, цикл, очевидно, не будет выполняться, если temp1
начинается с 0 (но, как написано здесь, не будет предприниматься никаких попыток оптимизации для другого операнда, равного 0).
Это, однако, принципиально алгоритм по одному биту за раз. Например, при умножении 32-битных операндов, если вероятность установки каждого бита составляет 50:50, мы ожидаем в среднем примерно 16 итераций.
Более новый высокопроизводительный ЦП обычно будет работать как минимум с двумя битами за раз, а возможно, даже с большим количеством битов. Вместо одной аппаратной части, выполняющей несколько итераций, он обычно выполняет конвейерную операцию с отдельным (хотя по существу идентичным) аппаратным обеспечением для каждого этапа умножения (хотя обычно они не отображаются как отдельные этапы на обычной конвейерной диаграмме). для процессора).
Это означает, что выполнение будет иметь одинаковую задержку (и пропускную способность) независимо от операндов. В среднем это немного улучшает задержку и значительно увеличивает пропускную способность, но приводит к тому, что каждая операция выполняется с одинаковой скоростью, независимо от операндов.
Я ожидаю, что современный настольный процессор будет иметь такую вещь.