aboutsummaryrefslogtreecommitdiffstats
path: root/docs
diff options
context:
space:
mode:
authoreunhhu <[email protected]>2026-10-05 19:36:25 +0100
committereunhhu <[email protected]>2026-10-05 19:36:25 +0100
commita099d63e2322f5ae17e8fbdc51d6cc020638a5dc (patch)
tree3ca0f992daf7a8dc6baed19f686d6c03b85a719e /docs
parentb611a1f95a0ebe917691154c430368eecc479162 (diff)
downloadpure-a099d63e2322f5ae17e8fbdc51d6cc020638a5dc.tar.gz
pure-a099d63e2322f5ae17e8fbdc51d6cc020638a5dc.zip
125: forms and newton runs named; BFS's time after the graph's load is the generic code's (steps 0.1%), what the tier needs for it (a list's count as a changing value); 023 cites words at e2e56dd
Diffstat (limited to 'docs')
-rw-r--r--docs/design/023-optimizing-tier.md2
-rw-r--r--docs/research/125-tier-first-steps.md8
2 files changed, 6 insertions, 4 deletions
diff --git a/docs/design/023-optimizing-tier.md b/docs/design/023-optimizing-tier.md
index fa8065e..67cf2b7 100644
--- a/docs/design/023-optimizing-tier.md
+++ b/docs/design/023-optimizing-tier.md
@@ -171,7 +171,7 @@ roots와 BFS만 기계어로 돈다. 나머지는 JIT의 값 모형이 거르거
키 집합이 아니므로 버린다.
- **찾은 자리에 쓰기**(PLAN_ROW, 했다): `counts[w].n = counts[w].n + 1`처럼 FIND가 낸 위치를 ITEM_SET만 받고 그 사이가 한 줄(뛰어
들거나 나가지 않음)이며 리스트를 키로 찾기(합친 FIND, HAS) 말고 건드리지 않으면, 로더가 둘을 묶는다. HASHED 리스트는 위치 대신
- 칸에 쓴다(위치를 내면 정렬된다). words 453 ms에서 211–219. 남은 것은 실행기다: 루프가 텍스트를 만들어(`"w{n}"`을 세 번, aup의 let은 텍스트를 담지 못한다) 일반 코드로 가지 못한다.
+ 칸에 쓴다(위치를 내면 정렬된다). words 453 ms에서 209(`e01dae9`, 125). 남은 것은 실행기다: 루프가 텍스트를 만들어(`"w{n}"`을 세 번, aup의 let은 텍스트를 담지 못한다) 일반 코드로 가지 못한다.
- 텍스트 보간의 정수는 정수의 자릿수로 바로 쓴다(지금의 수→텍스트가 정수에서 내는 것과 같은 바이트).
- 저장된 리스트는 022 그대로(트리, 많이 찾으면 편 배열).
diff --git a/docs/research/125-tier-first-steps.md b/docs/research/125-tier-first-steps.md
index ada82c9..bb926e1 100644
--- a/docs/research/125-tier-first-steps.md
+++ b/docs/research/125-tier-first-steps.md
@@ -52,10 +52,10 @@
## 어셈블리로 잰 꼴
-`forms.c`(행렬 곱의 안쪽 루프, 11번의 중앙값): 계층의 꼴 20.7 ms, 검사와 비트 없이 20.1, 포인터와 곱하기-더하기 13.1, 포인터와
+`forms.c`(행렬 곱의 안쪽 루프, 11번의 중앙값; `2026-10-05-forms.jsonl`에 세 번): 계층의 꼴 20.7 ms, 검사와 비트 없이 20.1, 포인터와 곱하기-더하기 13.1, 포인터와
곱·합 따로 10.0, 거기에 두 검사 10.2, 적재 앞에 비트 13.4, 정적 배열의 C 3.8(바깥 루프를 벡터로 묶는다).
-`newton.c`(roots의 루프): 계층의 꼴(next를 따로 두고 뒤로 가며 옮김) 7.7 ms, gcc의 꼴(next를 r의 레지스터에) 7.0, 수로 하는 유한 검사를
+`newton.c`(roots의 루프; `2026-10-05-newton.jsonl`에 세 번): 계층의 꼴(next를 따로 두고 뒤로 가며 옮김) 7.7 ms, gcc의 꼴(next를 r의 레지스터에) 7.0, 수로 하는 유한 검사를
더하면 9.7, 정수로 하면 8.7. 같은 생각으로 0으로 나누기 검사를 정수로 하면 오히려 느렸다.
측정이 짐작을 두 번 뒤집었다. 명령 18개를 16개로 줄인 것(`mov` 하나와 줄 밖 비트맵)은 0%였고, 상수 나눗셈을 곱셈으로 바꾼 것은
@@ -73,7 +73,9 @@
- **텍스트**: 텍스트를 지역 값으로 담기(aup의 `let`과 Pure의 지역 칸)와 텍스트 연산의 기계어. 이 일의 남은 시간 대부분이 같은 텍스트를
세 번 만드는 데와 실행기의 디스패치에 있다(디스패치 약 20%, 해시와 탐사 약 11%, 수의 서식과 텍스트 만들기 약 13%).
-- **BFS**: 계층이 키 구간의 걷기(sliced EACH)와 이벤트 리스트의 덧붙이기를 하게.
+- **BFS**: 재는 동안 단계 호출은 0.1%이고(그래프를 읽은 뒤만 표본) 시간은 일반 코드(61%) 대 C(39%)다. 일반 코드는 적재마다 열의
+ 폭 표시를 보는 분기와 수↔정수 변환을 한다. 계층이 키 구간의 걷기(sliced EACH)와 덧붙이기를 하려면 리스트의 개수를 바뀌는 SSA 값으로
+ 다뤄야 한다(큐는 같은 묶음에서 덧붙이고 위치로 읽는다).
- **루프 묶음 일반**: 레지스터가 모자라면 계층이 묶음을 포기한다(행렬 곱이 그랬다). 루프 밖에서만 쓰이는 진입 값을 다시 읽거나 프레임에
두는 스필이 필요하다. 꽉 차지 않은 DENSE를 키로 훑는 루프는 지금 일반 코드로 돈다(루프를 열 때 읽을 키만 확인하는 것이 다음).
- **뜻의 값**: 검사 없는 계층(`PURE_UNCHECKED`)으로 일마다 검사의 몫을 재는 손잡이는 아직 없다. roots에서 임시로 잰 유한 검사의