Mam system cyfrowego przetwarzania sygnałów, który działa na szybkiej maszynie x86 przy użyciu liczb zmiennoprzecinkowych o podwójnej precyzji . Przyszło mi do głowy, że tak naprawdę nie używam ogromnego zakresu dynamicznego reprezentacji zmiennoprzecinkowej - wszystkie wielkości mieszczą się w zakresie ± 32768.
Moje pytanie: czy jest możliwe, że przejście na obliczenia o stałym punkcie przyniosłoby korzyści w zakresie dokładności numerycznej (wysoki priorytet) lub czasu obliczeń (niski priorytet)?
Oczywiście odpowiedź zależy od liczby bitów dostępnych do obliczenia punktu stałego. Ile bitów precyzji wykorzystuje typowe systemy stałoprzecinkowe? Czy jest możliwe wydajne wykonywanie obliczeń w punkcie stałym z, powiedzmy, 64-bitową ( 16-bitową częścią całkowitą, 48-bitową częścią ułamkową ) na x86-64?
Zawsze myślałem, że obliczenia w punkcie stałym były wykorzystywane tylko w sytuacjach, w których moc procesora jest ograniczona - czy warto stosować obliczenia w punkcie stałym, gdy moc procesora nie ma znaczenia?
źródło
Odpowiedzi:
Dokładność liczbowa liczb całkowitych będzie lepsza niż dokładność liczbowa liczb zmiennoprzecinkowych tylko wtedy, gdy lepsza będzie rozdzielczość liczb całkowitych. Podwójne mają 52 bity ułamkowe, więc liczby zmiennoprzecinkowe o podwójnej precyzji mają rozdzielczość gorszą niż w przybliżeniu liczby całkowite252 , który jest znacznie większy niż 32768 (215 ). Więc nie, dokładność liczbowa nie będzie lepsza, jeśli przejdziesz do liczb całkowitych.
Drugi problem to prędkość. Odpowiedź brzmi: to zależy od sprzętu. Jeśli uruchamiasz swój program na cyfrowym procesorze sygnałowym, który ma wiele rdzeni zwielokrotniających / gromadzących rdzenie, wówczas tak, będzie znacznie szybszy w stałym punkcie. Z drugiej strony na układzie x86 prawdopodobnie będzie on wolniejszy w ustalonym punkcie. Zrobiłem dokładnie to, o czym mówisz raz, i zauważyłem, że moje czasy wykonania rosną.
Po przeprowadzeniu kilku wyszukiwań w Internecie dowiedziałem się, że jest to powszechne. Powodem jest to, że ma dedykowany procesor zmiennoprzecinkowy, który nic nie robi, gdy przechodzisz do punktu stałego, podczas gdy sprzęt stałoprzecinkowy jest współdzielony ze zwykłą akcją punktu stałego, taką jak arytmetyka wskaźnika.
Jeśli chcesz przyspieszyć przetwarzanie, sposobem na to jest zmiana z pływaków podwójnej precyzji na pływaki pojedynczej precyzji. To powinno spowodować znaczny wzrost prędkości. To oczywiście zmniejszyłoby dokładność liczbową.
źródło
Zalety punktu stałego dotyczą głównie mocy (na przykład, gdy masz wybór sprzętu procesora lub procesor jest dobry w wyłączaniu nieużywanych jednostek funkcjonalnych). Jest tak, ponieważ jednostki o stałym punkcie są zwykle mniejsze (mniej tranzystorów, krótsze druty, mniejsza pojemność do pokonania na MAC) dla danej technologii i stawki emisji, niż zmiennoprzecinkowe.
Jednak ogromna liczba popularnych współczesnych procesorów (serwer, komputer PC, a nawet urządzenia mobilne) ma więcej i szybsze FPU (szczególnie jednostki FP o pojedynczej precyzji) niż mnożniki liczb całkowitych, a większość mocy systemu nie pochodzi z korzystania z FPU, więc używanie stałej -point będzie miał niewielkie lub żadne zalety dla typowych obliczeń DSP na tych produktach i może być wadą pod względem czystej wydajności. Wykorzystując obecną technologię, wszelkie korzyści związane ze stałymi punktami będą głównie gromadzone w małych produktach osadzonych, takich jak urządzenia wielkości przycisków.
Jednak należy również wziąć pod uwagę ślady pamięci podręcznej i procesora. Sprytne użycie mniejszych typów danych (short int i float), aby całkowicie zmieścić duże obliczenia w pamięci podręcznej danych, może zrównoważyć wszelkie zalety przepustowości FPU.
źródło
Wolisz liczbę zmiennoprzecinkową pojedynczej precyzji od liczby podwójnej - spowoduje to zmniejszenie o połowę przepustowości pamięci, powierzchni pamięci podręcznej i wymagań dotyczących pamięci, a także przyspieszy niektóre operacje matematyczne. Otwiera także możliwość 4-kierunkowego SIMD, jeśli konieczna jest dalsza optymalizacja.
Punkt stały jest naprawdę wartościowy tylko wtedy, gdy nie masz FPU - większość współczesnych procesorów x86 ma dwa FPU, więc nie można nic zyskać na używaniu stałego punktu, a wydajność może być nawet znacznie gorsza z ustalonym punktem. (Należy również zauważyć, że punkt stały wymaga dodatkowych instrukcji w porównaniu do zmiennoprzecinkowego dla operacji takich jak mnożenie).
źródło
Oprócz podanych tutaj bardzo dobrych odpowiedzi, warto dodać kilka rzeczy:
źródło
Kilka punktów do rozważenia:
W ostatecznym rozrachunku uważam, że nasze dane z prawdziwego świata są cenne, a ślepe numerowanie komputera to skromna robota służąca. Komputer musi zostać obciążony ciężką pracą na rzecz twoich danych i ciebie, a nie traktowany tak, jakby był prawdziwą gwiazdą serialu.
źródło