3.   Simulátor a jazyk Transim

 

      Simulátor Transim je založen na kalkulu CSP (Communicating Sequential Processes) a běží  pod Unixem nebo MS DOS. Vstupní soubor pro simulátor Transim (přípona in) obsahuje popis software, hardware a přiřazení software na hardware. Jazyk Transim podporuje jak zasílání zpráv, tak sdílené proměnné. Popis software obsahuje běžné řídící příkazy (IF, WHILE) a komunikační příkazy, zatímco vlastní výpočet je nahrazen časovacími příkazy SERV( ). Argument SERV udává trvání nějakého výpočtu počtem taktů CPU. WAIT ( ). Je-li doba výpočtu závislá na zpracovávaných datech, dá se použít náhodně generovaná doba výpočtu v jistém intervalu hodnot – funkce  RAND(low, high).  Výpočty s čísly INT se dají provádět (např. pro ověření správnosti algoritmu malé demonstrační příklady), ale nemají vliv na simulovaný čas. Reálné datové typy nejsou podporovány. Předem známé režijní časy (čekání) lze simulovat příkazem  WAIT( ).  

 

      Procedury a podprogramy podporovány nejsou, ale jeden kód procesu může posloužit pro vytvoření řady procesů na různých procesorech  použijeme-li příkaz PLACED PAR  (model SPMD, Single Program Multiple Data); na každém procesoru může běžet ale obecně jiný proces  (model MPMD), nebo několik procesů souběžně pod příkazem PA. V simulátoru jsou také zabudovány funkce jádra distribuovaného operačního systému jako priority a plánování procesů. Procesy v Transimu jsou statické, jsou vytvořeny všechny na začátku programu. Každý proces je pojmenován  hlavičkou SEQ | jmeno.procesu. Procesy běžící na stejném procesoru mohou mít jednu ze dvou priorit, nízkou nebo vysokou. Zatímco procesy v nízké prioritě se střídají po časových kvantech, procesy ve vysoké prioritě běží až dokonce, pokud ovšem nenarazí na blokující příkaz (komunikace, čekání na časovač). V případě blokování jsou procesy obou priorit pozastaveny a na řadu přicházejí další připravené procesy.  Časovače lze deklarovat ve dvou rozlišeních podle aktuální priority

 

      Pokud jde o zasílání zpráv, jsou v Transimu použity jednosměrné kanály od jednoho procesu k druhému, deklarované jako CHAN OF ANY jmeno.kanalu. V programu je tedy udáno kudy zpráva půjde, nikoliv komu. Komunikace v sobě implicitně zahrnuje jistou časovou režii; buď se použijí zabudované default parametry nebo si uživatel definuje svůj časový model komunikace. Simulované zprávy mohou mít libovolnou délku (až do MAXINT byte). Délka zprávy v byte se specifikuje ve výstupním příkazu, ale kanálem se při simulaci reálně předává jen jediné číslo INT. Komunikace mezi procesy v Transimu nemá bufery pro zprávy a probíhá synchronně: oba partneři (procesy), kteří si přejí komunikovat, musí čekat jeden na druhého až oba provádějí komunikační příkaz. Při každé komunikaci tedy dochází k synchronizaci dvojice procesů. Jiné typy komunikací (ne-blokující, asynchronní, kolektivní apod.) je možné popsat základními příkazy přijmi, pošli, vyber  (?, !, ALT ) synchronní komunikace.  

 

      Architektura hardware a parametry CPU jsou specifikovány příkazem NODE  (hodinový kmitočet, přenosová rychlost linek, komunikační zpoždění atd.); nejsou-li specifikovány, použije se implicitních parametrů (default). Dá se simulovat  i jiný hardware než CPU. Propojení kanálů mezi procesory se provádí automaticky na základě kódu programu (pouze když je třeba simulovat kanály s různou rychlostí přenosu, je k dispozici příkaz LINK). Přiřazení software na procesory se definuje příkazem MAP. Několik procesů může být mapováno na jeden procesor, kde poběží souběžně.     

 

      Transim generuje řadu výstupních souborů se statistikou o čase stráveném jednotlivými procesory, procesy a kanály v různých možných stavech. Průměrné využití procesorů a dosažené zrychlení je udáno nejdříve. Procesy mohou posílat zprávy nebo data do zprávy o simulaci, buď použitím příkazu    NOTE (this.point.reached), který tiskne zprávu, id procesu a simulovaný čas, nebo  použitím předdefinovaného kanálu OUTSTRM, např. OUTSTRM ! data1, data2, … vytiskne mezivýsledky. Oba příkazy značně usnadňují ladění paralelních aplikací.

 

 

 

