Рассмотрим декодер Витерби на аддитивной модели. Он тратит свое время на дополнения и сравнения. Теперь рассмотрим два: один с C / C ++ float
в качестве типа данных, а другой с int
. Ожидаете ли вы, что на современных микросхемах int
будет работать значительно быстрее, чем float
? Или чудеса конвейерной обработки (и отсутствие умножения и деления) уравняют все?
Сравнение производительности с плавающей и целочисленной арифметикой на современных микросхемах
Ответы (1)
Зависит от того, что вы имеете в виду под словом значительно. Обычно я ожидаю, что ints будут работать примерно в 2 раза быстрее, но все зависит от того, что еще происходит. Современные процессоры, которые могут обрабатывать набор инструкций AMD64 (AMD / Core2), обычно могут эффективно выполнять 1 операцию с плавающей запятой за цикл , если они могут поддерживать конвейерную подачу
Также они обычно могут выполнять 2 или 3 целочисленных операции за одно и то же время. и даже может делать и то, и другое одновременно.
Но написать код, который останавливает конвейер, не так уж и сложно, вы должны избегать использования результата вычисления сразу после его завершения, иначе конвейер остановится, и вы получите больше, чем 3 цикла на умножение, а не 1.
Инструкции на цикл для PowerPC в большинстве случаев такие же или лучше, чем у AMD / Intel.
Дополнение:
Кстати, вы можете обнаружить, что сравнения (или, скорее, ветви, которые подразумевают сравнения) в конечном итоге обходятся намного дороже, чем добавления. неверно предсказанные ответвления обходятся дорого, особенно на процессоре Pentium 4.
SETcc
, а не инструкций Jcc
, и в этом случае ветвление не выполняется, и вы не получаете штраф за неправильное предсказание ветвления.
- person Chris Jester-Young; 09.01.2010