220 likes | 347 Views
T225 16 bites transputer blokkvázlata. MIMD gép transputerekkel. A MIMD gép konfigurálása. http://en.wikipedia.org/wiki/Occam_programming_language lapról származó példa:. ALT count1 < 100 & c1 ? data SEQ count1 := count1 + 1 merged ! data count2 < 100 & c2 ? data
E N D
MIMD gép transputerekkel
http://en.wikipedia.org/wiki/Occam_programming_language lapról származó példa: ALT count1 < 100 & c1 ? data SEQ count1 := count1 + 1 merged ! data count2 < 100 & c2 ? data SEQ count2 := count2 + 1 merged ! data status ? request SEQ out ! count1 out ! count2
occam példák C megfelelői ahttp://frmb.org/occtutor.htmlweblapról
if (x == y) { foo (x); } else if (y == 0) { bar (x); } else { /* nothing! */ } If statement IF x = y foo (x) y = 0 bar (x) TRUE SKIP
while (!end_of_file) { ... process ... } While loop WHILE (NOT end.of.file) ... process ...
void foo (int x, double *r) { ... process ... } Procedure PROC foo (VAL INT x, REAL64 r) ... process ... :
int foo (int v) { int r; r = (v * 10); return r; } Function INT FUNCTION foo (VAL INT v) INT r: VALOF r := (v * 10) RESULT r :
switch (array[i]) { case 'a': case 'b': case 'c': case 'd': case 'e': ch = array[i]; break; case 'f': case 'g': ch = 'z'; break; default: ch = 0; break; } Selection CASE array[i] 'a','b','c','d','e' ch := array[i] 'f',g' ch := 'z' ELSE ch := #00
AZÉRT EZ NEM IGAZ!!! { int i; for (i = 0; i < count; i++) { P (i); } } For-type loop SEQ i = 0 FOR count P (i)
typedef int blue; Simple type declaration DATA TYPE blue IS INT:
typedef struct { int x, y; double i, j; char string[16]; } foo; Structured type declaration DATA TYPE foo RECORD INT x, y: REAL64 i, j: [16]BYTE string: :
Timer A TIMER típusú változó egy különleges csatorna, mely megvalósításban definiált felbontású, azaz a nyelv nem rögzíti, hogy mekkor időnként "kettyen", sőt ez függhet a processz prioritásától is. INT számláló-értéket ad, melyet előjel nélkülinek kell tekinteni. Adott óráról párhuzamosan több processz is olvashat, nem úgy, mint más csatornáról. Késleltetés megvárása: az AFTER használatával egy TIMER-ra vonatkozó inputban. Pl. 64 msec várakozás, ha az óra 1 msec-onként kettyen: TIMER clock: -- egy óra-csatorna VAL delay IS 64 -- késleltetés konstansa INT now: -- kezdeti idő SEQ clock ? now -- pillanatnyi idő leolvasása now-ba clock ? AFTER now PLUS delay -- megvárja az adott értéket, PLUS előjel -- nélküli + művelettel clock ? AFTER now + delay -- ugyanaz, de az előző az óra ciklusa -- szerint moduló működik, ez túlcsordulhat
Pl. várakozás 2 csatorna valamelyikén érkező adatra time-out -tal: TIMER clock: -- egy óra-csatorna INT now: -- kezdeti idő BOOL timeout: -- volt time-out? VAL delay IS 1000: -- késleltetés (konstans) SEQ PAR clock ? now -- pillanatnyi idő timeout := FALSE ALT c ? x -- vagy a c csatornáról jön input, P -- az ehhez tartozó tevékenység d ? x -- vagy a d csatornáról jön input, Q -- az ehhez tartozó tevékenység clock ? AFTER now PLUS delay -- ez idővel biztosan teljesül timeout:=TRUE
3. példa: Tömb rendezése összefésüléssel VAL INT Tmeret IS 1024: -- kettő hatványa az egyszerűség kedvéért [Tmeret] REAL T : -- tömb PROC masol ([] REAL ezt, ide) SEQ ide := ezt :
PROC fesul ([] REAL t1, t2, tki) -- t1 és t2 összefésülése tki -be INT x1,x2,xki,slen: SEQ PAR x1 := 0 x2 := 0 xki := 0 slen := SIZE t1 -- aktuális tömbparaméter elemszáma WHILE (x1<slen) AND (x2<slen) -- összefésülés SEQ IF t1[x1] < t2[x2] SEQ tki[xki] := t1[x1] x1 := x1+1 TRUE SEQ tki[xki] := t2[x2] x2 := x2+1 xki := xki+1 -- MÉG NINCS VÉGE!!!
PAR IF x1<slen -- maradékok másolása párhuzamosan masol ([t1 FROM x1], [tki FROM xki FOR slen-x1]) TRUE SKIP IF x2<slen masol ([t2 FROM x2], [tki FROM xki FOR slen-x2]) TRUE SKIP : -- PROC fesul vége
PROC Menet ([] REAL ezt, ide, VAL INT slen) -- összefésülések egy menete PAR x=1 FOR SIZE T / 2 * slen -- részek összefésülése párhuzamosan, -- ha lehet ágszámot dinamikusan megadni fesul ([ezt FROM (2*(x-1))*slen FOR slen], [ezt FROM (2*x-1) *slen FOR slen], [ide FROM (2*(x-1))*slen FOR 2*slen]) : -- PROC Menet vége Bontsuk csak ki! x=1, slen = 1 fesul([ezt FROM 0 FOR 1], [ezt FROM 1 FOR 1], [ide FROM 0 FOR 2]) x=2, slen = 1 fesul([ezt FROM 2 FOR 1], [ezt FROM 3 FOR 1], [ide FROM 2 FOR 2]) ... x=512 fesul([ezt FROM 1022 FOR 1], [ezt FROM 1023 FOR 1], [ide FROM 1022 FOR 2]) Most slen = slen *2, ezzel ismét x=1, slen = 2 fesul([ezt FROM 0 FOR 2], [ezt FROM 2 FOR 2], [ide FROM 0 FOR 4]) x=2, slen = 1 fesul([ezt FROM 4 FOR 2], [ezt FROM 6 FOR 2], [ide FROM 4 FOR 4]) ... x=256 fesul([ezt FROM 1020 FOR 2], [ezt FROM 1022 FOR 2], [ide FROM 1020 FOR 4])
PROC Sort ([] REAL t) INT slen: [SIZE t] REAL W : -- munkaterület SEQ slen := 1 -- kezdeti szakaszhossz WHILE slen < SIZE t SEQ Menet (T,W,slen) -- páratlanadik menet: T ==> W slen := 2*slen IF slen < SIZE t -- kell még menet SEQ Menet (W,T,slen) -- párosadik menet: W ==> T slen := 2*slen TRUE T := W -- páratlan menet volt; eredmény visszamásolása : -- PROC Sort vége
... -- T feltöltése Sort (T) -- a rendezés végrehajtása ... -- T felhasználása ...