Одинарна проти подвійна точність з плаваючою комою


13

Одноточні цифри з плаваючою комою займають половину пам’яті, а на сучасних машинах (навіть на GPU, здається) операції з ними можна робити майже вдвічі швидше порівняно з подвійною точністю. У багатьох кодах FDTD, які я знайшов, використовується виключно арифметика одноточної точності та зберігання. Чи існує правило, коли прийнятно використовувати єдину точність для вирішення масштабних розріджених систем рівнянь? Я припускаю, що він повинен сильно залежати від числа умови матриці.

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

Чи дозволяють сучасні ФПУ безперешкодно перетворювати з одноточної (поплавкової) на подвійну точну (подвійну) і навпаки? Або це дорогі операції?

Відповіді:


7

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


Дякую, професор Бангерт. А як щодо ітеративних розв'язувачів матриць? Чи масштабуєте ви до подвійної точності для матричних векторних продуктів чи масштабуєте векторні елементи до одиничного для множення та резервного копіювання до подвійного для накопичення?
Costis

Я, звичайно, говорив про ітераційні рішення. Ми робимо всі вектори в подвійній точності (тому що це не має значення), тому операція srst dst = matrix src відбувається як double = float double. Потім накопичення відбувається в подвійній точності, але я насправді був би дуже здивований, якби воно взагалі мало значення.
Вольфганг Бангерт

Десь там є папір (можливо, через 2 десятиліття тому), що вказує на те, що крапкові вироби повинні бути зроблені вище, ніж у подвійній точності. У мене немає довідки, але я побачу, чи зможу її знайти пізніше.
Білл Барт

Так, це не здивувало б мене. Це також відповідає тому, що ми робимо.
Вольфганг Бангерт

Ви використовуєте квадратичну точність для точкових виробів? Якщо так, круто! Я не чув, щоб хтось робив це в бібліотеці.
Білл Барт


3

Моя порада полягає в тому, щоб зосередити увагу головним чином на споживанні пам'яті для вирішення питання про використання однієї точності (float). Отже, основні дані для обчислення FDTD повинні використовувати float, але я б зберігав сам опис проблеми (як геометрія, параметри матеріалу, умови збудження) та всі відповідні метадані вдвічі.

Я б утримував усі результативність некритично і не глибоко аналізував обчислення вдвічі. Тим більше, я б зберігав багатокутні дані та інший опис геометрії у подвійному (можливо, навіть цілому, якщо це можливо), оскільки досвід говорить про те, що ви ніколи не отримаєте обчислювані геометричні частини коду повністю надійними, навіть якщо це було б можливо теоретично.

Третю частину, яку я б тримав у подвійному плані, є аналітичні обчислення, включаючи ярлики з використанням несиметричних власних значень декомпозицій. Як приклад, у мене є кусочно визначена обертальна симетрична 2D функція, і мені потрібно її перетворення Фур'є. Існували б різні чисельні способи, що включають FFT та відповідні "аналітичні фільтри низьких частот", щоб отримати їх "ефективно". Оскільки продуктивність некритична, я використав "точний" аналітичний вираз із використанням функцій Бесселя. Оскільки для початку це був ярлик, і я не витрачаю часу на аналіз поширення помилок моєї складної формули, я краще використовувати подвійну точність для цього обчислення. (Виявилося, що лише деякі аналітичні еквівалентні вирази для формули були придатними,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.