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


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.