CZYLI
JAK LICZYÊ ABY SIË DOLICZYÊ

Tematem tego artykuîu bëdzie sposób wykonywania obliczeï przez Amigë. Bynajmniej nie mam zamiaru pisaê rzeczy w stylu "szybszy komputer jest szybszy", moim zadaniem bëdzie omówienie mechanizmu dziaîania, oraz w jaki sposób moûna liczenie przyspieszyê. Artykulik ten jest skierowany gîównie do ludzi zajmujâcych sië raytracingiem, choê innym moûe teû sië przyda. A teraz do rzeczy.

Liczby w pamiëci komputera moûna podzieliê na dwie kategorie:

- liczby caîkowite (integer) albo staîoprzecinkowe

oraz:

- liczby rzeczywiste albo zmiennoprzecinkowe (real, float).

Teraz liczby te mogâ mieê okreôlonâ dîugoôê, w przypadku liczb caîkowitych wynosi ona od 8, 16 oraz 32 bity. W przypadku liczb rzeczywistych mamy doczynienia z 32 oraz 64 bitami. W przypadku obliczeï na liczbach caîkowitych sprawa jest prosta. Robi to procesor gîówny (CPU), posiada on szereg rozkazów sîuûâcych do dodawania, odejmowania, mnoûenia, dzielenia, porównywania etc. O rozkazach tych wiedzâ duûo zwîaszcza Ci którzy piszâ programy w asemblerze. Sâ to rozkazy typu ADD, SUB, MUL, DIV itd. Liczba w pamiëci reprezentowana jest w systemie dwójkowym jako ciâg zer i jedynek. Np. dodanie dwóch liczb realizuje sië przez logiczne dodanie do siebie odpowiednich zer i jedynek.

1100110011
         +
0001100101
----------
1110011000
Nazwa "liczby staîoprzecinkowe" bierze sië stâd, ûe przecinek jest na samym koïcu tzn. nie jest to liczba uîamkowa, w przypadku liczb zmiennoprzecinkowych dopuszczalny jest przecinek "gdzieô w ôrodku" i moûna liczyê na uîamkach. Gdy dziaîamy na liczbach zmiennoprzecinkowych sprawa nie jest taka prosta jak w przy liczbach caîkowitych. Przyczynâ jest fakt, ûe procesor nie potrafi liczyê bezpoôrednio za pomocâ liczb rzeczywistych.

Liczba zmiennoprzecinkowa wyglâda tak:

pierwszaliczba*podstawa^drugaliczba Weúcie teraz kartkë papieru i oîówek i napiszcie np.

1.34456*10^122+1.2222*10^11 i pomyôlcie jak to obliczyê. Oczywiôcie w matematyce nie ma wzoru który pozwoliî by te liczby do siebie tak po prostu dodaê i stâd caîy ten kîopot. Pierwsza liczba jest zwykle liczbâ z zakresu od 1 do 2 czyli 1.xxxx, podstawa wynosi zwykle 2 albo 10. Czy liczby takie sâ potrzebne? Oczywiôcie, ûe tak. Wynik z funcji sinus jest miëdzy -1 a 1 i liczby staîoprzecinkowe sâ za maîo dokîadne. Co wiëc zrobiê? Programiôci tworzâcy Kickstart do Amigi oraz oprogramowanie systemowe rozwiâzali ten problem za pomocâ tzw "bibliotek".

Czëôê z nich znajduje sië w pamiëci ROM a czëôê w katalogu LIBS. Sâ to po prostu programy które potrafiâ dokonywaê obliczeï na liczbach tylko rzeczywistych. Teraz co to za biblioteki.

Dla obliczeï na liczbach zmiennoprzecinkowych w formacie FFP mamy:

mathffp.library

Biblioteka ta znajduje sië w pamiëci ROM. Sâ to podstawowe dziaîania na liczbach zmiennoprzecinkowych w formacie FFP (Fast Floating Point), takie jak dodawianie odejmowanie etc.

mathtrans.library

