123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- .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
- .ft CW
- 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
|