Числа с плавающей запятой одинарной точности занимают половину памяти, и на современных машинах (кажется, даже на графических процессорах) операции могут выполняться с ними почти вдвое быстрее, чем с двойной точностью. Многие коды FDTD, которые я обнаружил, используют исключительно арифметику одинарной точности и хранение. Существует ли эмпирическое правило, когда допустимо использовать одинарную точность для решения крупномасштабных разреженных систем уравнений? Я предполагаю, что это должно сильно зависеть от числа условий матрицы.
Кроме того, есть ли эффективный метод, который использует двойную точность, где это необходимо, и единственную, где точность двойной не требуется. Например, я думаю, что для умножения матрицы на вектор или произведения векторной точки, было бы неплохо накапливать результаты в переменной двойной точности (чтобы избежать ошибки отмены), но отдельные записи должны быть умножены друг на друга можно умножить с использованием одинарной точности.
Допускают ли современные FPU преобразование с одинарной (плавающей) в двойную (двойной) и наоборот? Или это дорогостоящие операции?
источник
Хорошая статья на эту тему - Ускорение научных вычислений с помощью алгоритмов смешанной точности .
источник
Я бы посоветовал сосредоточиться в основном на потреблении памяти для принятия решения, когда использовать одинарную точность (float). Таким образом, объемные данные для вычисления FDTD должны использовать float, но я бы сохранил само описание проблемы (например, геометрию, параметры материала, условия возбуждения) и все связанные метаданные в двойном виде.
Я бы оставил все показатели некритичными и не глубоко проанализированными вычислениями в двойном размере. В частности, я хотел бы сохранить многоугольные данные и другое описание геометрии в двойном (возможно, даже целочисленном, если это возможно), поскольку опыт подсказывает, что вы никогда не получите вычислительные геометрические части вашего кода полностью надежными, даже если это будет возможно в теории.
Третья часть, которую я хотел бы упомянуть, - это аналитические вычисления, в том числе ярлыки с использованием несимметричных разложений по собственным значениям. В качестве примера, у меня есть кусочно определенные вращательные симметричные 2D-функции, и мне нужно его преобразование Фурье. Существуют различные численные способы с использованием БПФ и соответствующих «аналитических фильтров нижних частот», чтобы получить его «эффективно». Поскольку производительность не критична, вместо этого я использовал «точное» аналитическое выражение, включающее функции Бесселя. Поскольку это был быстрый путь, и я не буду тратить время на анализ распространения ошибок в моей сложной формуле, я лучше использую двойную точность для этих вычислений. (До сих пор оказалось, что только некоторые аналитические эквивалентные выражения для формулы можно было использовать,
источник