Files
LithosAnanake/capsules/multiuser-doe.4th
T
Robert Allan JamesandClaude Opus 5.5 ac42cf36b5 Stage O-C: the event-driven DoE driver -- DOE returns to the prompt, EV-DONE chains the trials, MU-WAIT-ALL deleted (FABRIC-3.9.0 §3/§7.4)
- DOE sets up, JOINs EV-DONE and starts trial 1, then returns. Each trial
  births and sends WL-RUN only; completion arrives as the OS's EV-DONE.
- ON-DONE counts this campaign's own workers while active; the last one
  ends the trial (KILL all, marker, persist) and starts the next, or
  finishes (HB-OFF, UNJOIN, MU-CAMPAIGN: complete). MU-WAIT-ALL is gone;
  the start/end cycle goes through MU-END-XT.
- WL-DONE-ARGS removed from all ten workload capsules; lint passes.

Smoke campaign (amd64, 1 rep, rows off per Captain Bob): DOE returns, the
prompt answers mid-trial, all 6 trials chain on events, fail=0 each,
28/28 born/killed/departed, MU-CAMPAIGN: complete in ~61 min. Standard
sequence passes on all three ISAs (with the xHCI fix it exposed, df150e86).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 10:58:11 -04:00

175 lines
5.0 KiB
Forth

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 ;