From 109ea31ef2ca06210e196c1b8fa7005cd9ef5ce9 Mon Sep 17 00:00:00 2001 From: eunhhu Date: Tue, 13 Oct 2026 05:19:58 +0100 Subject: Research 140: stage 1's instruction counts: the workloads' modules byte for byte the same, the executor alone moved matmul +0.43% and BFS -0.34% (knapsack, roots, join within 0.03%; the bar of 0.1% missed, mixed signs: four cases more in step), the bank's queries -0.22% to 0.00% (bar 1%); the four cases out of line in a noinline function (b23) cost 6-15% of the executor's instructions (a call taking frame from step: the register cliff) and were taken back; CHECKPOINT's direction row through 027's stage 1 --- CHECKPOINT.md | 2 +- docs/research/140-spec-suite.md | 16 ++++++++- .../040-against-c/2026-10-13-counts-s22.jsonl | 4 +++ .../041-batches/2026-10-13-counts.jsonl | 40 ++++++++++++++++++++++ 4 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 research/experiments/040-against-c/2026-10-13-counts-s22.jsonl create mode 100644 research/experiments/041-batches/2026-10-13-counts.jsonl diff --git a/CHECKPOINT.md b/CHECKPOINT.md index 71c693f..7bab2d4 100644 --- a/CHECKPOINT.md +++ b/CHECKPOINT.md @@ -26,7 +26,7 @@ | 표 크기의 상태 | 목록이 영속 B+트리다(변경·키 탐색·저장본 위치 O(log n), 스냅숏 O(1), 1,600만 항목, 런타임 상태 1 GiB). pgbench의 TPC-B 같은 이체(세 표의 행과 이력, 한 트랜잭션)가 10만 계좌에서 RAM 24.5k/s(전: 3만 계좌 3.2k/s), SD 카드 내구 1,339/s(SQLite WAL FULL 84–153/s) | [090](docs/research/090-tables.md) | | 일반 트랜잭션 | TPC-C의 다섯 트랜잭션을 aup 앱 하나로 쓴다(여러 표 읽기·쓰기, 조각 훑기, 중복 없는 셈, 실패하면 통째 되돌림). 같은 입력에서 SQLite와 아홉 표의 모든 행이 같다(창고 하나와 넷). RAM 초당 40,976건(W=4 35,838; 조율한 SQLite 10,164, 트랜잭션당 CPU 43–50 µs, HTTP·JSON 포함), SD 카드 내구 4,980건(W=4 4,590). SQLite도 카드에 맞게 조율하고 묶어 커밋하면 739건(W=4 426)이다. 남은 차이는 거래당 쓰는 바이트다(SQLite는 페이지째 써서 8–18배) | [092](docs/research/092-tpcc.md), [106](docs/research/106-tpcc-conditions-first.md), [107](docs/research/107-snapshot-nodes-reused.md) | | 질의 | 질의는 앱의 상태 위에 보기를 더한 모듈이다(`aup query`, `PUT·GET /queries/이름`). 검증한 뒤 스냅숏에서 돌고, 열 안의 fold가 그 행을 읽는다(상관 부질의). 잎이 항목을 필드별로 들고, fold와 필터는 잎 하나씩 돌며(결함이 날 잎만 항목별로), 열 안의 그룹·순위 fold는 목록을 한 번 지나 모든 행에 답한다. 10만 계좌에서 지점별 합계 4.9 ms(SQLite 45, 인덱스를 주면 14.3), 조인 0.48 ms(1.47), 자기 조인 순위 6.8 ms(2,840, 인덱스를 주면 7.6). Pure에는 인덱스 선언이 없다 | [091](docs/research/091-queries.md) | -| 방향(1.0 전) | 앱 계약을 1.0에서 얼릴 후보로 적었다: 이벤트는 전함수이고 원자적이며 결정적이다, 시간은 입력이다, 보기는 커밋된 상태의 순수 함수다, 보이는 역사는 커밋의 앞부분이다, 전달은 순서대로 한 번이다. 계산의 언어(명령 90개, 상태 종류 7개)는 패턴의 모음이라 다시 세운다. 분야마다 고른 명세 열한 개의 묶음에서 오늘의 aup는 바이트, 비트 연산, 중첩, 재귀, 갈래, 글자 읽기에 막힌다(탐침 열 개). 1.0 전에는 호환을 챙기지 않고, JSON과 HTTP는 경계에 남는다 | [026](docs/design/026-app-contract.md), [140](docs/research/140-spec-suite.md) | +| 방향(1.0 전) | 앱 계약을 1.0에서 얼릴 후보로 적었다: 이벤트는 전함수이고 원자적이며 결정적이다, 시간은 입력이다, 보기는 커밋된 상태의 순수 함수다, 보이는 역사는 커밋의 앞부분이다, 전달은 순서대로 한 번이다. 계산의 언어(명령 90개, 상태 종류 7개)는 패턴의 모음이라 다시 세운다. 분야마다 고른 명세 열한 개의 묶음에서 오늘의 aup는 바이트, 비트 연산, 중첩, 재귀, 갈래, 글자 읽기에 막힌다(탐침 열 개). 1.0 전에는 호환을 챙기지 않고, JSON과 HTTP는 경계에 남는다. 계산의 핵을 다섯 단계로 다시 세운다(027). 1단계(비트 연산, 자리의 바이트, 수의 리스트, 한 번에 주기)로 aup로 쓴 SHA-256이 공식 벡터를 세 실행 길에서 모두 지난다. 다만 파이썬보다 길고(52 대 28줄) C의 176배다 | [026](docs/design/026-app-contract.md), [027](docs/design/027-computation-core.md), [140](docs/research/140-spec-suite.md) | 키로 나눈 소유자와 저장을 넘길 스레드는 하지 않기로 했다. 이 장치는 동기화를 한 줄로 세워, 나누면 쓰기가 23% 줄고 넘겨도 기기의 일은 줄지 않는다([084](docs/research/084-parallel-syncs.md)). 다만 동기화가 공짜인 RAM에서 TPC-C는 소유자 하나가 diff --git a/docs/research/140-spec-suite.md b/docs/research/140-spec-suite.md index 4b799df..60d40ff 100644 --- a/docs/research/140-spec-suite.md +++ b/docs/research/140-spec-suite.md @@ -150,7 +150,8 @@ | 공식 벡터 모두 | 142/142, 세 길 | 지남 | | 줄 수 ≤ 파이썬 참조 | aup 52줄(닫는 괄호만인 줄 7) 대 파이썬 28줄 | **못 미침** | | C 대비 시간 | 65,536바이트에서 바이트당 1,591 ns 대 C 9.0 ns: **176배**. 순수 파이썬은 3,708 ns(Pure가 2.3배 빠름) | 기록(막대 없음) | -| 기존 일의 명령 수 | 아래 | 아래 | +| 실행기만의 길, 다섯 일의 명령 ±0.1% | matmul +0.43%, BFS −0.34%, 나머지 셋 ±0.03% | **못 미침**(아래) | +| 은행 질의의 명령 ±1% | 질의 일곱 개가 −0.22%에서 0.00% | 지남 | 원본: `research/experiments/044-specs/` - `check.py`: 맞음과 줄 수 @@ -158,6 +159,19 @@ - `sha256.py`: 파이썬 참조 - `2026-10-13-sha256.jsonl`: 잰 수 +**기존 일의 명령 수.** +- 비교 대상은 b21(338c665)과 b22(41a2e5c)다. 워크로드 모듈은 두 빌드에서 바이트까지 같다(aup의 새 문법은 옛 소스의 코드를 바꾸지 + 않는다). 그래서 차이는 실행기의 코드에서만 온다. +- 실행기만의 길(PURE_BATCH=0): + - knapsack, roots, join은 +0.02%, 0.00%, +0.02%다. + - matmul은 +0.43%, BFS는 −0.34%다. 부호가 엇갈리므로 일이 아니라, `step`에 경우 넷을 더해 컴파일러가 코드를 다르게 짠 것이다. + - 묶음의 길도 −0.36%에서 +0.14%다. +- 그 넷을 인라인되지 않는 함수 하나로 빼 보았다(b23). 실행기만의 길에서 명령이 6–15% 늘었다(roots +15.4%, matmul +11.1%, + BFS +6.3%). `step` 안에서 `frame`을 넘기는 호출 하나가 실행기 전체의 값을 메모리로 밀어내는 절벽이다. 그래서 되돌리고 인라인의 + 꼴을 둔다. 막대(±0.1%)에는 못 미친 채로 적는다. +- 은행 질의(s21 대 s22, 각 두 번)는 −0.22%에서 0.00%다. 막대(±1%) 안이다. +- 원본: `041-batches/2026-10-13-counts.jsonl`(b21, b22, b23), `040-against-c/2026-10-13-counts-s22.jsonl`. + **줄을 길게 한 것.** 처음 쓴 것은 72줄이었다. 한 번에 주기가 없어서 상태 여덟 개를 옮기는 데만 24줄이 들었다. 그것을 1단계에 넣어(싸고 범용이다) 52줄이 됐다. 남은 차이는 다음이다. - 형식 지정이 없다. 16진 다이제스트에 7줄이 들었고, 파이썬은 `f'{x:08x}'` 한 줄이다. diff --git a/research/experiments/040-against-c/2026-10-13-counts-s22.jsonl b/research/experiments/040-against-c/2026-10-13-counts-s22.jsonl new file mode 100644 index 0000000..a8bc144 --- /dev/null +++ b/research/experiments/040-against-c/2026-10-13-counts-s22.jsonl @@ -0,0 +1,4 @@ +{"serve": "pure-serve", "per_branch": {"instructions": 27277327, "cycles": 12521098}, "in_credit": {"instructions": 3555347, "cycles": 1727380}, "large": {"instructions": 1419266, "cycles": 635285}, "ranks": {"instructions": 24576440, "cycles": 15098298}, "none": {"instructions": 615608, "cycles": 201453}, "field": {"instructions": 9007140, "cycles": 3293193}, "found": {"instructions": 14138595, "cycles": 11152298}} +{"serve": "pure-serve", "per_branch": {"instructions": 27245159, "cycles": 12335668}, "in_credit": {"instructions": 3548203, "cycles": 1643795}, "large": {"instructions": 1418203, "cycles": 626835}, "ranks": {"instructions": 24540489, "cycles": 15109900}, "none": {"instructions": 615600, "cycles": 198615}, "field": {"instructions": 8987089, "cycles": 3379269}, "found": {"instructions": 14136563, "cycles": 11456537}} +{"serve": "pure-serve", "per_branch": {"instructions": 27254641, "cycles": 12402614}, "in_credit": {"instructions": 3550367, "cycles": 1784791}, "large": {"instructions": 1419115, "cycles": 629545}, "ranks": {"instructions": 24563665, "cycles": 15251048}, "none": {"instructions": 615608, "cycles": 215072}, "field": {"instructions": 9007140, "cycles": 3310034}, "found": {"instructions": 14136155, "cycles": 11191218}} +{"serve": "pure-serve", "per_branch": {"instructions": 27241076, "cycles": 12235100}, "in_credit": {"instructions": 3547210, "cycles": 1695243}, "large": {"instructions": 1418203, "cycles": 654392}, "ranks": {"instructions": 24536879, "cycles": 15388450}, "none": {"instructions": 615600, "cycles": 202412}, "field": {"instructions": 8986986, "cycles": 3353373}, "found": {"instructions": 14136698, "cycles": 11380094}} diff --git a/research/experiments/041-batches/2026-10-13-counts.jsonl b/research/experiments/041-batches/2026-10-13-counts.jsonl new file mode 100644 index 0000000..1ce2959 --- /dev/null +++ b/research/experiments/041-batches/2026-10-13-counts.jsonl @@ -0,0 +1,40 @@ +{"version":"b21","way":"batches","work":"matmul","instructions":712373863,"cycles":231285206} +{"version":"b21","way":"rounds","work":"matmul","instructions":21436716312,"cycles":6627046518} +{"version":"b21","way":"batches","work":"knapsack","instructions":348467334,"cycles":108971916} +{"version":"b21","way":"rounds","work":"knapsack","instructions":21688103023,"cycles":7534433045} +{"version":"b21","way":"batches","work":"roots","instructions":157587366,"cycles":109574669} +{"version":"b21","way":"rounds","work":"roots","instructions":2755945483,"cycles":987613235} +{"version":"b21","way":"batches","work":"join","instructions":1790209319,"cycles":1138195102} +{"version":"b21","way":"rounds","work":"join","instructions":7669661804,"cycles":3552710443} +{"version":"b21","way":"batches","work":"bfs","instructions":3358271366,"cycles":1799155912} +{"version":"b21","way":"rounds","work":"bfs","instructions":4711634330,"cycles":2111102110} +{"version":"b22","way":"batches","work":"matmul","instructions":713384697,"cycles":233469040} +{"version":"b22","way":"rounds","work":"matmul","instructions":21529596474,"cycles":7133885622} +{"version":"b22","way":"batches","work":"knapsack","instructions":348623832,"cycles":105438942} +{"version":"b22","way":"rounds","work":"knapsack","instructions":21692082138,"cycles":7895357997} +{"version":"b22","way":"batches","work":"roots","instructions":157299294,"cycles":109561365} +{"version":"b22","way":"rounds","work":"roots","instructions":2755945582,"cycles":1062025791} +{"version":"b22","way":"batches","work":"join","instructions":1783709071,"cycles":1138916922} +{"version":"b22","way":"rounds","work":"join","instructions":7671461452,"cycles":3691930011} +{"version":"b22","way":"batches","work":"bfs","instructions":3365486934,"cycles":1682419615} +{"version":"b22","way":"rounds","work":"bfs","instructions":4695835340,"cycles":2139890198} +{"version":"b23","way":"batches","work":"matmul","instructions":713396728,"cycles":230634989} +{"version":"b23","way":"rounds","work":"matmul","instructions":23814167660,"cycles":6929205123} +{"version":"b23","way":"batches","work":"knapsack","instructions":348640620,"cycles":106463019} +{"version":"b23","way":"rounds","work":"knapsack","instructions":23841569109,"cycles":7776297154} +{"version":"b23","way":"batches","work":"roots","instructions":157299548,"cycles":110050298} +{"version":"b23","way":"rounds","work":"roots","instructions":3180389280,"cycles":1010234680} +{"version":"b23","way":"batches","work":"join","instructions":1783707618,"cycles":1068427873} +{"version":"b23","way":"rounds","work":"join","instructions":8534868597,"cycles":3567287721} +{"version":"b23","way":"batches","work":"bfs","instructions":3359478710,"cycles":1685037112} +{"version":"b23","way":"rounds","work":"bfs","instructions":5008018326,"cycles":2202220966} +{"version":"b21","way":"batches","work":"matmul","instructions":712374039,"cycles":231321891} +{"version":"b21","way":"rounds","work":"matmul","instructions":21436716261,"cycles":6631584887} +{"version":"b21","way":"batches","work":"knapsack","instructions":348467367,"cycles":108483093} +{"version":"b21","way":"rounds","work":"knapsack","instructions":21688103040,"cycles":7534696732} +{"version":"b21","way":"batches","work":"roots","instructions":157587322,"cycles":109861963} +{"version":"b21","way":"rounds","work":"roots","instructions":2755945346,"cycles":988101655} +{"version":"b21","way":"batches","work":"join","instructions":1790209314,"cycles":1134651176} +{"version":"b21","way":"rounds","work":"join","instructions":7669661569,"cycles":3593363686} +{"version":"b21","way":"batches","work":"bfs","instructions":3358271260,"cycles":1692916302} +{"version":"b21","way":"rounds","work":"bfs","instructions":4711634325,"cycles":2111516521} -- cgit v1.2.3