/******************************/ /* The program part */ /******************************/ /************** Problem: Spread the number of processors Model: EREW Initial state: m[0] = P Final State: m[1] = m[2] = ... = m[P] = P Processors exit synchronously Algorithm: if # - 1 > 0 then goto <LoopInit> m[1] = m[0] j = 1 goto <Wait> // When #1 is here #>=3 is at goto <Loop> <LoopInit> j = 2 <Loop> if j + 1 - # > 0 then goto <Copy> j = 2 * j goto <Loop> <Copy> m[#] = m[ # - j / 2 ] // Copy is as long as <Wait>-loop + inc j <Wait> if j + 1 - P > 0 then goto <End> j = 2 * j goto <Wait> <End> ***************/ #define NOP LOAD 1 @CONTROL /* Ask the number of processors from user */ LOAD =63 ECALL =3 ECALL =1 WRITE 0 /* Number of registers */ LOAD =3 WRITE 1 /* Read model */ LOAD =0 WRITE 2 /* Write model */ LOAD =0 WRITE 3 /* Address of first parameter */ LOAD =0 /* Init PRAM */ ECALL =0 @ENDCONTROL LOADINDEX STORE 2 SUB =1 JPOS LoopInit READ 0 WRITE 1 STORE 2 LOAD =1 STORE 3 NOP NOP JUMP Wait LoopInit: LOAD =2 Loop: STORE 3 ADD =1 SUB 2 JPOS Copy LOAD 3 SHIFT =1 JUMP Loop Copy: LOAD 3 SHIFT =-1 MUL =-1 ADD 2 READ *1 WRITE *2 STORE 2 LOAD 3 NOP NOP Wait: STORE 3 ADD =1 SUB 2 JPOS End LOAD 3 SHIFT =1 JUMP Wait End: HALT @CORE @CLOCK @LASTMEMINDEX /******************************/ /* The result part */ /******************************/ Script started on Thu Dec 15 19:11:19 1994 conx [emulator] pram -t -c -r 8 spread ?8 CLOCK: 38 CORE: Addr Value 0 8 1 8 2 8 3 8 4 8 5 8 6 8 7 8 8 8 END-OF-CORE conx [emulator] exit exit script done on Thu Dec 15 19:11:41 1994