From c788046717f466c6681376207f368d52854cfdee Mon Sep 17 00:00:00 2001 From: eunhhu Date: Tue, 13 Oct 2026 07:49:11 +0100 Subject: Research 140: 2b's instruction counts: the workloads' modules the same, batches within 0.001% of 2a (BFS +0.36%, within its own runs' spread), the executor alone -1.3% to +0.4% (step's four cases more, mixed signs; -1.31% to +0.59% from before stage 1), the bank's queries -0.66% to +0.05% (four runs each; bar 1%); CHECKPOINT's direction row through 027's 2b --- CHECKPOINT.md | 2 +- docs/research/140-spec-suite.md | 8 ++++++++ .../040-against-c/2026-10-13-counts-s26.jsonl | 4 ++++ .../040-against-c/2026-10-13-counts-s26b.jsonl | 4 ++++ .../experiments/041-batches/2026-10-13-counts.jsonl | 20 ++++++++++++++++++++ 5 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 research/experiments/040-against-c/2026-10-13-counts-s26.jsonl create mode 100644 research/experiments/040-against-c/2026-10-13-counts-s26b.jsonl diff --git a/CHECKPOINT.md b/CHECKPOINT.md index 7bab2d4..3c05d86 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는 경계에 남는다. 계산의 핵을 다섯 단계로 다시 세운다(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) | +| 방향(1.0 전) | 앱 계약을 1.0에서 얼릴 후보로 적었다: 이벤트는 전함수이고 원자적이며 결정적이다, 시간은 입력이다, 보기는 커밋된 상태의 순수 함수다, 보이는 역사는 커밋의 앞부분이다, 전달은 순서대로 한 번이다. 계산의 언어(명령 90개, 상태 종류 7개)는 패턴의 모음이라 다시 세운다. 분야마다 고른 명세 열한 개의 묶음에서 오늘의 aup는 바이트, 비트 연산, 중첩, 재귀, 갈래, 글자 읽기에 막힌다(탐침 열 개). 1.0 전에는 호환을 챙기지 않고, JSON과 HTTP는 경계에 남는다. 계산의 핵을 다섯 단계로 다시 세운다(027). 1단계(비트 연산, 자리의 바이트, 수의 리스트, 한 번에 주기)로 aup로 쓴 SHA-256이 공식 벡터를 세 실행 길에서 모두 지난다. 2a(형식 지정, 바이트 잇기와 자르기, 바이트와 text의 let, `while`, 단락 평가의 `&&`·`||`)로 쓴 JSON 검사기가 JSONTestSuite에서 하나도 틀리지 않는다. 2b(레코드 안의 레코드, 갈래와 `match`, 레코드 안의 리스트, 수 읽기)로 JSON을 트리로 읽어 다이제스트가 파이썬과 같다(JSONTestSuite, 무작위 문서 300개). 줄 수는 검사기만 파이썬 이하이고(80 대 90), SHA-256(42 대 28)과 트리(167 대 133)는 길다. 시간은 C의 40–159배이고 바이트를 다루는 일은 순수 파이썬과 비슷하거나 느리다(0.43–1.3배): 핵이 선 뒤 빠르게 할 과녁이다 | [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 67d1cec..f8dda2a 100644 --- a/docs/research/140-spec-suite.md +++ b/docs/research/140-spec-suite.md @@ -291,6 +291,14 @@ 원본: `research/experiments/044-specs/json_tree.py`(파이썬 참조), `json_tree_time.c`(cJSON과 견줌, 다이제스트가 같아야 잰다), `2026-10-13-stage2b.jsonl`. +**기존 일의 명령 수(2b).** +- b26(010fa06)의 워크로드 모듈은 b24와 바이트까지 같다. +- 묶음의 길은 2a 대비 +0.001%다. BFS는 +0.36%인데, 같은 빌드에서도 0.1–0.3% 오가는 수다. +- 실행기만의 길은 2a 대비 matmul −1.23%, roots −1.32%, join −0.18%, knapsack +0.44%, BFS +0.32%다. `step`에 경우 넷이 더해진 + 코드 생성의 이동이라 부호가 엇갈린다. 1단계 전(b21) 대비로는 −1.31%에서 +0.59%다. +- 은행 질의(s25 대 s26, 각 네 번)는 −0.66%에서 +0.05%다(막대 ±1%). +- 원본: `041-batches/2026-10-13-counts.jsonl`(b24, b26), `040-against-c/2026-10-13-counts-s26.jsonl`, `-s26b.jsonl`. + ## 착수 기준 (다음 일) - **바꿀 결정.** 계산의 핵을 설계한다(027). 위 표의 여덟 후보 가운데 무엇을 어떤 모양으로 받을지 정한다. diff --git a/research/experiments/040-against-c/2026-10-13-counts-s26.jsonl b/research/experiments/040-against-c/2026-10-13-counts-s26.jsonl new file mode 100644 index 0000000..08f8c5c --- /dev/null +++ b/research/experiments/040-against-c/2026-10-13-counts-s26.jsonl @@ -0,0 +1,4 @@ +{"serve": "pure-serve", "per_branch": {"instructions": 27084102, "cycles": 15238714}, "in_credit": {"instructions": 3512990, "cycles": 1844147}, "large": {"instructions": 1426001, "cycles": 686956}, "ranks": {"instructions": 24456923, "cycles": 16790533}, "none": {"instructions": 617310, "cycles": 222865}, "field": {"instructions": 9059207, "cycles": 3403821}, "found": {"instructions": 14212183, "cycles": 11186003}} +{"serve": "pure-serve", "per_branch": {"instructions": 27186268, "cycles": 12114704}, "in_credit": {"instructions": 3536479, "cycles": 2133136}, "large": {"instructions": 1421189, "cycles": 651243}, "ranks": {"instructions": 24507195, "cycles": 15157017}, "none": {"instructions": 617586, "cycles": 198493}, "field": {"instructions": 8999045, "cycles": 3357350}, "found": {"instructions": 14151006, "cycles": 11388316}} +{"serve": "pure-serve", "per_branch": {"instructions": 27079187, "cycles": 12336521}, "in_credit": {"instructions": 3511995, "cycles": 1715215}, "large": {"instructions": 1425953, "cycles": 643320}, "ranks": {"instructions": 24455634, "cycles": 15222701}, "none": {"instructions": 617302, "cycles": 209178}, "field": {"instructions": 9059199, "cycles": 3391426}, "found": {"instructions": 14212080, "cycles": 11504188}} +{"serve": "pure-serve", "per_branch": {"instructions": 27307087, "cycles": 13489724}, "in_credit": {"instructions": 3563452, "cycles": 2332634}, "large": {"instructions": 1421173, "cycles": 720693}, "ranks": {"instructions": 24573327, "cycles": 17577195}, "none": {"instructions": 617586, "cycles": 239506}, "field": {"instructions": 8999045, "cycles": 3425525}, "found": {"instructions": 14151365, "cycles": 13950743}} diff --git a/research/experiments/040-against-c/2026-10-13-counts-s26b.jsonl b/research/experiments/040-against-c/2026-10-13-counts-s26b.jsonl new file mode 100644 index 0000000..ba647d9 --- /dev/null +++ b/research/experiments/040-against-c/2026-10-13-counts-s26b.jsonl @@ -0,0 +1,4 @@ +{"serve": "pure-serve", "per_branch": {"instructions": 27257751, "cycles": 12280504}, "in_credit": {"instructions": 3552148, "cycles": 1715953}, "large": {"instructions": 1426112, "cycles": 658813}, "ranks": {"instructions": 24553725, "cycles": 15261076}, "none": {"instructions": 617310, "cycles": 202571}, "field": {"instructions": 9059207, "cycles": 3369597}, "found": {"instructions": 14212960, "cycles": 11144044}} +{"serve": "pure-serve", "per_branch": {"instructions": 27127430, "cycles": 12406802}, "in_credit": {"instructions": 3523224, "cycles": 1725024}, "large": {"instructions": 1421165, "cycles": 657540}, "ranks": {"instructions": 24475383, "cycles": 15240572}, "none": {"instructions": 617594, "cycles": 211360}, "field": {"instructions": 8999053, "cycles": 3385928}, "found": {"instructions": 14151598, "cycles": 11171298}} +{"serve": "pure-serve", "per_branch": {"instructions": 27287641, "cycles": 12285362}, "in_credit": {"instructions": 3559028, "cycles": 2452529}, "large": {"instructions": 1425841, "cycles": 885103}, "ranks": {"instructions": 24570473, "cycles": 16043057}, "none": {"instructions": 617310, "cycles": 256221}, "field": {"instructions": 9059207, "cycles": 3586133}, "found": {"instructions": 14208095, "cycles": 13494821}} +{"serve": "pure-serve", "per_branch": {"instructions": 27051224, "cycles": 11842398}, "in_credit": {"instructions": 3505938, "cycles": 1642599}, "large": {"instructions": 1421244, "cycles": 633219}, "ranks": {"instructions": 24432431, "cycles": 15305242}, "none": {"instructions": 617594, "cycles": 202822}, "field": {"instructions": 8999053, "cycles": 3377586}, "found": {"instructions": 14151622, "cycles": 11241946}} diff --git a/research/experiments/041-batches/2026-10-13-counts.jsonl b/research/experiments/041-batches/2026-10-13-counts.jsonl index 21c96c8..df5aa39 100644 --- a/research/experiments/041-batches/2026-10-13-counts.jsonl +++ b/research/experiments/041-batches/2026-10-13-counts.jsonl @@ -58,3 +58,23 @@ {"version":"b22","way":"rounds","work":"join","instructions":7671461339,"cycles":3779172383} {"version":"b22","way":"batches","work":"bfs","instructions":3369486682,"cycles":1696184951} {"version":"b22","way":"rounds","work":"bfs","instructions":4699835166,"cycles":2145127934} +{"version":"b26","way":"batches","work":"matmul","instructions":713394383,"cycles":230837845} +{"version":"b26","way":"rounds","work":"matmul","instructions":21265242983,"cycles":7092391610} +{"version":"b26","way":"batches","work":"knapsack","instructions":348629831,"cycles":107480698} +{"version":"b26","way":"rounds","work":"knapsack","instructions":21816294291,"cycles":7888622817} +{"version":"b26","way":"batches","work":"roots","instructions":157302525,"cycles":109727216} +{"version":"b26","way":"rounds","work":"roots","instructions":2719815307,"cycles":1033573737} +{"version":"b26","way":"batches","work":"join","instructions":1783718353,"cycles":1077011356} +{"version":"b26","way":"rounds","work":"join","instructions":7659168649,"cycles":3596941828} +{"version":"b26","way":"batches","work":"bfs","instructions":3371507512,"cycles":1681179072} +{"version":"b26","way":"rounds","work":"bfs","instructions":4716041915,"cycles":2112898648} +{"version":"b24","way":"batches","work":"matmul","instructions":713386424,"cycles":230605083} +{"version":"b24","way":"rounds","work":"matmul","instructions":21529238850,"cycles":6828812015} +{"version":"b24","way":"batches","work":"knapsack","instructions":348626328,"cycles":106684625} +{"version":"b24","way":"rounds","work":"knapsack","instructions":21721478257,"cycles":7608840672} +{"version":"b24","way":"batches","work":"roots","instructions":157299182,"cycles":109591597} +{"version":"b24","way":"rounds","work":"roots","instructions":2756246826,"cycles":992415334} +{"version":"b24","way":"batches","work":"join","instructions":1783708908,"cycles":1102956119} +{"version":"b24","way":"rounds","work":"join","instructions":7673263242,"cycles":3692142359} +{"version":"b24","way":"batches","work":"bfs","instructions":3359486525,"cycles":1687662182} +{"version":"b24","way":"rounds","work":"bfs","instructions":4701037983,"cycles":2111610158} -- cgit v1.2.3