Современные процессоры пропускают умножения на ноль?

cpu instructions multiplying

655 просмотра

3 ответа

35 Репутация автора

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

Автор: user1214927 Источник Размещён: 17.02.2012 05:20

Ответы (3)


-2 плюса

125826 Репутация автора

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

Автор: Puppy Размещён: 17.02.2012 05:22

8 плюса

34922 Репутация автора

  1. Современные процессоры - что вы подразумеваете под этим? Вы имеете в виду наиболее часто используемые (например, x86, AMD64, ARM) или недавно разработанные. Каждая архитектура процессора имеет свои собственные свойства. Более того, каждая компания (например, Intel или AMD) может создавать процессоры по-своему (что обычно является секретом компании).

  2. Когда ты задаешь вопрос, я сомневаюсь в этом. Вы знаете, даже проверка, равно ли число нулю дважды, до КАЖДОГО умножения - это слишком много накладных расходов, если учесть, как на самом деле оптимизируется низкий процент операций умножения.

  3. Подобная оптимизация сделает процессор более дорогим.

Скажем, в средней программе 1% умножений на ноль (и, вероятно, намного ниже). Это означало бы, что сравнение с нулем должно быть в 200 раз быстрее, чем умножение, чтобы просто учитывать накладные расходы (и гораздо больше, чтобы это было полезно на практике).

Я думаю, что вы слишком много смотрите на этот вопрос с человеческой точки зрения. Когда вы умножаете, вы ясно видите, что один из множителей равен нулю, и делаете вывод. Но, однако, с компьютерами все по-другому. Компьютер на самом деле должен проверить все 64 или 32 бита, чтобы убедиться, что что-то равно нулю.

  1. Я бы не волновался на твоем месте. Производители процессоров и составители компиляторов делают все возможное, чтобы максимизировать производительность. У них есть литературная мысль обо всем.
Автор: Rok Kralj Размещён: 17.02.2012 05:32

1 плюс

402480 Репутация автора

Это широко варьируется в зависимости от процессора и (в некоторых случаях) типа (ов) операндов.

Старые / более простые процессоры обычно используют алгоритм умножения примерно так:

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 итераций.

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

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

Автор: Jerry Coffin Размещён: 10.01.2014 06:58
Вопросы из категории :
32x32