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