Я хотел бы знать, не может ли текущий процессор избежать умножения двух чисел, когда хотя бы один из них равен нулю. СпасибоНеужели современные процессоры пропускают умножения на ноль?
ответ
Я бы ожидал, что у этого современного процессора будет такая вещь.
Современные процессоры - что вы подразумеваете под этим? Вы имеете в виду наиболее часто используемые (например, x86, AMD64, ARM) или совсем недавно разработанные. Каждая архитектура процессора имеет свои собственные свойства. Более того, каждая компания (например, Intel или AMD) может делать процессор по-другому (обычно это секрет компании).
Как вы сомневаетесь, я сомневаюсь в этом. Вы знаете, даже проверяя, равен ли число равным нулю два раза, прежде чем КАЖДОЕ умножение будет слишком накладным, если вы учтете, насколько оптимизирован низкий процент операций умножения.
Оптимизация, как это сделало бы CPU более дорогостоящим.
Предположим, что есть 1% умножений на ноль (и, вероятно, намного ниже) в средней программе. Это означало бы, что сравнение с нолем должно было бы в 200 раз быстрее, чем умножение на просто учетная запись для накладных расходов (и многое другое, чтобы это было полезно на практике).
Я думаю, что вы слишком много смотрите на этот вопрос с точки зрения человека. Когда вы умножаетесь, вы ясно видите, что одна из множителей равна нулю и заканчивается. Но, однако, с компьютерами все очень отличается. Фактически компьютер должен проверить все 64 или 32 бита, чтобы убедиться, что что-то равно нулю.
- Я бы не стал беспокоиться, был ли я вами. Производители процессоров и составители компиляторов делают все возможное, чтобы максимизировать производительность. У них есть литературная мысль обо всем.
Согласен, умножение происходит быстро. Похоже на чрезмерную оптимизацию, чтобы проверить каждое значение перед рукой. Я бы поспорил, что процессор просто выполняет операцию. –
Несомненно. :) Я думаю, что мой ответ охватывает это. Особенно последний абзац. –
Вы забыли, насколько быстрее это может быть сделано в аппаратном обеспечении. – Puppy
Это сильно варьируется в зависимости от процессора и (в некоторых случаях) типа (ов) операндов.
Старые/простые процессоры обычно используют алгоритм умножения что-то вроде этого:
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 итераций.
Новейший высокопроизводительный процессор, как правило, работает как минимум с двумя битами за раз, и, возможно, даже больше. Вместо отдельного аппаратного обеспечения, выполняющего несколько итераций, он обычно связывает операцию с отдельным (хотя и по существу идентичным) оборудованием для каждого этапа умножения (хотя они обычно не отображаются как отдельные этапы на нормальной диаграмме трубопровода для процессора).
Это означает, что выполнение будет иметь одинаковую задержку (и пропускную способность) независимо от операндов.В среднем это немного улучшает латентность и пропускную способность, но приводит к каждой операции, происходящей с одинаковой скоростью, независимо от операндов.
- 1. Theano умножения на ноль
- 2. Оптимизация умножения на ноль
- 3. Программные точки останова и современные процессоры ООО®
- 4. Почему современные процессоры не чередуют кеши?
- 5. Являются ли современные графические процессоры основанными на RISC или CISC?
- 6. Действительно ли процессоры вычисляют умножение на ноль или один? Зачем?
- 7. Неужели современные браузеры все еще ограничивают параллельные загрузки?
- 8. Почему моя операция умножения возвращает ноль?
- 9. Предупреждение: Деление на ноль с PHP умножения строки кода
- 10. Современные проекты на C++
- 11. Командиры Grails пропускают на netbeans?
- 12. Современные Breakpoints
- 13. обязательные поля пропускают реакции на пользовательский ввод
- 14. Токены пропускают пробелы?
- 15. Несущие динамические хосты пропускают
- 16. Неужели современные маршрутизаторы/сетевые устройства/интернет-провайдеры предотвращают подделку IP-заголовков?
- 17. Пропускает ли Java VM умножение на ноль?
- 18. Многопоточность - многоядерные процессоры действительно выполняют параллельную обработку?
- 19. Ошибка умножения PHP-умножения
- 20. Бутстрапные столбцы пропускают два места
- 21. Highcharts пропускают столбцы при построении
- 22. Как сделать графические процессоры непрямыми ветвями
- 23. Могут ли процессоры архитектуры RISC превосходить процессоры CISC в будущем
- 24. pandas заказывающие столбцы пропускают значения
- 25. Переучивать современные ресурсы C++?
- 26. Современные, нетривиальные, Pygame Tutorials?
- 27. Таблица умножения на петлю
- 28. Значения умножения на умножение
- 29. . NET: Современные связки C++?
- 30. C++ современные указатели строк
Как бы он «пропустил» умножение? Если в результате он дает 0, независимо от того, насколько быстро он это делает, он фактически произвел умножение. –