Biblioteka ta znajduje sië w katalogu LIBS na twoim dysku systemowym. Sâ to dziaîania na liczbach FFP juû bardziej zîoûone takie jak np. funkcje trygonometryczne (transcendental) czyli np. sinus tangens oraz inne. Liczby w formacie FFP sâ liczbami 32 bitowymi. Dziaîania na nich sâ stosunkowo szybkie i wiele programów korzysta z tych bibliotek.

Liczby w formacie IEEE. Mogâ byê 32 bitowe oraz teû 64 bitowe.

Biblioteki to:

mathieeesingbas.library

czîon "ieee" oznacza liczbë w formacie IEEE, czîon "sing" (od "single") oznacza liczbë pojedynczej precyzji (czyli 32 bity), a czîon "bas" (od "basic" - proste) oznacza dziaîanie podstawowe (dodawanie odejmowanie etc.) Biblioteka ta jest w pamiëci ROM.

mathieeesingtrans.library

to samo tylko, ûe mamy tu funkcje trygonometryczne itd. Biblioteka ta jest w katalogu LIBS

mathieeedoubbas.library

Czîon "doub" (od "double" - podwójny) to dziaîania podstawowe na liczbach IEEE podwójnej precycji czyli 64 bitowych. Biblioteka ta jest w katalogu LIBS.

mathieeedoubtrans.library

Juû powinieneô drogi czytelniku wiedzieê, ûe sâ to liczby w fromacie IEEE podwójnej precyzji (64 bity) i procedury zawarte w tej bibliotece majâ za zadanie podawanie wartoôci z funkcji trygonometrycznych i nie tylko. Biblioteka ta jest w katalogu LIBS.

Teraz jak korzystajâ programy z tych bibliotek. Na ogóî wszystkie programy korzystajâ z liczb w fromacie FFP, poniewaû mathffp jest w ROM-ie i nie wymaga doîadowywania. Poza tym dziaîania na nich sâ/byîy szybsze (dlaczego byîy o tym za chwilë). Do obliczeï na liczbach zmiennoprzecinkowych przeznaczony jest koprocesor matematyczny (FPU - Floating Point Unit czyli jednostka zmiennoprzecinkowa ukîad 68881/2).

Zawarte w bibliotekach procedury sprawdzajâ czy mamy na pîycie FPU jeôli tak obliczenia wykonuje FPU, posiada on wîasne rozkazy asemblera takie jak FMOVE, FADD, FSUB, FMUL, FDIV oraz dla funkcji trygonometrycznych FSIN, FCOS etc. Posiada on wîasnych osiem rejestrów danych kolejno FP0 do FP7 oraz parë wîasnych rejestrów statusowych (podobnie jak CPU). Kiedy jednak nie mamy FPU obliczenia musi (choê nie jest do tego stworzony) wykonaê procesor gîówny. Dlatego obliczenia te trwajâ czasem bardzo dîugo (zwîaszcza gdy uûywamy liczb podwójnej precyzji). Poniewaû procesor matematyczny potrafi liczyê tylko na liczbach w fromacie IEEE ostatnio ten fromat cieszy sië rosnâcym powodzeniem z racji, ûe coraz wiëcej Amig posiada wbudowany koprocesor. (*) Co wiëc tu moûna zrobiê?

Ano moûna i to caîkiem sporo. W przypdaku bibliotek zawartych w ROM-ie sprawa jest zamkniëta - nic juû nie moûemy zrobiê. Gdy jednak biblioteka doczytywana jest z katalogu LIBS moûna jâ podmieniê z firmowanej przez Commodore Amiga na innâ. Ale czy warto? I na jakâ??? Takich innych szybkich bibliotek jest i to ostatnio ciâgle ich przybywa. Podam teraz wyniki testów jakie zostaîy przeprowadzone na róûnych blibliotekach. Test polegaî na wykonaniu tej samej czynnosci (dla bibliotek "bas" dodawanie dla "trans" sinus) 500000 razy. Podane wartoôci sâ w 1/50 sekundy. Jeôli ktoô chce to moûe sobie przeliczyê ile trwa sekund jedna operacja oraz znajâc szybkoôê taktowania procesora ile cykli zegara trwa jedna operacja.

