From 8c0c409ec5032a39bf9181198a24f25cca90d5fb Mon Sep 17 00:00:00 2001 From: eunhhu Date: Mon, 5 Oct 2026 18:53:24 +0100 Subject: 040 forms.c: matmul's inner loop in the forms the tier may make it (index 20.7 ms, pointer with multiply-add 13.1, apart 10.0, with checks 10.2, a bit tested before each load 13.4): the position's multiply and the pre-load branch cost, the checks hardly; 023 section 5 says so and what comes first (pointer induction, then a full list's copy) --- docs/design/023-optimizing-tier.md | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'docs/design/023-optimizing-tier.md') diff --git a/docs/design/023-optimizing-tier.md b/docs/design/023-optimizing-tier.md index 78a4591..6a4c23d 100644 --- a/docs/design/023-optimizing-tier.md +++ b/docs/design/023-optimizing-tier.md @@ -141,6 +141,13 @@ roots와 BFS만 기계어로 돈다. 나머지는 JIT의 값 모형이 거르거 - SSA의 선형 스캔 할당(정수, 실수 둘). 루프 깊이로 값의 무게를 정한다. 넘치면 프레임의 슬롯. - 022의 기계어 조각(태그 붙은 열 주소, 장부, 줄 밖 길, `pure_run_rest`)은 계층의 하위 단계로 쓴다. - 컴파일은 블록이 처음 돌 때 한다(지금처럼). 그 값은 재서 밝힌다. +- **잰 것: 행렬곱 안쪽 루프의 꼴**(`research/experiments/040-against-c/forms.c`, 2026-10-05, 11번의 중앙값). 계층이 낸 꼴 + (위치를 곱셈과 덧셈으로, 곱과 합을 2^53 아래로 검사, 적재마다 꽉 찬 리스트의 비트를 봄) 20.7 ms, 검사와 비트를 빼도 20.1, 각 열의 + 포인터를 보폭만큼 옮기면(곱하기-더하기 하나로 합) 13.1, 곱과 더하기를 나누면(합의 사슬이 더하기 하나) 10.0, 거기에 두 검사를 넣으면 + 10.2, 적재 앞에 비트를 보면 13.4. 위치의 곱셈이 2배, 곱하기-더하기의 사슬이 1.3배, 적재 앞의 분기가 1.34배이고, 오버플로 검사는 + 거의 공짜다. 그래서 순서는 **포인터 귀납 변수**(아핀 키의 칸 주소를 루프의 φ로) 다음에, 그래도 비트의 분기가 남으면 **꽉 찬 + 경우의 사본**(키로만 찾는 리스트가 모두 꽉 찬 DENSE일 때의 루프 본문을 하나 더 내고 루프를 열 때 고른다). 같은 배열을 정적으로 + 둔 C는 3.8 ms(바깥 루프를 벡터로 묶는다), `natural.h`의 C는 7.5. ### 6. 표현 (바닥이 가정한 것) -- cgit v1.2.3