.

 

TRANSIM - Jazyk pro prototypování paralelních algoritmů

 

 

1. Soubor xxx.in = popis SW + popis HW + mapování SW --> HW

 

2. Replikovat (i=0 FOR n) lze příkazy SEQ, PLACED PAR, IF, NODE, MAP 

  (PAR a ALT nelze replikovat!)

             

3. Začátky řádků jsou důležité, protože vnořené bloky jsou definovány odsazením o 2 místa.
    Bloky lze též definovat zavorkami {,}.

    Na jednom řadku může být několik příkazů oddělených středníkem ;

    poznámky mohou byt odsazeny libovolně.

 

4. Časovače na všech procesorech běží synchronně.

 

5. Datove typy: pouze INT a BOOL - žádná reálná čísla a operace s nimi;

    rozsah INT PC : -32 767 až +32 767, na pracovni stanici (adela) mnohem víc.

    INTC = jednoduché proměnné, které mohou být sdíleny v popisu HW a SW.

 

6.PLACED PAR, PRI PAR, PAR :

  jejich komponenty musí byt pojmenovány a mají tvar:

           SEQ | name       

 

7.Kanály maji jediný protokol ANY, přenáší se ale po nich jen jedno INT

 

8.Výstupní komunikační příkaz (pošli) má  tvar

                   channel ! expr | mesg.length

  kde

     expr = intger expression

      mesg.length  je delka zpravy v bajtech, >= 0, (integer expression)

 

9. Vstupní komunikační příkaz (příjem) má tvar

                   channel ? variable

   kde variable je typu INT.

 

10. Předdefinované kanály:

    DEVICE - kanál pro komunikaci s ext.zařízením. Max. 1 takový vstupní  kanál
                             a 1 výstupní pro každý procesor

    Formát:  DEVICE ? variable | mesg.length

           DEVICE ! expression | mesg.length 

           

    OUTSTRM - výstupní kanál do okolního světa pro ladění, trasování.

             Je použitelný z libovolného procesu bez deklarace kanalu a

                                bez multiplexoru. Nemá vliv na simulovaný čas programu.

          Formát:    OUTSTRM ! exp1, exp2, ..., expn

          Povolení výpisu:  transim  -o report xxx.in

 

 

 

11. Popis HW: příkaz NODE. Pro node (procesor) lze specifikovat parametry

           SPD  CPU speed,  default: 20 MHz

            LS  link speed,  default: 10 Mbit/s

           ICS  int.channel speed Mbyte/s, default: 2*SPD

           ECS  ext.channel speed Mbyte/s, default: LS/11.25 bit/byte

           ICD  int.chan.delay [ms],  default: 64/SPD – 64 taktů CPU

           ECD  ext.chan.delay [ms],  default: 82/SPD– 82 taktů CPU

           TSL  time/slice period [taktů CPU], default: 20480

            EF  ext.memory factor (pocet pridavnych cyklu CPU na

                                       cyklus ext.pameti) default: 5

Přiklad:  node n0 : LS = 20, EF = 3

Externí kanály je třeba umísťovat pomocí příkazu PLACE jen když nemají stejné rychlosti.

 

12. Přiřazení SW na HW: příkaz MAP. Replikovaný MAP: index musí začínat od 0.

 

13.Přiřazení pouze do proměnné. Násobné přiřazení nebo přiřazení do pole není implementováno.

 

14.Standardni knihovni procedury nelze volat

 

15.Předdefinované funkce: RAND (v1,v2) generuje náhodné číslo v rozsahu <v1,v2>.

 

16.Předdefinované procedury:

    NOTE (name) - značka v programu pro časovací účely; name = string

    SERV (exp) - definuje délku práce CPU, exp = počet period hodin CPU

    WAIT (exp) - čekání  po udanou dobu, exp = počet period hodin CPU

 

17. Příkaz SET nastavuje různá návěští a řídí průběh simulace. Pokud by byl třeba, viz
          manual.doc, kap.4.5.

 

18.Pro jednoduchost není nutno se zabývat s korektním ukončováním procesů, hlášení
       ignorujte.

 

19. Pozor, příkaz IF musí vždy definovat všechny možnosti nebo poslední podmínka musí být TRUE. Jednotlivé podmínky se prohlíží v textovém pořadí. Jednoduchý podmíněný příkaz nelze použít.

 

20. Počítaná smyčka  SEQ i = 0 FOR  P znamená opakované provedení těla smyčky. Jak se mají provést příkazy těla smyčky je nutno zase specifikovat; pokud sekvenčně, tak takto:

SEQ i = 0 FOR  P

  SEQ
    ...telo