Testy przeprowadzono najpierw na "goîej" Amidze 1200 a nastëpnie na Amidze 1200 ale z samym koprocesorem matematycznym. Celowo nie uûywaîem pamiëci FAST. Biblioteki te moûna dostaê na róûnych dyskach typu Public Domain Freda Fish-a etc. Ostatni rzâd bibliotek napisanych przez Martina Berndta nie dziaîa bez koprocesora matematycznego, gdyû biblioteki te bezpoôrednio odwoîujâ sië do ukîadu 68881/2 nie sprawdzajâc czy ukîad taki w ogóle istnieje. Stâd w przypadku gdy nie posiadamy FPU na pîycie, a uûyjemy jednej z tych blibliotek pojawi sië czerwona, migajâca ramka.

Amiga 1200 z FPU miaîa dodatkowy zegar dla procesora matematycznego, tak wiëc byîa taktowana asynchronicznie z czëstotliwoôciâ 16 Mhz, a nastëpnie 33 Mhz. Oto wyniki:

Nazwa biblioteki      wersja    Autor     Data  A1200   FPU-16 FPU-33

mathtrans          37.1  Commodore Amiga 22/1/91  1303  1089    989
mathieeesingtrans  37.1  Commodore Amiga 21/1/91  9133  1036    645
mathieeedoubbas    38.2  Commodore Amiga 24/1/92  1302   930    888
mathieeedoubtrans  37.1  Commodore Amiga 21/1/91 52809  1132    765

mathtrans          100.-1  MFCombs       06/14/93 2915  2898   2868
mathieeesingtrans  100.-1  MFCombs       05/3/93  2977  2970   2966

mathtrans          40.4  Martin Berndt   23/6/94   ---  1042    714
mathieeesingtrans  40.4  Martin Berndt   23/6/94   ---  1033    677
mathieeedoubbas    40.4  Martin Berndt   23/6/94   ---   953    870
mathieeedoubtrans  40.4  Martin Berndt   23/6/94   ---  1188    660
Teraz pora na wnioski:

Jak widaê bardzo duûo zaleûy od tego jakiej biblioteki uûyliômy. Z moich wîasnych obserwacji wynika, ûe biblioteki w których w nagîówku znajduje sië tekst "MFCombs" nie wykrzystujâ procesora matematycznego, oraz nawet nie wykrywajâ jego obecnoôci. Biblioteka mathieeesingtrans tego autora jest ok 3 razy szybsza od biblioteki systemowej, co z tego skoro "mathtrans" czëôciej wykorzystywana przez programy jest znacznie wolniejsza. Co do bibliotek oryginalnych tzn. dostarczanych na dyskietkach systemowych: Moûe nie sâ rewelacyjnie szybkie, ale gdy posiadamy FPU wszystkie funkcje trygonometryczne dziaîajâ od 10 do 50 razy szybciej (ale tylko te które sâ w formacie IEEE). Co do bibliotek Martina Berndta: Sâ dobre (nawet bardzo) pod warunkiem, ûe sië ma FPU.

Ogólne stwierdzenia jakie sië nasuwajâ to:

Jeôli masz FPU to uûywaj liczb w formacie IEEE a bibliotek na FPU lub systemowych, te pierwsze sâ o tyle dobre ûe sâ niesamowicie krótke (do 1 Kb). Jeôli nie masz FPU uûywaj liczb FFP i tylko bibliotek systemowych.

Jeôli masz FPU i jeôli moûesz mieê wersje programu na FPU wybierz wersje na FPU. Przykîad: Imagine 2.0 wersja zwykîa, komputer A1200 + FPU (bez pamiëci FAST) liczyî maîy obrazek 49 sekund. Ten sam sprzët tylko Imagine 2.0 wersja tylko na FPU i czas spada do 35 sekund.

Róûnice miëdzy FPU taktowanym zegarem 16 Mhz a 33 Mhz sâ, ale nie takie ûeby rzuciîo na kolana. Chodzi o to, ûe nie ma sensu wydawaê np. 2 mln zîotych polskich starych (nowych 200) tylko po to aby minimalnie przspieszyê obliczenia. Poza czasem potrzebnym na obliczenia przez FPU chwile teû trwa praca CPU czyli otwarcie biblioteki, sprawdzenie czy jest FPU itd. Lepiej dokupiê FAST-u.

