60 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
.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
 |