Является ли использование double быстрее, чем float?

Двойные значения сохраняют более высокую точность и вдвое больше размера поплавка, но оптимизированы ли процессоры Intel для плавающих?

То есть, двойные операции так же быстро или быстрее, чем операции float для +, -, * и /?

Изменяется ли ответ на 64-битные архитектуры?

Ответ 1

Существует не один "процессор Intel", особенно с точки зрения того, какие операции оптимизированы в отношении других!, но большинство из них на уровне CPU (в частности, в FPU) таковы, что ответ на ваш вопрос:

- двойные операции так же быстро или быстрее, чем операции float для +, -, * и /?

"yes" - внутри CPU. Однако при удвоении объема памяти для каждого номера явно подразумевается более тяжелая нагрузка на кеш и больше пропускной способности памяти для заполнения и разлива этих строк кэша из/в ОЗУ; время, когда вы заботитесь о производительности операции с плавающей запятой, - это когда вы выполняете много таких операций, поэтому соображения памяти и кеша имеют решающее значение.

@Ответ Richard указывает, что есть также другие способы выполнения операций FP (инструкции

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

Ответ 2

Если все вычисления с плавающей запятой выполняются внутри FPU, то нет, нет никакой разницы между вычислением double и вычислением float, поскольку операции с плавающей запятой фактически выполняются с 80 бит точности в Стек FPU. Записи стека FPU округляются в соответствии с необходимостью преобразования 80-битного формата с плавающей запятой в формат с плавающей запятой double или float. Перемещение sizeof(double) байт в/из ОЗУ по сравнению с sizeof(float) байтами - единственное различие в скорости.

Если, однако, у вас есть векторизованное вычисление, вы можете использовать расширения SSE для выполнения четырех вычислений float в то же время, что и два вычисления double. Поэтому умное использование инструкций SSE и регистров XMM может позволить более высокую пропускную способность при расчетах, которые используют только float s.

Ответ 3

Я просто хочу добавить к уже существующим замечательным ответам, что семейство __m256? с одинаковыми инструкциями-множественными данными (SIMD) Внутренние функции С++ работают параллельно с 4 double (например, _mm256_add_pd) или 8 float (например, _mm256_add_ps).

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

Ответ 4

В экспериментах с добавлением 3,3 для 2000000000 раз результаты:

Summation time in s: 2.82 summed value: 6.71089e+07 // float
Summation time in s: 2.78585 summed value: 6.6e+09 // double
Summation time in s: 2.76812 summed value: 6.6e+09 // long double

Так что double быстрее и по умолчанию в C и С++. Он более переносимый и по умолчанию используется во всех библиотечных функциях C и С++. Alos double имеет значительно более высокую точность, чем плавающий.

Даже Stroustrup рекомендует двойной поплавок:

"Точный смысл одно-, двух- и расширенной точности определяется реализацией. Выбор правильной точности для проблемы, где выбор имеет значение, требует значительного понимания вычисления с плавающей запятой. Если у вас нет этого понимая, получайте советы, найдите время, чтобы учиться, или используйте двойной и надейтесь на лучшее".

Возможно, единственный случай, когда вы должны использовать float вместо double, - это 64-битное аппаратное обеспечение с современным gcc. Поскольку float меньше; double - 8 байтов, а float - 4 байта.

Ответ 5

Еще один момент, который следует учитывать, - это использование графического адаптера (GPU). Я работаю с проектом, который численно интенсивен, но нам не требуется выбор, который предлагает двойной вариант. Мы используем карты GPU, чтобы ускорить обработку. Для графического процессора CUDA нужен специальный пакет для поддержки double, а объем локальной RAM на графическом процессоре довольно быстр, но довольно скуден. В результате использование float также удваивает объем данных, которые мы можем хранить на

Еще один момент - память. Поплавки занимают вдвое меньше, чем у ОЗУ. Если вы имеете дело с ОЧЕНЬ большими наборами данных, это может быть очень важным фактором. Если вы используете двойные средства, вам нужно кэшировать диск против чистого бара, ваша разница будет огромной.

Итак, для приложения, с которым я работаю, разница очень важна.

Ответ 6

Единственный действительно полезный ответ: только вы можете сказать. Вам нужно сравнить ваши сценарии. Небольшие изменения в шаблонах команд и памяти могут оказать значительное влияние.

Это будет иметь значение, если вы используете аппаратное обеспечение FPU или SSE (прежний выполняет всю свою работу с расширенной точностью 80, поэтому двойной будет ближе, а позже 32-разрядный, т.е. плавающий).

Обновление: s/MMX/SSE/как указано в другом ответе.

Ответ 7

Плавающая точка обычно является расширением одного ЦП общего назначения. Поэтому скорость будет зависеть от используемой аппаратной платформы. Если платформа поддерживает с плавающей запятой, я буду удивлена, если есть какая-то разница.