aboutsummaryrefslogtreecommitdiffstats
path: root/docs/research
diff options
context:
space:
mode:
authoreunhhu <[email protected]>2026-10-09 15:56:48 +0100
committereunhhu <[email protected]>2026-10-09 15:56:48 +0100
commit75aa418924fbaf510174713aa007482169bbd114 (patch)
tree23d852a9cbb53bc3b7b6c4ee2700f0375399a881 /docs/research
parentf47f0caa14889013436438f2bcb2c482a58e630b (diff)
downloadpure-75aa418924fbaf510174713aa007482169bbd114.tar.gz
pure-75aa418924fbaf510174713aa007482169bbd114.zip
043 programs (research 139, in progress): a batch loop's body as the program a load would make, interpreted a step at a time (scalar steps by the executor's rules, kernel steps over four-byte lane registers fixed at load with two buffers each, a list's cells once a batch, a deferred set after its distance check), against the same kernels called straight and natural.h's C: matmul 10.36 ms (straight 7.17; the executor's 25.8 with 3.6 of making), knapsack 4.16 (straight 3.76; the executor's 8.19); 139's question, bars and b20's split (matmul's 11.1 ms of interpretation, knapsack's 1.9)
Diffstat (limited to 'docs/research')
-rw-r--r--docs/research/139-batch-programs-at-load.md52
1 files changed, 52 insertions, 0 deletions
diff --git a/docs/research/139-batch-programs-at-load.md b/docs/research/139-batch-programs-at-load.md
new file mode 100644
index 0000000..ba4a0c9
--- /dev/null
+++ b/docs/research/139-batch-programs-at-load.md
@@ -0,0 +1,52 @@
+# 139 — 루프마다 미리 짠 프로그램: 무엇이 남고, 어디까지 내려가는가 (연구)
+
+2026-10-09. 025를 마친 뒤 남은 큰 틈(matmul의 안쪽 회차, knapsack의 묶음마다)이 무엇인지 재고, 루프마다 로드 때 짠 프로그램(026이 될 것)이
+그것을 얼마나 줄일 수 있는지 시제품으로 정한다. 사용자의 말: "헷갈리는 것이 있으면 연구부터" (2026-10-09).
+
+## 쉬운 말로 (실험 전에 적은 것)
+
+- **남은 값은 뜻의 검사가 아니라 해석이다.** b20에서 matmul(25.8 ms)의 값은 커널 8.7, 해석 11.1(명령을 읽고 `Val`을 쌓고 꼴을 묻기),
+ 리스트의 사실 2.2(회차마다 다시 찾기), 행렬 만들기 약 3.6, 검사 0.2 ms다. 묶음마다·회차마다의 뜻의 검사는 작다. 041의 시제품은 같은
+ 몸체를 C에서 커널 셋을 바로 불러 17.8 ms였는데(8바이트 레인), 그 C는 균일 값과 행의 시작을 스칼라로 셈하고 해석이 없었다. 지금의 4바이트
+ 커널은 041보다 빠르다. 틈은 해석이다.
+- **물음.** 레지스터 꼴의 프로그램(로드 때 짬)이, 041의 C가 공짜로 한 것(균일·아핀 걸음, 묶음에 한 번 찾는 리스트의 사실, 로드 때 정한
+ 버퍼)을 하면서 실행기의 검사와 되돌아가기를 지키면, 회차마다의 일이 얼마나 싸지는가.
+- **막대**(지금의 갈래에서 셈). matmul = 커널 8.7 + 만들기 3.6 + 검사 0.2 + 묶음에 한 번의 리스트 사실 약 0.3 + 해석 ≤ 2 ms(안쪽 회차마다
+ ≤ 50 ns, 걸음 약 8에 약 120 사이클) → **≤ 15 ms**(기계어 14.2, 그것도 만들기를 포함한다). knapsack = 커널 4.1 + 만들기 0.9 + 검사 0.66 +
+ 리스트 사실 약 0.3 + 해석 ≤ 0.5 → **≤ 6.5 ms**(기계어 7.9, C 6.25). 둘 다 "기계어에 닿는다"이고, 026이 약속할 것은 이것이다.
+
+## 잰 것: b20의 갈래
+
+방법: `b20`(`3e76a60`) `suite-run`, `PURE_JIT=0`, 2 kHz 표본, 같은 프로세스의 C로 ms를 내고 잰 시간에 맞췄다. 줄을 갈래로 나눴다:
+커널(레인 루프), 해석(`pass`, 조각, 지역 변수, `uniform`, `sweep`, `word_op`의 준비, 정수 검사 …), 리스트의 사실(`find`, `cells_at`의 준비,
+`rows_in`, `read_of`), 검사(`settle`, 가르기, 묶음의 앞뒤), 만들기(점화식, 덧붙이기, 리스트 쪽).
+
+| 갈래 | matmul (25.8 ms) | knapsack (8.19 ms) |
+|---|---:|---:|
+| 커널 | 8.7 | 4.1 |
+| 해석 | **11.1** | 1.9 |
+| 리스트의 사실 | 2.2 | 0.6 |
+| 검사 | 0.2 | 0.7 |
+| 만들기(점화식, 덧붙이기, 리스트 쪽) | 3.6 | 0.9 |
+
+matmul의 해석 11.1 ms(안쪽 회차 4만 번, 회차마다 약 660 사이클): 조각의 스칼라 걸음 2.0, `sweep` 2.0, `pass`의 머리 1.6, `word_op`의 준비
+1.2, `uniform` 0.9, 필드 읽기 0.5, 정수 검사 0.5, 지역 변수 쓰기 0.4 ms. 모두 회차마다 같은 답을 다시 셈한다.
+
+**025에 남은 것 하나.** `sweep`(회차마다 버퍼를 거두기)이 2.0 ms다. 025의 2단계가 "값마다의 버퍼 자리를 로드 때 정해 `fresh`·`release`·
+`sweep`이 빈 버퍼를 찾지 않게" 하자고 적고, 1단계를 잰 뒤에 정한다며 미뤘다가 돌아오지 않았다. 이 연구가 그것이 어디에 들지를 정한다.
+
+041을 이 기기에서 다시 돌렸다(`041-batches/batch.c`, 레인 256): matmul `batch_j` 17.76 ms, knapsack `u32_ops`(연산 목록을 `run()`으로
+해석) 4.54 ms.
+
+## 범위
+
+철학 안: 루프마다 로드 때 한 번 짠 프로그램, 걸음마다 고른 C 커널, 실행 시간에 코드를 만들지 않음(024의 문장, 132의 A). 철학 밖이고 하지
+않음: 합친 연산의 표, 실행 시간의 코드 만들기, 데이터에 따라 맞고 틀리는 기록-되풀이(기계어 없는 JIT). 026은 앞의 것이다.
+
+## 결정할 실험
+
+(아래에 채운다)
+
+## 짤 수 있는가: 스위트의 몸체 다섯
+
+(아래에 채운다)