aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoreunhhu <[email protected]>2026-10-11 11:49:52 +0100
committereunhhu <[email protected]>2026-10-11 11:49:52 +0100
commit338c6653e545e18178316975123d9789e6885d28 (patch)
treee63930e60130c55b509a86ac84fe3202e7be8c4c
parentce18bc417b4b329065b883a63553419e122e1939 (diff)
downloadpure-338c6653e545e18178316975123d9789e6885d28.tar.gz
pure-338c6653e545e18178316975123d9789e6885d28.zip
Batch executor: the round's fewest-left marks at the end of Batch: put after spare_count they moved its large arrays and knapsack ran 7% slower at the same instructions (8.79 against 8.29 ms), at its end about 2% (8.45); research 139's afterword: 026 not taken heavily (the user's word), the one light cut made (a nested count loop's rounds sweeping only when few lanes are left: matmul 25.85 to 24.3 ms), the walk loops kept sweeping each round (held, BFS's batches ran out), and the stop; 041 runs of b21
-rw-r--r--core/module-batch.c2
-rw-r--r--docs/research/139-batch-programs-at-load.md16
-rw-r--r--research/experiments/041-batches/2026-10-11-counts.jsonl10
-rw-r--r--research/experiments/041-batches/2026-10-11-pairs.jsonl50
4 files changed, 77 insertions, 1 deletions
diff --git a/core/module-batch.c b/core/module-batch.c
index 56f9e18..3b9df87 100644
--- a/core/module-batch.c
+++ b/core/module-batch.c
@@ -212,7 +212,6 @@ typedef struct {
bool none; /* no lane runs here */
Split splits[SPLITS];
unsigned split_count, buffers, masks, read_count, store_count, spare_count;
- unsigned low_buffers, low_masks; /* the fewest left since a round began (tide) */
void *spare[BUFFERS]; /* lanes no value holds any more */
Read reads[READS];
Store stores[STORES];
@@ -233,6 +232,7 @@ typedef struct {
unsigned cells_count;
const uint32_t *sel; /* a selection running (NULL: none): its lanes */
Selection selection;
+ unsigned low_buffers, low_masks; /* the fewest left since a round began (tide) */
} Batch;
static _Thread_local Batch batch;
diff --git a/docs/research/139-batch-programs-at-load.md b/docs/research/139-batch-programs-at-load.md
index dbfaef1..a4cfa20 100644
--- a/docs/research/139-batch-programs-at-load.md
+++ b/docs/research/139-batch-programs-at-load.md
@@ -97,3 +97,19 @@ BFS는 그 다음 단계(레인마다의 나감 마스크; 레인 공간 둘과
미룬 쓰기와 의존 검사, 읽기의 기록, 작업량, 결함의 회차. 한 뜻에 두 구현이 서는 것은 025가 `pass`를 고쳐 나가며 피한 위험이다. 2단계에서
통한 방법(견줌 빌드에서 프로그램을 마른 채로 돌리고 `pass`도 돌려 견주고, 단계가 끝나면 견줌을 지움)을 그대로 쓰되, 이번에는 스칼라가
아니라 레인 배열을 비트까지 견줘야 하므로 더 무겁다.
+
+## 그 뒤 (2026-10-11): 무겁게 가지 않기로
+
+사용자는 026을 무겁게 가지 않기로 했다(곧은 줄의 걸음을 `pass`와 따로 짜고 레인을 견주는 장치를 두는 일). 그래서 이 연구가 찾은 값 가운데
+지금의 실행기 안에서 가볍게 줄일 수 있는 것 하나만 했다: 회차마다의 버퍼 거두기(`sweep`, matmul 2.0 ms).
+
+- **중첩 세는 루프의 회차는 덜 거둔다**(`ce18bc4`). `fresh`와 `new_mask`가 남은 수의 가장 적은 때를 적고, 회차 끝에서 남은 것이 한 회차가
+ 가장 많이 쓴 것보다 하나 많은 데까지 줄었을 때만 거둔다. 루프 뒤에는 마지막 회차가 거두지 않았으면 한 번 거둔다. 거두기를 늦출 뿐이라
+ 뜻은 같다. matmul 명령 −3.6%, 사이클 −4.5%, 25.85 → 24.3 ms(−6%).
+- **걷기의 회차와 펼친 걷기의 덩어리는 전처럼 회차마다 거둔다.** 같은 규칙을 주자 BFS의 묶음이 레인을 다 써 실행기로 돌아갔다(36.9 ms,
+ 답은 같음). 걸러내기와 고르기가 쓰는 양을 회차의 가장 적은 남은 수가 다 말해 주지 못한다. 빈 목록에 넣는 길을 모두 읽었고, 아직 쓰이는
+ 버퍼를 넣는 길은 없었다(맞음의 문제가 아니라 빠르기의 문제다).
+- **묶음 구조체의 가운데에 필드를 넣으면 knapsack이 같은 명령으로 7% 느려졌다.** 뒤의 큰 배열들이 자리를 옮긴 값이다. 필드를 구조체 끝으로
+ 옮기자 +2% 안팎으로 돌아왔다. 새 필드는 `Batch`의 끝에 둔다.
+- 이것으로 멈춘다. 남은 가벼운 값(조각의 정수 검사를 로드 때 증명하기 등)은 이와 같은 크기에, 같은 배치의 흔들림 안에 있다.
+
diff --git a/research/experiments/041-batches/2026-10-11-counts.jsonl b/research/experiments/041-batches/2026-10-11-counts.jsonl
new file mode 100644
index 0000000..69ea1d9
--- /dev/null
+++ b/research/experiments/041-batches/2026-10-11-counts.jsonl
@@ -0,0 +1,10 @@
+{"version":"b21","way":"batches","work":"bfs","instructions":3358270636,"cycles":1671437937}
+{"version":"b21","way":"rounds","work":"bfs","instructions":4715634135,"cycles":2107076767}
+{"version":"b21","way":"batches","work":"knapsack","instructions":348467375,"cycles":108390825}
+{"version":"b21","way":"rounds","work":"knapsack","instructions":21688103174,"cycles":7534541074}
+{"version":"b21","way":"batches","work":"matmul","instructions":712374642,"cycles":232990099}
+{"version":"b21","way":"rounds","work":"matmul","instructions":21436716472,"cycles":6627605709}
+{"version":"b21","way":"batches","work":"roots","instructions":157587236,"cycles":109712806}
+{"version":"b21","way":"rounds","work":"roots","instructions":2755945502,"cycles":988043831}
+{"version":"b21","way":"batches","work":"join","instructions":1790209421,"cycles":1115187719}
+{"version":"b21","way":"rounds","work":"join","instructions":7669661644,"cycles":3460540079}
diff --git a/research/experiments/041-batches/2026-10-11-pairs.jsonl b/research/experiments/041-batches/2026-10-11-pairs.jsonl
new file mode 100644
index 0000000..53148c0
--- /dev/null
+++ b/research/experiments/041-batches/2026-10-11-pairs.jsonl
@@ -0,0 +1,50 @@
+{"version":"b20","way":"batches","turn":1,"work":"roots","pure_median_ms":8.331,"c_median_ms":6.873,"ratio":1.212,"agree":true}
+{"version":"b20","way":"batches","turn":1,"work":"knapsack","pure_median_ms":8.290,"c_median_ms":6.254,"ratio":1.325,"agree":true}
+{"version":"b20","way":"batches","turn":1,"work":"join","pure_median_ms":119.576,"c_median_ms":35.820,"ratio":3.338,"agree":true}
+{"version":"b20","way":"batches","turn":1,"work":"matmul","pure_median_ms":25.831,"c_median_ms":7.920,"ratio":3.261,"agree":true}
+{"version":"b20","way":"batches","turn":1,"work":"bfs","pure_median_ms":23.612,"c_median_ms":10.607,"ratio":2.226,"agree":true}
+{"version":"b21","way":"batches","turn":1,"work":"roots","pure_median_ms":8.327,"c_median_ms":6.874,"ratio":1.211,"agree":true}
+{"version":"b21","way":"batches","turn":1,"work":"knapsack","pure_median_ms":8.875,"c_median_ms":6.262,"ratio":1.417,"agree":true}
+{"version":"b21","way":"batches","turn":1,"work":"join","pure_median_ms":122.104,"c_median_ms":33.184,"ratio":3.680,"agree":true}
+{"version":"b21","way":"batches","turn":1,"work":"matmul","pure_median_ms":24.262,"c_median_ms":7.834,"ratio":3.097,"agree":true}
+{"version":"b21","way":"batches","turn":1,"work":"bfs","pure_median_ms":24.559,"c_median_ms":10.874,"ratio":2.259,"agree":true}
+{"version":"b20","way":"batches","turn":2,"work":"roots","pure_median_ms":8.334,"c_median_ms":6.866,"ratio":1.214,"agree":true}
+{"version":"b20","way":"batches","turn":2,"work":"knapsack","pure_median_ms":8.293,"c_median_ms":6.264,"ratio":1.324,"agree":true}
+{"version":"b20","way":"batches","turn":2,"work":"join","pure_median_ms":120.779,"c_median_ms":36.725,"ratio":3.289,"agree":true}
+{"version":"b20","way":"batches","turn":2,"work":"matmul","pure_median_ms":25.931,"c_median_ms":7.869,"ratio":3.295,"agree":true}
+{"version":"b20","way":"batches","turn":2,"work":"bfs","pure_median_ms":23.646,"c_median_ms":10.407,"ratio":2.272,"agree":true}
+{"version":"b21","way":"batches","turn":2,"work":"roots","pure_median_ms":8.309,"c_median_ms":6.867,"ratio":1.210,"agree":true}
+{"version":"b21","way":"batches","turn":2,"work":"knapsack","pure_median_ms":8.795,"c_median_ms":6.268,"ratio":1.403,"agree":true}
+{"version":"b21","way":"batches","turn":2,"work":"join","pure_median_ms":122.287,"c_median_ms":36.510,"ratio":3.349,"agree":true}
+{"version":"b21","way":"batches","turn":2,"work":"matmul","pure_median_ms":24.163,"c_median_ms":7.596,"ratio":3.181,"agree":true}
+{"version":"b21","way":"batches","turn":2,"work":"bfs","pure_median_ms":24.598,"c_median_ms":11.043,"ratio":2.227,"agree":true}
+{"version":"b20","way":"batches","turn":3,"work":"roots","pure_median_ms":8.309,"c_median_ms":6.875,"ratio":1.209,"agree":true}
+{"version":"b20","way":"batches","turn":3,"work":"knapsack","pure_median_ms":8.320,"c_median_ms":6.251,"ratio":1.331,"agree":true}
+{"version":"b20","way":"batches","turn":3,"work":"join","pure_median_ms":119.463,"c_median_ms":36.537,"ratio":3.270,"agree":true}
+{"version":"b20","way":"batches","turn":3,"work":"matmul","pure_median_ms":25.971,"c_median_ms":7.616,"ratio":3.410,"agree":true}
+{"version":"b20","way":"batches","turn":3,"work":"bfs","pure_median_ms":23.925,"c_median_ms":10.442,"ratio":2.291,"agree":true}
+{"version":"b21","way":"batches","turn":3,"work":"roots","pure_median_ms":8.293,"c_median_ms":6.864,"ratio":1.208,"agree":true}
+{"version":"b21","way":"batches","turn":3,"work":"knapsack","pure_median_ms":8.764,"c_median_ms":6.242,"ratio":1.404,"agree":true}
+{"version":"b21","way":"batches","turn":3,"work":"join","pure_median_ms":120.574,"c_median_ms":33.043,"ratio":3.649,"agree":true}
+{"version":"b21","way":"batches","turn":3,"work":"matmul","pure_median_ms":24.352,"c_median_ms":7.879,"ratio":3.091,"agree":true}
+{"version":"b21","way":"batches","turn":3,"work":"bfs","pure_median_ms":24.691,"c_median_ms":11.016,"ratio":2.241,"agree":true}
+{"version":"b20","way":"batches","turn":4,"work":"roots","pure_median_ms":8.465,"c_median_ms":6.894,"ratio":1.228,"agree":true}
+{"version":"b20","way":"batches","turn":4,"work":"knapsack","pure_median_ms":8.245,"c_median_ms":6.263,"ratio":1.317,"agree":true}
+{"version":"b20","way":"batches","turn":4,"work":"join","pure_median_ms":119.767,"c_median_ms":34.775,"ratio":3.444,"agree":true}
+{"version":"b20","way":"batches","turn":4,"work":"matmul","pure_median_ms":25.850,"c_median_ms":7.545,"ratio":3.426,"agree":true}
+{"version":"b20","way":"batches","turn":4,"work":"bfs","pure_median_ms":24.113,"c_median_ms":10.306,"ratio":2.340,"agree":true}
+{"version":"b21","way":"batches","turn":4,"work":"roots","pure_median_ms":8.305,"c_median_ms":6.866,"ratio":1.210,"agree":true}
+{"version":"b21","way":"batches","turn":4,"work":"knapsack","pure_median_ms":8.783,"c_median_ms":6.247,"ratio":1.406,"agree":true}
+{"version":"b21","way":"batches","turn":4,"work":"join","pure_median_ms":119.957,"c_median_ms":33.978,"ratio":3.530,"agree":true}
+{"version":"b21","way":"batches","turn":4,"work":"matmul","pure_median_ms":24.556,"c_median_ms":7.699,"ratio":3.190,"agree":true}
+{"version":"b21","way":"batches","turn":4,"work":"bfs","pure_median_ms":25.233,"c_median_ms":10.743,"ratio":2.349,"agree":true}
+{"version":"b20","way":"batches","turn":5,"work":"roots","pure_median_ms":8.520,"c_median_ms":6.876,"ratio":1.239,"agree":true}
+{"version":"b20","way":"batches","turn":5,"work":"knapsack","pure_median_ms":8.254,"c_median_ms":6.260,"ratio":1.319,"agree":true}
+{"version":"b20","way":"batches","turn":5,"work":"join","pure_median_ms":116.003,"c_median_ms":32.765,"ratio":3.540,"agree":true}
+{"version":"b20","way":"batches","turn":5,"work":"matmul","pure_median_ms":25.826,"c_median_ms":7.826,"ratio":3.300,"agree":true}
+{"version":"b20","way":"batches","turn":5,"work":"bfs","pure_median_ms":23.914,"c_median_ms":10.598,"ratio":2.256,"agree":true}
+{"version":"b21","way":"batches","turn":5,"work":"roots","pure_median_ms":8.326,"c_median_ms":6.867,"ratio":1.212,"agree":true}
+{"version":"b21","way":"batches","turn":5,"work":"knapsack","pure_median_ms":8.841,"c_median_ms":6.247,"ratio":1.415,"agree":true}
+{"version":"b21","way":"batches","turn":5,"work":"join","pure_median_ms":121.084,"c_median_ms":33.851,"ratio":3.577,"agree":true}
+{"version":"b21","way":"batches","turn":5,"work":"matmul","pure_median_ms":24.203,"c_median_ms":7.669,"ratio":3.156,"agree":true}
+{"version":"b21","way":"batches","turn":5,"work":"bfs","pure_median_ms":24.896,"c_median_ms":10.369,"ratio":2.401,"agree":true}