Precyzja pojedynczego kontra podwójnego zmiennoprzecinkowego

13

Liczby zmiennoprzecinkowe pojedynczej precyzji zajmują połowę pamięci, a na nowoczesnych komputerach (nawet na GPU) operacje można wykonywać z nimi prawie dwukrotnie szybciej niż podwójna precyzja. Wiele kodów FDTD, które znalazłem, używa wyłącznie arytmetyki i pamięci o pojedynczej precyzji. Czy istnieje ogólna zasada, kiedy dopuszczalne jest stosowanie pojedynczej precyzji do rozwiązywania wielkoskalowych rzadkich układów równań? Zakładam, że musi to w dużej mierze zależeć od liczby warunków macierzy.

Ponadto, czy istnieje jakakolwiek skuteczna technika, która wykorzystuje podwójną precyzję tam, gdzie to konieczne i pojedynczą, gdy dokładność podwójnej nie jest wymagana. Myślę na przykład, że w przypadku mnożenia wektora macierzy lub iloczynu wektorowego dobrym pomysłem może być gromadzenie wyników w zmiennej o podwójnej precyzji (aby uniknąć błędu anulowania), ale poszczególne wpisy należy pomnożyć ze sobą można pomnożyć za pomocą pojedynczej precyzji.

Czy nowoczesne FPU bezproblemowo umożliwiają konwersję z pojedynczej precyzji (float) na podwójną precyzję (double) i odwrotnie? Czy są to kosztowne operacje?

Costis
źródło

Odpowiedzi:

7

Dla wszystkich nietrywialnych problemów (tj. Dla tych, gdzie liczy się wydajność) prawie cała pamięć będzie w macierzy, a stosunkowo mało w wektorach. Na przykład w przypadku elementów Taylora-Hooda 3d dla równania Stokesa w macierzy jest kilkaset elementów na wiersz, a to znacznie przewyższa ilość pamięci potrzebnej dla wektorów. W ten sposób bawiliśmy się pomysłem przechowywania macierzy jako liczb zmiennoprzecinkowych, a wektorów jako liczb podwójnych. Nie pamiętam naszych wyników pomiaru czasu, ale wiem na pewno, że nie widzieliśmy żadnych problemów z zaokrągleniem itp. To podejście zdecydowanie działa.

Wolfgang Bangerth
źródło
Dzięki, prof. Bangerth. A co z iteracyjnymi rozwiązaniami macierzowymi? Czy skalujesz do podwójnej precyzji dla produktów macierz-wektor, czy skalujesz elementy wektorowe do pojedynczych dla mnożeń i ponownie do podwójnych dla akumulacji?
Costis
Oczywiście mówiłem o rozwiązaniach iteracyjnych. Robimy wszystkie wektory z podwójną precyzją (ponieważ to nie ma znaczenia), więc operacja dst = matrix src odbywa się jako double = float double. Akumulacja następuje wtedy z podwójną precyzją, ale byłbym bardzo zaskoczony, gdyby w ogóle miało to znaczenie.
Wolfgang Bangerth,
Gdzieś tam jest papier (być może 2 dekady wstecz) wskazujący, że produkty kropkowe powinny być wytwarzane z większą niż podwójną precyzją. Nie mam przy sobie podręcznika, ale zobaczę, czy uda mi się go później znaleźć.
Bill Barth
Tak, nie zaskoczyłoby mnie to. To również pasuje do tego, co robimy.
Wolfgang Bangerth
Używasz poczwórnej precyzji w przypadku produktów punktowych? Jeśli tak, to świetnie! Nie słyszałem, żeby ktoś robił to w bibliotece.
Bill Barth
3

Radzę skupić się głównie na zużyciu pamięci przy podejmowaniu decyzji, kiedy użyć pojedynczej precyzji (liczba zmiennoprzecinkowa). Tak więc masowe dane do obliczeń FDTD powinny używać liczb zmiennoprzecinkowych, ale zachowałbym sam opis problemu (taki jak geometria, parametry materiału, warunki wzbudzenia) i wszystkie powiązane metadane podwójnie.

Trzymałbym wszystkie wyniki bezkrytycznie i nie dogłębnie analizowane obliczenia podwójnie. Zwłaszcza trzymałbym dane wielokątne i inny opis geometrii podwójnie (być może nawet całkowitą, jeśli to możliwe), ponieważ doświadczenie mówi, że nigdy nie uzyskasz w pełni solidnych obliczeniowych części geometrycznych kodu, nawet jeśli byłoby to teoretycznie możliwe.

Trzecią częścią, którą chciałbym podwoić, są obliczenia analityczne, w tym skróty wykorzystujące niesymetryczny rozkład wartości własnych. Jako przykład mam częściowo zdefiniowane obrotowe funkcje symetryczne 2D i potrzebuję jego transformacji Fouriera. Istnieją różne sposoby numeryczne obejmujące FFT i odpowiednie „analityczne filtry dolnoprzepustowe”, aby uzyskać je „skutecznie”. Ponieważ jego wydajność jest bezkrytyczna, zamiast tego użyłem „dokładnego” wyrażenia analitycznego obejmującego funkcje Bessela. Ponieważ był to skrót na początek i nie będę poświęcał czasu na analizę propagacji błędów mojej skomplikowanej formuły, lepiej dla tego obliczenia użyć podwójnej precyzji. (Nadal okazało się, że tylko niektóre równoważne wyrażenia analityczne dla formuły są użyteczne,

Thomas Klimpel
źródło