1987-02-26 10:26:19 +00:00
|
|
|
.bp
|
|
|
|
.NH
|
|
|
|
Appendix B: Translation of a \fBPAR\fP construct to EM code using the library
|
|
|
|
routines to simulate parallelism
|
|
|
|
.PP
|
|
|
|
Translation of the parallel construct:
|
|
|
|
.DS
|
1988-04-18 13:34:29 +00:00
|
|
|
.ft CW
|
1987-02-26 10:26:19 +00:00
|
|
|
par
|
|
|
|
P0
|
|
|
|
par i = [ 1 for n ]
|
|
|
|
P(i)
|
|
|
|
.DE
|
|
|
|
is
|
|
|
|
.TS
|
|
|
|
center;
|
|
|
|
lf5 lf5.
|
|
|
|
lal -20 ; Assume 20 bytes of local variables at this moment
|
|
|
|
cal $parbegin ; Set up a process group
|
|
|
|
asp 4 ; Assume pointersize = 4
|
|
|
|
cal $parfork ; Split stack in two from local -20
|
|
|
|
lfr 4 ; Assume wordsize = 4
|
|
|
|
zne *23 ; One end jumps to second process, other continues here
|
|
|
|
lor 0 ; Static link
|
|
|
|
cal $P0
|
|
|
|
asp 4
|
|
|
|
bra *24 ; Jump to the outer parend
|
|
|
|
23
|
|
|
|
cal $parfork ; Fork off `par i = ...' process
|
|
|
|
lfr 4
|
|
|
|
zne *25 ; One end jumps to end of outer par
|
|
|
|
lal -20 ; Place break just above i
|
|
|
|
cal $parbegin ; Set up another process group for the P(i)
|
|
|
|
loc 1
|
|
|
|
stl -24 ; i:=1
|
|
|
|
lol n ; Assume n can be addressed this simply
|
|
|
|
stl -28 ; A nameless counter
|
|
|
|
bra *26 ; Branch to counter test
|
|
|
|
27
|
|
|
|
cal $parfork ; Fork off one P(i)
|
|
|
|
lfr 4
|
|
|
|
zne *28 ; One jumps away to increment i, the other calls P(i)
|
|
|
|
lol -24
|
|
|
|
lor 0
|
|
|
|
cal $P
|
|
|
|
asp 8
|
|
|
|
bra *29
|
|
|
|
28
|
|
|
|
inl -24 ; i:=i+1
|
|
|
|
del -28 ; counter:=counter-1
|
|
|
|
26
|
|
|
|
lol -28
|
|
|
|
zgt *27 ; while counter>0 repeat loop
|
|
|
|
29
|
|
|
|
cal $parend ; Wait for the P(i) to finish, then delete group
|
|
|
|
bra *24 ; Jump to the higher up meeting place with P0
|
|
|
|
25 ; Note that the bra will be optimized away
|
|
|
|
24
|
|
|
|
cal $parend ; Wait for both processes to end, then delete group
|
|
|
|
.TE
|