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?
źródło
Fajnym referatem na ten temat jest przyspieszenie obliczeń naukowych za pomocą algorytmów o mieszanej precyzji .
źródło
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,
źródło