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:
  1. č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.
  2. 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:
  1. "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)
  2. "/usr/bin/time váš_program" - vypíše to trošku ukecanejšie

    C-funkciami vo vašom programe:
  3. gettimeofday (man gettimeofday) - vráti čas v mikrosekundách, ktorý uplynul od 1.januára 1970
  4. getrusage (man getrusage) - vráti informácie popisujúce použitie zdrojov (CPU time, memory, messages,...) pre proces aj jeho deti...
  5. time (man 3 time) - vráti čas v sekundách, ktorý uplynul od 1.januára 1970

    zastaralé funkcie:
  6. times (man times) - nedoporučuje sa používať, namiesto nej radšej getrusage a gettimeofday
  7. 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...
  8. 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)
  9. ...
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.