Možné spôsoby odmerania doby vykonávania programu v UNIX-e.
Treba si uvedomiť, že procesor nevykonáva LEN VÁŠ program, a preto
uvažujeme dva odlišné časy:
- čistý čas spotrebovaný na vykonanie vášho programu (CPU time),
teda nezapočítava sa čas, keď síce váš program ešte neskončil, ale trebárs
komunikoval, alebo bol vykonávaný iný program (napríklad kolegov program).
Ak meriame paralelný program (PVM), je potrebné pospočítavať si spotrebované
CPU časy na všetkých paralelne vykonaných procesoch.
- reálny čas, ktorý uplynul medzi začiatkom a koncom vykonávania vášho
programu (real time)
Speedup = dosiahnuté zrýchlenie.
Spočítame ho ako pomer času vykonania na viacerých procesoroch a času vykonania
na jednom procesore (reálneho času, aj s komunikačnou a inou réžiou).
Dá sa uvažovať o rôznych spôsoboch vyjadrenia
speedup-u, podľa toho, čo sa snažíme hodnotiť. Ak chceme napríklad vyjadriť
škálovateľnosť programu, použijeme ten istý program/algoritmus aj pri
vykonaní na jednom procesore: v PVM-programe si zvolíme počet procesov
deliteľný počtom procesorov, napríklad 16 procesov a vykonáme ich postupne na
16-tich, 8-mich, 4-och, dvoch a jednom procesore.
Ak chceme vyjadriť výhodnosť/nevýhodnosť paralelného riešenia problému, mali
by sme ako čas vykonania na jednom procesore brať čas najlepšieho známeho
algoritmu, ktorý rieši daný problém, hoci my sme na rozparalelnenie použili
menej efektívny algoritmus (ktorý sa ale na rozdiel od toho efektívneho dá
dobre rozparalelniť, napríklad).
Takže poďme k tomu meraniu času. Môžete vo vašom programe volať funkcie na
meranie času, alebo to riešiť jednoduchšie: UNIX ponúka elegantné riešenie,
pri ktorom nemusíte modifikovať váš meraný program. Jednoducho príkaz na
jeho vykonanie prefixujete iným príkazom (príkaz shell-u):
Bez zásahu do programu:
- "time váš_program" - vykoná váš program s tým,
že vypíše na konci ešte jeden riadok textu - hodnotu spotrebovaneho
CPU času (u=user, s=system) vaším programom a tiež hodnotu času, ktorý
uplynul medzi začiatkom a koncom vášho programu (v tvare minúty:sekundy),
popri ďalších informáciách (viď man csh alebo man time)
- "/usr/bin/time váš_program" - vypíše to trošku
ukecanejšie
C-funkciami vo vašom programe:
- gettimeofday (man gettimeofday) - vráti čas v mikrosekundách, ktorý
uplynul od 1.januára 1970
- getrusage (man getrusage) - vráti informácie popisujúce
použitie zdrojov (CPU time, memory, messages,...) pre proces aj jeho deti...
- time (man 3 time) - vráti čas v sekundách, ktorý uplynul od
1.januára 1970
zastaralé funkcie:
- times (man times) - nedoporučuje sa používať, namiesto nej
radšej getrusage a gettimeofday
- clock (man clock) - nedoporučuje sa používať, závisí od OS, akú
hodnotu vráti (CPU tiky alebo už prepočítané na mikrosekundy) a tiež to, kedy
sa naštartuje meranie...
- ftime (man ftime) - nedoporučuje sa používať, vráti čas v
sekundách + milisekundách, ktorý uplynul od 1.januára 1970 (treba
prilinkovat -lcompat)
- ...
Poznámky:
1. Na vyjadrenie speedup-u nemôžeme použiť hodnoty spotrebovaného CPU,
nevyjadrujú totiž vôbec stupeň paralelizmu.
2. Ani funkcia getrusage ani shell-ovský príkaz time nevie
započítať spotrebovaný CPU čas procesov spustených cez pvm_spawn.
Ako dcérske procesy sa tu myslia fork-ované procesy.