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