2013-04-09 19 views
9

Mam koprocesor podłączony do głównego procesora. Niektóre obliczenia zmiennoprzecinkowe muszą być wykonywane w koprocesorze, ale nie obsługuje instrukcji zmiennoprzecinkowych, a emulacja jest zbyt wolna.Jak wykonywać obliczenia zmiennoprzecinkowe z liczbami całkowitymi

Jednym ze sposobów jest przekonanie głównego procesora do skalowania wartości zmiennoprzecinkowych, aby mogły być reprezentowane jako liczby całkowite, wysłanie ich do procesora, który wykonuje pewne obliczenia, i zmniejszenie wartości po powrocie. Jednak to nie działałoby przez większość czasu, ponieważ liczby stałyby się zbyt duże lub małe, by wykroczyć poza zakres tych liczb całkowitych. Moje pytanie brzmi: jaki jest najszybszy sposób robienia tego poprawnie.

+1

Dowiedz się, jak działa matematyka zmiennoprzecinkowa. To łatwe. Powinieneś zdobyć większość potrzebnych informacji w szkole. Resztę można znaleźć online (użyj Wikipedii, Google itp.). I implementuj rutyny arytmetyczne zmiennoprzecinkowe. –

+0

Ale to jest powolna metoda. Chcę czegoś skutecznego. – MetallicPriest

+0

@AlexeyFrunze OP już powiedział, że emulacja jest zbyt wolna. To nie jest kwestia implementacji zmiennoprzecinkowej. – sfstewman

Odpowiedz

13

Mówisz, że emulacja jest zbyt wolna. Chyba masz na myśli emulację zmiennoprzecinkowej. Jedyną pozostałą alternatywą, jeśli skalowane liczby całkowite są niewystarczające, jest stała matematyka punktowa, ale nie jest ona również szybka, mimo że jest znacznie szybsza od emulowanej wartości zmiennoprzecinkowej.

Ponadto, nigdy nie unikniesz faktu, że zarówno z liczbami skalowanymi, jak i fixed point math, otrzymasz mniej dynamic range niż z zmiennoprzecinkowym.

Jednakże, jeśli twój zasięg jest znany z góry, stała matematyka może zostać dostosowana do potrzebnego zakresu.

Here is artykuł o stałym punkcie. Istotą triku jest decydowanie, jak podzielić zmienną, ile bitów ma niska i wysoka część liczby.

Pełna implementacja stałego punktu dla C może być found here. (Licencja BSD.) Tam are others.

+1

Co oznacza, że ​​takie optymalizacje powinny być wykonywane indywidualnie dla każdego przypadku. Bez srebrnej kuli. –

+0

@AlexeyFrunze, rzeczywiście. Przypadek OP wydaje się dość wyjątkowy. –

+0

* Prawie * +1. Podane łącza są całkowicie "C", a jedna to Java. Lubię GnuPGP dla arytmetyki wielowyrazowej; * Insembler * asembler służy do uzyskiwania szybszych operacji na wielu słowach, gdy są dostępne. Myślę, że biblioteka z * stałym punktem * "C" również mogłaby z tego skorzystać. Podczas gdy punkt stały ma mniej * zakresu dynamicznego *, ma on również znacznie mniej [umysły lądowe] (http://www.altdevblogaday.com/2012/02/22/porównanie-przeprowadzanie-point-numbers-2012-edycja/) , szczególnie biorąc pod uwagę * embedded * tag. –

3

Oprócz sugestii @Amigable Clark Kanta, Anthony Williams' fixed point math library zapewnia klasę C++ fixed które można używać prawie zamiennie z float lub double i na ramieniu daje poprawę wydajności w stosunku do 5x oprogramowania zmiennoprzecinkowych. Zawiera kompletną wersję standardowej biblioteki matematycznej fixed, w tym funkcje trig i log itp. Przy użyciu algorytmu CORDIC.

+0

Inny projekt tego samego rodzaju znajduje się w [google hosted project] (http://code.google.com/p/fpmath/) i [link do projektu kodu] (http://www.codeproject.com/Articles/37636/Fixed-Point-Class), wydają się mieć bardziej kompletną bibliotekę zawierającą pewne transcendentalne funkcje. –

Powiązane problemy