У меня есть система цифровой обработки сигналов, которая работает на быстром компьютере x86 с использованием чисел с плавающей запятой двойной точности . Мне пришло в голову, что я на самом деле не использую огромный динамический диапазон представления с плавающей запятой - все величины легко помещаются в диапазоне ± 32768.
Мой вопрос: возможно ли, что переключение на вычисления с фиксированной запятой даст преимущество в числовой точности (высокий приоритет) или времени вычислений (низкий приоритет)?
Конечно, ответ зависит от того, сколько бит доступно для вычисления с фиксированной запятой. Сколько бит точности используют типичные системы с фиксированной запятой? Можно ли эффективно выполнять вычисления с фиксированной запятой, скажем, с 64 битами ( 16-битная целая часть, 48-битная дробная часть ) на x86-64?
Я всегда думал, что вычисления с фиксированной точкой используются только в ситуациях, когда мощность процессора ограничена - имеет ли смысл использовать вычисления с фиксированной точкой, когда мощность процессора не имеет значения?
источник
Ответы:
Числовая точность целых чисел будет лучше, чем числовая точность чисел с плавающей запятой, если целочисленное разрешение лучше. Двойные числа имеют 52 дробных бита, поэтому с плавающей точкой двойной точности разрешение хуже, чем у целых чисел, около , что намного больше, чем 32768 ( 2 15 ). Итак, нет, точность чисел не будет лучше, если вы перейдете к целым числам.252 215
Вторая проблема - скорость. Ответ: это зависит от оборудования. Если вы запускаете свою программу на цифровом сигнальном процессоре, который имеет несколько ядер с фиксированной точкой, умножающих / накапливающих, то да, в фиксированной точке это будет намного быстрее. С другой стороны, на чипе x86 в фиксированной точке он, вероятно, будет медленнее . Я однажды сделал именно то, о чем вы говорите, и увеличил время выполнения.
После некоторых поисков в Интернете я обнаружил, что это часто встречается. Причина в том, что у него есть специальный процессор с плавающей точкой, который ничего не делает при переходе к фиксированной точке, в то время как аппаратное обеспечение с фиксированной точкой используется совместно с обычным действием с фиксированной точкой, таким как арифметика указателя.
Если вы хотите ускорить обработку, способ сделать это - перейти от поплавков двойной точности к поплавкам одинарной точности. Это должно привести к значительному увеличению скорости. Это, конечно, уменьшит вашу числовую точность.
источник
Преимущества с фиксированной запятой в основном заключаются в энергопотреблении (например, когда у вас есть выбор аппаратного обеспечения процессора, или процессор хорош в отключении неиспользуемых функциональных блоков). Это связано с тем, что блоки с фиксированной запятой обычно меньше (меньше транзисторов, более короткие провода, меньшая емкость, которую необходимо преодолеть на один MAC) для данной технологии и скорости выполнения операций, чем с плавающей запятой.
Однако огромное количество распространенных современных процессоров (серверных, ПК и даже мобильных) имеют больше и более быстрые FPU (особенно блоки FP одинарной точности), чем целочисленные множители, и большая часть мощности системы не от использования FPU, поэтому использование фиксированного -point будет иметь небольшие преимущества или вообще не иметь преимуществ для типичных вычислений DSP на этих продуктах и, вероятно, может быть недостатком с точки зрения чистой производительности. Используя современные технологии, любое преимущество с фиксированной точкой будет в основном накапливаться в крошечных встроенных продуктах, таких как устройства размером с кнопку.
Однако также учтите следы памяти и кэш-памяти процессора. Умное использование меньших типов данных (short int и float) для полного размещения больших вычислений в кеше данных может свести на нет любые преимущества чистой полосы пропускания FPU.
источник
Предпочитайте с плавающей запятой одинарной точности удвоение - это уменьшит вдвое пропускную способность памяти, площадь кэш-памяти и требования к памяти, а также ускорит выполнение некоторых математических операций Это также открывает возможность 4-сторонней SIMD, если необходима дальнейшая оптимизация.
Фиксированная точка имеет смысл только тогда, когда у вас нет FPU - большинство современных процессоров x86 имеют два FPU, поэтому при использовании фиксированной точки ничего не получится, а производительность с фиксированной точкой может даже значительно ухудшиться. (Обратите внимание также, что для фиксированной точки требуются дополнительные инструкции по сравнению с плавающей точкой для таких операций, как умножение.)
источник
В дополнение к очень хорошим ответам, приведенным здесь, стоит добавить несколько вещей:
источник
Некоторые моменты для рассмотрения:
В качестве последнего слова, я думаю, что наши данные в реальном мире ценны, и слепое сжатие чисел компьютера - скромная черствая работа. Компьютер должен быть установлен, чтобы выполнять тяжелую работу для ваших данных и для вас, и не должен восприниматься как настоящая звезда шоу.
источник