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:
-
oraz:
-
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.
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
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:
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.
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:
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.
to samo tylko, ûe mamy tu funkcje trygonometryczne itd. Biblioteka ta
jest w katalogu LIBS
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.
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:
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
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ê.
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()
Dudi/Indep
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.
SFFFFFFFFFFFFFFF.EEEEEEEEEEEEEEEE
Gdzie:
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:
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.
JAK LICZYÊ ABY SIË DOLICZYÊ
1100110011
+
0001100101
----------
1110011000
Nazwa biblioteki wersja Autor Data A1200 FPU-16 FPU-33
e-mail: jdudek@student.uci.agh.edu.pl
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:
1. S - to znak liczby
2. F - reszta
3. E - zakodowana potëga