Block 5044 3 CONSTANT MU-N-CONC 2 CONSTANT MU-N-MODES MU-N-CONC MU-N-MODES * CONSTANT MU-N-CFG 63 CONSTANT MU-MAX-REPS MU-N-CFG MU-MAX-REPS * CONSTANT MU-MAX-RUNS CREATE MU-CONC-LEVELS 3 CELLS ALLOT 2 0 CELLS MU-CONC-LEVELS + ! 4 1 CELLS MU-CONC-LEVELS + ! 8 2 CELLS MU-CONC-LEVELS + ! : MU-CONC-OF ( cfg -- n ) 2 / CELLS MU-CONC-LEVELS + @ ; : MU-MODE-OF ( cfg -- m ) 2 MOD ; VARIABLE MU-UNIFORM-WL 8 MU-UNIFORM-WL ! Block 5045 : WL-CAPSULE ( idx -- c-addr u ) CASE 0 OF S" workload-0.4th" ENDOF 1 OF S" workload-1-lite.4th" ENDOF 2 OF S" workload-2.4th" ENDOF 3 OF S" workload-3.4th" ENDOF 4 OF S" workload-4.4th" ENDOF 5 OF S" workload-5-lite.4th" ENDOF 6 OF S" workload-6.4th" ENDOF 7 OF S" workload-7.4th" ENDOF 8 OF S" workload-8.4th" ENDOF 9 OF S" workload-9.4th" ENDOF ENDCASE ; Block 5046 ( FABRIC-3.9.8 O-C: event-driven. Workers are born defs-only ) ( and each is SENT one job: WL-RUN, nothing else. Its end ) ( reaches Hera as the OS's own EV-DONE (ON-DONE, block 5054) ) ( -- no job text SENDs anything, and Hera never waits. ) VARIABLE MU-DONE-COUNT VARIABLE MU-ACTIVE : MU-JOB ( -- c-addr u ) S" WL-RUN" ; Block 5047 : MU-WORKER-NAME ( n -- c-addr u ) CASE 0 OF S" mu0" ENDOF 1 OF S" mu1" ENDOF 2 OF S" mu2" ENDOF 3 OF S" mu3" ENDOF 4 OF S" mu4" ENDOF 5 OF S" mu5" ENDOF 6 OF S" mu6" ENDOF 7 OF S" mu7" ENDOF ENDCASE ; VARIABLE MU-TMP-NC VARIABLE MU-TMP-NU Block 5048 : MU-WL-FOR ( mode worker-n -- wl-idx ) SWAP IF 10 MOD ELSE DROP MU-UNIFORM-WL @ THEN ; : MU-BIRTH-WORKER ( wl-idx worker-n -- ok? ) MU-WORKER-NAME MU-TMP-NU ! MU-TMP-NC ! WL-CAPSULE MU-TMP-NC @ MU-TMP-NU @ WORKER-BIRTH ; Block 5049 VARIABLE MU-FAIL-COUNT : MU-SEND-WORKER ( worker-n -- ) MU-JOB ROT MU-WORKER-NAME SEND 0= IF MU-FAIL-COUNT @ 1+ MU-FAIL-COUNT ! MU-DONE-COUNT @ 1+ MU-DONE-COUNT ! THEN ; : MU-KILL-WORKER ( worker-n -- ) MU-WORKER-NAME KILL ; CREATE MU-RUN-MATRIX MU-MAX-RUNS CELLS ALLOT : MU-MATRIX! ( val idx -- ) CELLS MU-RUN-MATRIX + ! ; : MU-MATRIX@ ( idx -- val ) CELLS MU-RUN-MATRIX + @ ; VARIABLE MU-N-RUNS : MU-INIT-MATRIX ( -- ) MU-N-RUNS @ 0 DO I I MU-MATRIX! LOOP ; CREATE MU-ISA-TAG-BUF 16 ALLOT VARIABLE MU-ISA-TAG-LEN : MU-ISA-TAG! ( c-addr u -- ) 16 MIN DUP MU-ISA-TAG-LEN ! MU-ISA-TAG-BUF SWAP CMOVE ; Block 5050 VARIABLE MU-SW-I VARIABLE MU-SW-J VARIABLE MU-SW-VI VARIABLE MU-SW-VJ : MU-SWAP-MTX ( i j -- ) MU-SW-J ! MU-SW-I ! MU-SW-I @ MU-MATRIX@ MU-SW-VI ! MU-SW-J @ MU-MATRIX@ MU-SW-VJ ! MU-SW-VJ @ MU-SW-I @ MU-MATRIX! MU-SW-VI @ MU-SW-J @ MU-MATRIX! ; : MU-SHUFFLE ( -- ) MU-N-RUNS @ 1 - 0 DO I MU-N-RUNS @ 1 - RANDOM I MU-SWAP-MTX LOOP ; Block 5051 VARIABLE MU-RUN-ID VARIABLE MU-CFG VARIABLE MU-REP VARIABLE MU-NW VARIABLE MU-MODE VARIABLE MU-NREPS : MU-EMIT-TRIAL-MARKER ( -- ) ." MU-TRIAL isa=" MU-ISA-TAG-BUF MU-ISA-TAG-LEN @ TYPE ." run=" MU-RUN-ID @ . ." cfg=" MU-CFG @ . ." rep=" MU-REP @ . ." nw=" MU-NW @ . ." mode=" MU-MODE @ . ." fail=" MU-FAIL-COUNT @ . CR MU-RUN-ID @ MU-CFG @ MU-REP @ MU-NW @ MU-MODE @ MU-FAIL-COUNT @ MU-ISA-TAG-BUF MU-ISA-TAG-LEN @ DOE-PERSIST-TRIAL ; Block 5052 : MU-BIRTH-ALL ( -- ) MU-NW @ 0 DO MU-MODE @ I MU-WL-FOR I MU-BIRTH-WORKER DROP LOOP ; : MU-SEND-ALL ( -- ) MU-NW @ 0 DO I MU-SEND-WORKER LOOP ; ( O-C: MU-WAIT-ALL is gone. The trial's end runs through ) ( MU-END-XT, set after MU-END-TRIAL is defined, breaking the ) ( start -> send -> end -> start cycle in definition order. ) VARIABLE MU-END-XT : MU-CHECK-END ( -- ) MU-DONE-COUNT @ MU-NW @ < 0= IF MU-END-XT @ EXECUTE THEN ; Block 5053 : MU-KILL-ALL ( -- ) MU-NW @ 0 DO I MU-KILL-WORKER LOOP ; ( O-C: a trial STARTS -- births, sends, returns. It ends in ) ( MU-END-TRIAL, run from ON-DONE when the last worker is done. ) : MU-START-TRIAL ( cfg rep -- ) MU-REP ! MU-CFG ! 0 MU-FAIL-COUNT ! 0 MU-DONE-COUNT ! MU-CFG @ MU-CONC-OF MU-NW ! MU-CFG @ MU-MODE-OF MU-MODE ! MU-BIRTH-ALL MU-SEND-ALL MU-CHECK-END ; Block 5054 VARIABLE MU-IDX : MU-START-IDX ( -- ) MU-IDX @ MU-MATRIX@ DUP MU-NREPS @ / SWAP MU-NREPS @ MOD MU-START-TRIAL ; : MU-FINISH ( -- ) 0 MU-ACTIVE ! HB-OFF EV-DONE UNJOIN DROP ." MU-CAMPAIGN: complete" CR ; : MU-END-TRIAL ( -- ) MU-KILL-ALL MU-EMIT-TRIAL-MARKER MU-RUN-ID @ 1+ MU-RUN-ID ! MU-IDX @ 1+ MU-IDX ! MU-IDX @ MU-N-RUNS @ < IF MU-START-IDX ELSE MU-FINISH THEN ; ' MU-END-TRIAL MU-END-XT ! Block 5055 ( EV-DONE handler: count only this campaign's own workers, ) ( mu0..mu7, and only while a campaign is running. ) : MU-OURS? ( c-addr u -- f ) 2 < IF DROP 0 EXIT THEN DUP C@ 109 = SWAP 1+ C@ 117 = AND ; : ON-DONE ( c-addr u -- ) MU-ACTIVE @ 0= IF 2DROP EXIT THEN MU-OURS? 0= IF EXIT THEN MU-DONE-COUNT @ 1+ MU-DONE-COUNT ! MU-CHECK-END ; : MU-EXEC-CAMPAIGN ( seed n-reps start-idx -- ) MU-IDX ! DUP MU-NREPS ! MU-N-CFG * MU-N-RUNS ! SEED MU-INIT-MATRIX MU-SHUFFLE HB-ON MU-IDX @ MU-RUN-ID ! MU-IDX @ MU-N-RUNS @ < IF EV-DONE JOIN DROP 1 MU-ACTIVE ! MU-START-IDX ELSE MU-FINISH THEN ;