From 3d550920377b5744c426795624a005f96001036b Mon Sep 17 00:00:00 2001 From: "russell@unturf.com" Date: Sat, 18 Apr 2026 11:33:39 -0400 Subject: [PATCH] asm-gc: adaptive EMA-driven meta-GC policy + bench + two correctness fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Moves the meta-GC from greedy (always verify) to adaptive: track a scaled EMA of recent escape rate; when rate exceeds 50% (128/256), SKIP the verifier and let the heap grow until natural GC; every 16 skipped arenas, force a verify as a probe to re-sample the rate. Two correctness fixes uncovered while testing adaptive: 1. gc_mark_env was picking up 24-byte strings and closures as if they were env nodes (size check alone is ambiguous). Now also requires offset 0 to be tagged TAG_SYM, which env nodes always are and strings/closures never are. 2. gc_mark_drain's vector/hash-table dispatch walked `length` elements without sanity-checking that `8 + length*8` fits in the block. A 25-char string (40-byte payload) misinterpreted as a 25-element vector walked 200 bytes off the end, reading adjacent blocks' bytes as tagged roots and setting mark bits on wrong things. Both paths now validate the header's payload-size against the claimed length / nbuckets before walking. New builtin: (arena-set-mode 0|1) — 0 = greedy baseline, 1 = adaptive (default) arena-stats extended to six fields: (calls resets escapes skipped bytes-reclaimed ema-rate) Bench (tests/bench-gc-adaptive.sh, one process per phase to isolate a separate latent cross-phase bug we haven't cracked, N=1000 per phase, i5-8350U): workload mode time_ms resets escapes skipped friendly greedy 732 1000 0 0 friendly adapt 691 1000 0 0 hostile greedy 568 0 1000 0 hostile adapt 607 0 1000 11 mixed greedy 1981 17 1983 0 mixed adapt 1694 14 1986 2 Adaptive wins on friendly (-6%) and mixed (-17%). On fully hostile workloads both modes are dominated by implicit full-GC firings (982/1000 arenas trigger heap overflow that clears arena_active before reaching the policy), so adaptive barely activates and greedy happens to edge out by ~7%. The mixed result is the clear adaptive win — and the one that matches the pattern the policy was designed for: probe-and-adapt as the workload shifts. 137 asm (no-GC) + 137 asm (GC) + 189 shared functional tests all still pass. --- asm/uncommonlisp-gc | Bin 58432 -> 59016 bytes asm/uncommonlisp-gc.o | Bin 60032 -> 61440 bytes asm/uncommonlisp.s | 239 ++++++++++++++++++++++++++------- examples/bench-gc-adaptive.lsp | 51 +++++++ tests/bench-gc-adaptive.sh | 37 +++++ 5 files changed, 275 insertions(+), 52 deletions(-) create mode 100644 examples/bench-gc-adaptive.lsp create mode 100755 tests/bench-gc-adaptive.sh diff --git a/asm/uncommonlisp-gc b/asm/uncommonlisp-gc index d3170876c1355e4bcd7557231280ca6cb4c3f731..5e479c697285f5662abcaaa7cfba5487d0fbbfd9 100755 GIT binary patch literal 59016 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Ν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" @@ -383,7 +385,7 @@ bi_names: .quad bn_htexists, bn_htsize, bn_htkeys, bn_htvals, bn_htalist .quad bn_hsmake, bn_hsp, bn_hsadd, bn_hshas, bn_hssize, bn_hslist .ifdef GC_NAIVE - .quad bn_gccollect, bn_gcstats, bn_witharena, bn_arenastats + .quad bn_gccollect, bn_gcstats, bn_witharena, bn_arenastats, bn_arenamode .endif # Error messages @@ -476,6 +478,18 @@ arena_calls: .skip 8 arena_resets: .skip 8 arena_escapes: .skip 8 arena_bytes_reclaimed: .skip 8 +# ── Adaptive policy state ── +# EMA of recent escape rate, scaled 0..256 (256 = 100% escape). +# Update on each arena: rate = (rate*7 + sample*256) / 8 where +# sample is 0 for reset, 1 for escape. When rate > threshold and +# probe countdown > 0, bi_with_arena skips the verifier and goes +# straight to gc_sweep (treats it as an escape). When countdown +# reaches zero, forces a verify as a probe so the policy can +# re-evaluate whether escapes are still dominant. +arena_escape_rate: .skip 8 # 0..256 +arena_verifies_skipped: .skip 8 +arena_probe_countdown: .skip 8 +arena_adaptive_mode: .skip 8 # 0 = greedy (always verify), 1 = adaptive .endif # ============================================================ @@ -510,6 +524,8 @@ _start: leaq HEAP_SIZE(%rax), %rcx movq %rcx, gc_chunk_end(%rip) movq $1, gc_chunk_count(%rip) + # Default: adaptive policy on. (arena-set-mode 0) disables it. + movq $1, arena_adaptive_mode(%rip) .endif # Init global env = 0 (empty) @@ -995,11 +1011,20 @@ gc_mark_env: popq %rdi testq %rcx, %rcx jz .gme_end - # Block's header payload-size must be 24 (our env-node sentinel). + # Block's header payload-size must be 24 AND offset 0 must be + # a tagged symbol. Env nodes are (sym, val, parent); strings + # and closures are also 24 bytes when they happen to land at + # that size, so a bare size check treats them as env and the + # walker corrupts the heap by reading string bytes as env + # fields. Demanding TAG_SYM at offset 0 disambiguates. movq -8(%rdi), %rax shrq $1, %rax cmpq $24, %rax jne .gme_end + movq (%rdi), %rax + andq $7, %rax + cmpq $TAG_SYM, %rax + jne .gme_end # Already marked? Skip. testq $1, -8(%rdi) jnz .gme_end @@ -1137,27 +1162,28 @@ gc_mark_drain: call gc_mark_env # env field is an untagged env chain jmp .gmd_top .gmd_vec7: + # Block size from header. The conservative stack scan can push + # any value whose low 3 bits happen to equal 7; that untagged + # "pointer" might land in a chunk but belong to a string or + # closure, not an actual vector. Validate size against the + # claimed length/layout before walking — otherwise a 40-byte + # string misinterpreted as a 25-element vector reads 200 bytes + # past itself and corrupts marks on adjacent blocks. + movq -8(%rsi), %rax + shrq $1, %rax # block payload size movq (%rsi), %rdx # first word: length or -1 or -2 + cmpq $-2, %rdx + je .gmd_ht_check + cmpq $-1, %rdx + je .gmd_ht_check testq %rdx, %rdx - jns .gmd_vector_body - # Hash-table (-1) or hash-set (-2): buckets 0..nbuckets-1 at offset 24. - movq 16(%rsi), %rcx # nbuckets - xorq %r8, %r8 -.gmd_ht_loop: - cmpq %rcx, %r8 - jae .gmd_top - pushq %rcx - pushq %r8 - pushq %rsi - movq 24(%rsi,%r8,8), %rdi - call gc_push_if_heap - popq %rsi - popq %r8 - popq %rcx - incq %r8 - jmp .gmd_ht_loop -.gmd_vector_body: - # Vector: length = rdx; elements at offset 8. + js .gmd_top # other negatives = not ours + # Vector: length must fit: 8 + length*8 <= block_size + movq %rdx, %rcx + shlq $3, %rcx + addq $8, %rcx + cmpq %rax, %rcx + ja .gmd_top # length too large for block xorq %r8, %r8 .gmd_vec_loop: cmpq %rdx, %r8 @@ -1172,6 +1198,34 @@ gc_mark_drain: popq %rdx incq %r8 jmp .gmd_vec_loop + +.gmd_ht_check: + # Hash-table (-1) or hash-set (-2): require block size >= 24 + # (header) + nbuckets * 8. nbuckets at offset 16. + cmpq $24, %rax + jb .gmd_top + movq 16(%rsi), %rcx # nbuckets + testq %rcx, %rcx + js .gmd_top # garbage + movq %rcx, %rdx + shlq $3, %rdx + addq $24, %rdx + cmpq %rax, %rdx + ja .gmd_top # nbuckets too large + xorq %r8, %r8 +.gmd_ht_loop: + cmpq %rcx, %r8 + jae .gmd_top + pushq %rcx + pushq %r8 + pushq %rsi + movq 24(%rsi,%r8,8), %rdi + call gc_push_if_heap + popq %rsi + popq %r8 + popq %rcx + incq %r8 + jmp .gmd_ht_loop .gmd_done: ret @@ -3323,6 +3377,8 @@ eval_list: je bi_with_arena cmpq $BI_ARENA_STATS, %rax je bi_arena_stats + cmpq $BI_ARENA_SET_MODE, %rax + je bi_arena_set_mode .endif movq $VAL_VOID, %rax @@ -6006,83 +6062,167 @@ bi_hash_set_to_list: # stays pristine for a verbatim restore; heap_alloc enforces this. # ============================================================ -# bi_with_arena: (with-arena thunk) -> thunk's return value +# bi_with_arena: (with-arena thunk) -> thunk's return value. +# Meta-GC dispatch with adaptive policy: +# 1. Run thunk. Zero volatile regs so conservative scan is clean. +# 2. If implicit GC fired mid-thunk (arena_active cleared) -> +# abort. EMA += escape. +# 3. If adaptive mode on AND escape_rate > threshold AND probe +# countdown > 0: SKIP verify, run sweep directly (faster than +# verify+sweep on a hostile workload). EMA += escape. +# 4. Otherwise (greedy mode, low escape rate, or probe fires): +# call arena_verify_and_commit. Its return value (0/1) feeds +# the EMA update. bi_with_arena: GETARG %rbx # thunk - # Snapshot. movq %r15, %rax movq %rax, arena_r15_snap(%rip) movq $1, arena_active(%rip) incq arena_calls(%rip) - # Invoke thunk with no args. movq %rbx, %rdi movq $VAL_NIL, %rsi call apply_proc_raw movq %rax, %rbx # result (tagged) - # Zero every volatile register before verify's stack scan runs. - # apply_proc_raw leaves stale tagged pointers in callee registers - # (closure envs, intermediate pair chains) that the conservative - # scan would otherwise treat as live roots pointing into the - # arena, triggering a false escape. %rbx keeps the result. + # Zero volatile regs so the conservative stack scan in verify + # doesn't pick up stale tagged pointers apply_proc_raw leaves + # behind (would look like live roots pointing into the arena). + # DO NOT zero %rbp — the interpreter keeps the caller's local + # env there, and wiping it loses the binding for the variable + # that friendly-loop / any user-closure caller was resolving. xorq %rax, %rax xorq %rcx, %rcx xorq %rdx, %rdx xorq %rsi, %rsi xorq %rdi, %rdi - xorq %rbp, %rbp xorq %r8, %r8 xorq %r9, %r9 xorq %r10, %r10 xorq %r11, %r11 xorq %r12, %r12 - # If an implicit GC fired during the thunk, arena_active was - # cleared and the snapshot is now stale. Skip reset. + + # (a) implicit-GC abort? cmpq $0, arena_active(%rip) je .bwa_abort_gc - # Verify: mark phase with result as extra root. Then scan the - # arena range for any marked block; if any, it escaped. + + # (b) adaptive skip? + cmpq $0, arena_adaptive_mode(%rip) + je .bwa_verify # greedy mode, always verify + movq arena_escape_rate(%rip), %rax + cmpq $ARENA_SKIP_THRESHOLD, %rax + jbe .bwa_verify # rate low -> verify + cmpq $0, arena_probe_countdown(%rip) + je .bwa_probe # countdown 0 -> probe + # Skip verify entirely. Don't call gc_sweep either — sweep + # without a mark phase would reclaim live data. Leave the heap + # as-is; the arena's allocations stay bumped. Correctness: all + # live data remains reachable via normal roots. Cost: no verify, + # no sweep. When bump eventually overflows, gc_collect fires + # naturally and reclaims dead blocks with a proper mark pass. + decq arena_probe_countdown(%rip) + incq arena_verifies_skipped(%rip) + incq arena_escapes(%rip) + movq $0, arena_active(%rip) + movq $1, %rdi # escape sample for EMA + call arena_update_ema + jmp .bwa_done + +.bwa_probe: + # Probe: reset countdown and run verify as a sample. + movq $ARENA_PROBE_EVERY, %rax + movq %rax, arena_probe_countdown(%rip) + jmp .bwa_verify + +.bwa_verify: movq %rbx, %rdi - call arena_verify_and_commit - movq %rbx, %rax - RET_VAL + call arena_verify_and_commit # returns 0 (reset) or 1 (escape) + movq %rax, %rdi + call arena_update_ema + jmp .bwa_done + .bwa_abort_gc: incq arena_escapes(%rip) + movq $1, %rdi + call arena_update_ema + +.bwa_done: movq %rbx, %rax RET_VAL +# arena_update_ema: %rdi = sample (0 for reset, 1 for escape). +# rate = (rate*7 + sample*256) / 8 +arena_update_ema: + movq arena_escape_rate(%rip), %rax + shlq $3, %rax # rate * 8 + subq arena_escape_rate(%rip), %rax # rate * 7 + testq %rdi, %rdi + jz .aue_zero + addq $256, %rax # escape sample = 256 +.aue_zero: + shrq $3, %rax # / 8 + movq %rax, arena_escape_rate(%rip) + ret + +.equ ARENA_SKIP_THRESHOLD, 128 # 50% escape rate +.equ ARENA_PROBE_EVERY, 16 # force a verify every 16 skipped + +# bi_arena_set_mode: (arena-set-mode 0|1) -> void. 0 = greedy (always +# verify), 1 = adaptive (skip verify when escape rate is high). +bi_arena_set_mode: + GETARG %rax + sarq $3, %rax # untag int + movq %rax, arena_adaptive_mode(%rip) + # Reset EMA and countdown so the mode change starts clean. + movq $0, arena_escape_rate(%rip) + movq $0, arena_probe_countdown(%rip) + movq $VAL_VOID, %rax + RET_VAL + # bi_arena_stats: (arena-stats) -> (list calls resets escapes bytes-reclaimed) bi_arena_stats: - # Build right-to-left: NIL -> (bytes) -> (escapes bytes) -> ... - movq arena_bytes_reclaimed(%rip), %rdi + # Build right-to-left: NIL -> (rate) -> (skipped rate) -> ... + # Final order: (calls resets escapes skipped bytes rate) + movq arena_escape_rate(%rip), %rdi call make_int movq %rax, %rdi movq $VAL_NIL, %rsi - call make_pair # (bytes) + call make_pair # (rate) + movq %rax, %rbx + movq arena_bytes_reclaimed(%rip), %rdi + call make_int + movq %rax, %rdi + movq %rbx, %rsi + call make_pair # (bytes rate) + movq %rax, %rbx + movq arena_verifies_skipped(%rip), %rdi + call make_int + movq %rax, %rdi + movq %rbx, %rsi + call make_pair # (skipped bytes rate) movq %rax, %rbx movq arena_escapes(%rip), %rdi call make_int movq %rax, %rdi movq %rbx, %rsi - call make_pair # (escapes bytes) + call make_pair # (escapes skipped bytes rate) movq %rax, %rbx movq arena_resets(%rip), %rdi call make_int movq %rax, %rdi movq %rbx, %rsi - call make_pair # (resets escapes bytes) + call make_pair # (resets escapes skipped bytes rate) movq %rax, %rbx movq arena_calls(%rip), %rdi call make_int movq %rax, %rdi movq %rbx, %rsi - call make_pair # (calls resets escapes bytes) + call make_pair # (calls resets escapes skipped bytes rate) RET_VAL # arena_verify_and_commit: %rdi = thunk result (tagged). # Runs mark phase, detects escape, commits reset or falls through # to naive sweep. Updates arena_resets / arena_escapes counters. +# Returns %rax = 0 if reset succeeded, 1 if escape (for EMA update). arena_verify_and_commit: - pushq %rax pushq %rbx pushq %rcx pushq %rdx @@ -6203,18 +6343,14 @@ arena_verify_and_commit: movq %rax, %r15 movq $0, arena_active(%rip) incq arena_resets(%rip) - # Now run sweep to clean mark bits on pre-snapshot live blocks - # and rebuild the free list from anything below that became dead - # during the arena (nothing, currently, since we disabled free - # list reuse — but sweep is still the easiest way to clear marks). call gc_sweep + xorq %rax, %rax # return 0 (reset) jmp .avc_done .avc_escape: movq $0, arena_active(%rip) incq arena_escapes(%rip) - # Fall through to naive sweep on the full range, which also - # clears mark bits set during verify. call gc_sweep + movq $1, %rax # return 1 (escape) .avc_done: popq %r12 popq %r11 @@ -6227,7 +6363,6 @@ arena_verify_and_commit: popq %rdx popq %rcx popq %rbx - popq %rax ret .endif diff --git a/examples/bench-gc-adaptive.lsp b/examples/bench-gc-adaptive.lsp new file mode 100644 index 0000000..b5beba0 --- /dev/null +++ b/examples/bench-gc-adaptive.lsp @@ -0,0 +1,51 @@ +;;; bench-gc-adaptive.lsp — driver that runs ONE workload phase in +;;; this process. The outer wrapper (tests/bench-gc-adaptive.sh) +;;; launches asm-gc six times, one per (workload × mode) pair, each +;;; with a clean interpreter. One-phase-per-process isolates state +;;; across runs; cross-phase heap residue on a 1 MB chunk has caused +;;; spurious escape reports in the meta-GC that we haven't nailed +;;; yet, and we'd rather report clean numbers than fight a latent +;;; interaction mid-bench. The MODE and WORKLOAD are injected by +;;; the wrapper via pre-bindings of *mode* and *workload*. + +(define K 200) +(define N 1000) + +(define (build-list k acc) + (if (= k 0) acc (build-list (- k 1) (cons k acc)))) +(define (sum-list lst acc) + (if (null? lst) acc (sum-list (cdr lst) (+ acc (car lst))))) + +(define (friendly-thunk) (sum-list (build-list K '()) 0)) +(define escaped-sink '()) +(define (hostile-step) + (set! escaped-sink (with-arena (lambda () (build-list K '()))))) + +(define (friendly-go n) + (if (= n 0) 'done + (begin (with-arena friendly-thunk) (friendly-go (- n 1))))) +(define (hostile-go n) + (if (= n 0) 'done + (begin (hostile-step) (hostile-go (- n 1))))) +(define (mixed-go n) + (if (= n 0) 'done + (begin + (with-arena friendly-thunk) + (hostile-step) + (mixed-go (- n 1))))) + +(arena-set-mode *mode*) + +(define t0 (current-time-ms)) +(cond + ((= *workload* 0) (friendly-go N)) + ((= *workload* 1) (hostile-go N)) + (else (mixed-go N))) +(define elapsed (- (current-time-ms) t0)) + +(display "workload=") (display *workload*) +(display " mode=") (display *mode*) +(display " N=") (display N) (newline) +(display "time_ms=") (display elapsed) (newline) +(display "arena-stats=") (display (arena-stats)) (newline) +(display "gc-stats=") (display (gc-stats)) (newline) diff --git a/tests/bench-gc-adaptive.sh b/tests/bench-gc-adaptive.sh new file mode 100755 index 0000000..0667689 --- /dev/null +++ b/tests/bench-gc-adaptive.sh @@ -0,0 +1,37 @@ +#!/bin/bash +# bench-gc-adaptive.sh — greedy vs adaptive meta-GC policy across +# friendly / hostile / mixed workloads. Each (workload × mode) pair +# runs in a fresh asm-gc process to isolate GC state. +set -e +cd "$(dirname "$0")/.." + +ulimit -v 524288 +trap 'pkill -9 -u "$USER" -f "asm/uncommonlisp" 2>/dev/null || true' EXIT + +make -s -C asm all + +run_phase() { + local workload_name="$1" + local workload="$2" + local mode="$3" + local mode_name="$4" + echo "== $workload_name / $mode_name ==" + { + echo "(define *workload* $workload)" + echo "(define *mode* $mode)" + cat examples/bench-gc-adaptive.lsp + } | timeout 60 ./asm/uncommonlisp-gc + echo "" +} + +run_phase "friendly" 0 0 "greedy" +run_phase "friendly" 0 1 "adaptive" +run_phase "hostile" 1 0 "greedy" +run_phase "hostile" 1 1 "adaptive" +run_phase "mixed" 2 0 "greedy" +run_phase "mixed" 2 1 "adaptive" + +if pgrep -u "$USER" -f 'asm/uncommonlisp' > /dev/null; then + echo "STRAGGLER" >&2 + exit 1 +fi