Zur Simulation von PRAM durch TM Nachfolgend sind einige wichtige Funktionen in Pseudocode aufgef¨ uhrt, die naheliegend so auf einer TM implementiert werden k¨onnen, dass deren Platzbedarf polynomiell im Zeitbedarf der PRAM ist. F¨ ur weitere, nur benutzte aber nicht definierte, Funktionen dr¨ uckt der Name hoffentlich deutlich genug aus, was sie jeweils tun. Man beachte, dass bei den diversen indirekten rekursiven Aufrufen der allen gemeinsame Parameter ”‘aktuelle betrachteter Zeitpunkt”’ t sp¨atestens bei jedem zweiten Aufruf um 1 dekrementiert wird. Die folgende Funktion check liefert als R¨ uckgabewert • true, falls es richtig ist, dass Prozessor p zum Zeitpunkt start gestartet wird und zum Zeitpunkt t Zeile l des Programms abarbeitet und der Akkumulatorinhalt danach a ist; • false sonst function bool check (proc p, time t, time start, line l , nat a) begin if (t < start) then return (false); fi if (t = start) then if (p = 0 and start = 0) then hder einfachste Fall: es muss l = 0 sein, usw.i ... elsif (p > 0 and start > 0) then return (findForker (p, start, l , a)); else handere F¨ alle sind unm¨ oglichi return (false); fi fi if (t > start) then hInformationen u ¨ber den vorangegangenen Schritt ermittelni (found , l 0 , a 0 ) ← findLineAccu(p, t − 1 , start) if not found then return (false); fi hKonsistenz des vorangegangenen Schritt mit dem aktuellen u ¨berpr¨ ufeni c1 ← checkLine(p, t, l 0 , a 0 , l ); c2 ← checkAccu(p, t, a 0 , l , a); return (c1 and c2 ); fi end 1 Die folgende Funktion findForker liefert als R¨ uckgabewert • true, falls es richtig ist, dass Prozessor p zum Zeitpunkt start in Zeile l des Programms gestartet wird und der Akkumulatorinhalt danach a ist. • false sonst function bool findForker (proc p, time start, line l , nat a) begin for p 0 ← p − 1 to 0 step −1 do for s 0 ← start − 1 to 0 step −1 do for a 0 ← 0 to n · alphSize t do if (checkAccu(p, start, a 0 , l , a)) then for l 0 ← each forkLineWithLabel (l ) do if (check (p 0 , start − 1, s 0 , l 0 , a 0 ) then return (true); fi od fi od od od return (false); end 2 Die folgende Funktion findLineAccu liefert als R¨ uckgabewert • (true, l, a), falls es richtig ist, dass Prozessor p zum Zeitpunkt start gestartet wird und zum Zeitpunkt t aktiv ist. Es ist dann l die zum Zeitpunkt t aktuelle Zeilennummer und a anschließend der Akkumulatorinhalt. • (false, 1, 0) sonst function (bool,line,nat) findLineAccu (proc p, time t, time start) begin found ←false; for a 0 ← 0 to n · alphSize t do for l 0 ← 1 to maxLines do found ← check (p, t, start, l 0 , a 0 ); if (found ) then return (true, l 0 , a 0 ) fi od od return (false, 1, 0); end 3 Die folgende Funktion checkLine liefert als R¨ uckgabewert • true, falls es richtig ist, dass Prozessor p zum Zeitpunkt t aktiv war, sich in Zeile l0 befand, der Akkumulatorinhalt a0 ist und die Nummer der als n¨achstes auszuf¨ uhrenden Zeile l ist. • false sonst function bool checkLine (proc p, time t, line l 0 , nat a 0 , line l ) begin c1 ← (instrInLine(l 0 ) 6= jump) and (instrInLine(l 0 ) 6= jzero or a 0 6= 0) and (l = l 0 + 1); c2 ← ((instrInLine(l 0 ) = jump) or (instrInLine(l 0 ) = jzero and a 0 = 0)) and (jumpLabelInLine(l 0 ) = l ); if (c1 or c2 ) then return (true); else return (false); fi end 4 Die folgende Funktion checkAccu liefert als R¨ uckgabewert • true, falls es richtig ist, dass Prozessor p zum Zeitpunkt t aktiv war, sich in Zeile l befand, vor Ausf¨ uhrung des Befehls der Akkumulatorinhalt a0 ist und nach der Ausf¨ uhrung a. • false sonst function bool checkAccu (proc p, time t, nat a 0 , line l , nat a) begin case instrInLine(l ) of jump: return (a 0 = a); loadDirectGlobal : adr ← extractAdr (l ); for t 0 ← t − 1 step −1 do 0 for p 0 ← 0 to 2t do if checkGlobalWriteOccurs(p 0 , t 0 , adr ) then goto found fi od od found : . . . husw. wie Buch, Seite 78 unteni hdie weiteren Kombinationen von Befehlen und Adressierungsarteni h werden hier nicht aufgef¨ uhrti ... esac end 5
© Copyright 2024 ExpyDoc