Одинарная или двойная точность с плавающей точкой

13

Числа с плавающей запятой одинарной точности занимают половину памяти, и на современных машинах (кажется, даже на графических процессорах) операции могут выполняться с ними почти вдвое быстрее, чем с двойной точностью. Многие коды FDTD, которые я обнаружил, используют исключительно арифметику одинарной точности и хранение. Существует ли эмпирическое правило, когда допустимо использовать одинарную точность для решения крупномасштабных разреженных систем уравнений? Я предполагаю, что это должно сильно зависеть от числа условий матрицы.

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

Допускают ли современные FPU преобразование с одинарной (плавающей) в двойную (двойной) и наоборот? Или это дорогостоящие операции?

КОСТИС
источник

Ответы:

7

Для всех нетривиальных задач (т. Е. Для тех, где производительность имеет значение) почти вся память, которую вы имеете, будет в матрице, и относительно мало в векторах. Например, для элементов 3d Тейлора-Гуда для уравнения Стокса у вас есть несколько сотен элементов в строке в матрице, и это значительно превышает объем памяти, необходимый для векторов. Таким образом, мы играли с идеей сохранения матрицы в виде чисел с плавающей запятой и векторов в виде двойных. Я не помню наших результатов по срокам, но я точно знаю, что мы не видели никаких проблем с округлением и т. Д. Так что этот подход определенно работает.

Вольфганг Бангерт
источник
Спасибо, профессор Бангерт. Как насчет итерационных матричных решателей? Вы увеличиваете до двойной точности для матрично-векторных произведений или уменьшаете векторные элементы до одинарных для умножений и до двойных для накопления?
Костис
Я, конечно, говорил об итерационных решателях. Мы делаем все векторы с двойной точностью (потому что это не имеет значения), поэтому операция dst = matrix src выполняется как double = float double. Затем накопление происходит с двойной точностью, но я бы очень удивился, если это вообще имело значение.
Вольфганг Бангерт
Где-то есть бумага (возможно, 2 десятилетия назад), указывающая, что точечные продукты должны быть сделаны с двойной точностью. У меня нет справки, но я посмотрю, смогу ли я найти ее позже.
Билл Барт
Да, меня это не удивит. Это также соответствует тому, что мы делаем.
Вольфганг Бангерт
Вы используете четкую четкость для точечных продуктов? Если так, круто! Я не слышал, чтобы кто-то делал это в библиотеке.
Билл Барт
3

Я бы посоветовал сосредоточиться в основном на потреблении памяти для принятия решения, когда использовать одинарную точность (float). Таким образом, объемные данные для вычисления FDTD должны использовать float, но я бы сохранил само описание проблемы (например, геометрию, параметры материала, условия возбуждения) и все связанные метаданные в двойном виде.

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

Третья часть, которую я хотел бы упомянуть, - это аналитические вычисления, в том числе ярлыки с использованием несимметричных разложений по собственным значениям. В качестве примера, у меня есть кусочно определенные вращательные симметричные 2D-функции, и мне нужно его преобразование Фурье. Существуют различные численные способы с использованием БПФ и соответствующих «аналитических фильтров нижних частот», чтобы получить его «эффективно». Поскольку производительность не критична, вместо этого я использовал «точное» аналитическое выражение, включающее функции Бесселя. Поскольку это был быстрый путь, и я не буду тратить время на анализ распространения ошибок в моей сложной формуле, я лучше использую двойную точность для этих вычислений. (До сих пор оказалось, что только некоторые аналитические эквивалентные выражения для формулы можно было использовать,

Томас Климпел
источник