Nie kupuj ukîadu 68881 - jest przestarzaîy, choê wszystko bëdzie dziaîaê.

Nie kupuj ÛADNEGO FPU jeôli jesteô: graczem, muzykiem, grafikiem (nie dotyczy raytracingu). Jeôli jednak systematycznie co jakiô czas przeprowadzasz jakieô obliczenia to czemu nie...

To tyle. Na zakoïczenie chcë dodaê, ûe do testowania bibliotek uûyîem programu napisanego w jëzyku "E". Czas mierzyîem za pomocâ procedury GetDateStamp(). Widaê goîym okiem, ûe dane podane sâ z pewnâ niedokîadnoôciâ bo uruchamiajâc ten sam program kilka razy w tych samych warunkach podajë róûniâce sië miëdzy sobâ dane. Przyznam sië szczerze, ûe nie wiem co jest tego przyczynâ. Na pewno nie byîy to inne programy pracujâce w tle, gdyû podczas pracy programu caîy system jest "zamroûony" - procedury Permit() i Forbid() <<Heh! A przerwania?! Ich nie wyîâczyîeô i stâd bîëdy>>. Bîëdy sâ duûe - niemniej wyniki wystarczajâ do celów testu.

Dudi/Indep
e-mail: jdudek@student.uci.agh.edu.pl

PS. Autor tego artykuîu przeprasza Wojtka Kutë za to, ûe w trakcie Ôwiât Boûego Narodzenia przesiadywaî u Niego i katowaî jego komputer (FPU 33 Mhz) stertâ bezsensownych obliczeï.

PPS. Wîaônie w moje rëce wpadîa nowa wersja bibliotek matematycznych (40.5) Martina Berndta. Sâ one odrobine szybsze oraz w jednym z doców autor przyznaî sië, ûe poprzednie wersje miaîy maîy bîâd w procedurze porównywania dwóch liczb zmiennoprzecinkowych dla liczb podwójnej dokîadnoôci.



MIron: drobny wtrët... IEEE (a wîaôciwie zbiór standardów zapisu liczb zmiennoprzecinkowych zatwierdzony przez IEEE :)) takûe (a wîaôciwie przede wszystkim) dlatego staî sië popularny, gdyû jest wrëcz wymarzony do pracy na "normalnych" procesorach. Oczywiôcie "wymarzony" oznacza w tym wypadku "lepszy niû inne"... Wyglâda on mniejwiëcej tak:

SFFFFFFFFFFFFFFF.EEEEEEEEEEEEEEEE

Gdzie:
1. S - to znak liczby
2. F - reszta
3. E - zakodowana potëga

A teraz dokîadniej :)...

1. Chyba wiadomo.. 0 to plus 1 to minus (albo na odwrót :) - pozwala to przy póúniejszych obliczeniach korzystaê z "normalnych" rozkazów procesora, gdyû w staîych znak liczby jest w tem samem mniejscu.

2. Chodzi o to, ûe kaûdâ liczbë rzeczywistâ (zakodowanâ juû binarnâ) moûna sprowadziê do postaci:

1.FFFFFFFFFFFFFFF - np. 3.0*10^0 = 11.0*2^0 = 0.3*10^1 = 1.1*2^1.

Dziëki temu zaoszczëdzamy 1 bit na wiadomej wartoôci, a liczba jest dokîadniejsza.

3. Brzmi tajemniczo? :) Eeeeeee.... gdzie tam. Chodzi o to, ûe aby móc zapisywaê potëgi i dodatnie i ujemne trzeba by dodaê jeszcze jeden bit na znak potëgi, lub teû.... DODAÊ PEWNÂ ZNANÂ STAÎÂ (najczëôciej jest to poîowa max. wartoôci) i to jest wîaônie owa "zakodowana wartoôê potëgi

Po dokîadniejszy opis IEEE odsyîam do dowolnej ksiâûki traktujâcej o architekturze komputerów.

BACK