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
 |