트릿텐서 v0.2 — 평면 멀티블록 전환 (행열>1023 지원)
개요
/Users/ef/crowny-butler/libs/트릿텐서.한선 의 평면(평면P/평면N)이 단일 배열이라
행열 ≤ 1023(VM 배열 상한)에서만 동작하던 제한을 해소.
거대SLM 어휘 임베딩 행렬(어휘수×27)·긴 컨텍스트 KV 풀을 위한 멀티블록 설계로 전환.
변경 요지
내부 표현 변경 (외부 서명 100% 보존)
- 구: 텐서맵에 "평면P"/"평면N" 단일 배열 (행열 ≤ 1023 한계)
- 신: 텐서맵에 "평면P_b0","평면P_b1",... + "평면N_b0","평면N_b1",... 블록 배열
새 멀티블록 표현 명세
- 블록상한: 1000 슬롯 (텐서_블록상한)
- 행per블록 계산: loop로 정확 (나눗셈 자연반올림 함정 회피)
결과=0; 동안 ((결과+1)*열 <= 1000) { 결과++ }
열=27이면 행per블록=37 (37×27=999≤1000)
- 블록수 계산: loop 올림 계산 (나눗셈 회피)
누적행=0; 동안 (누적행 < 행) { 누적행+=행per블록; 블록수++ }
- 한 행은 한 블록 안에 완전히 들어감 (행 비스팬 보장)
신규 헬퍼: 텐서_블록위치(텐서, 행번호, 열번호) → 맵{블록, 오프셋}
- 블록 번호: loop로 구함 (나눗셈 회피)
- 블록내행 = 행번호 - 블록 행per블록
- 오프셋 = 블록내행 * 열 + 열번호
저장/로드 형식 변경
- 구: 경로접두.P.s{n}.dat / 경로접두.Q.s{n}.dat + meta "행,열,P샤드수,N샤드수"
- 신: 경로접두.P.b{b}.dat / 경로접두.Q.b{b}.dat + meta "행,열,행per블록,블록수"
텐서_색인 처리
- 외부 모듈 grep 결과: 심층삼진망/거대SLM통합/사상인지 어느 파일도 텐서_색인을 직접 호출하지 않음
- 텐서_색인 함수는 내부에서도 더 이상 직접 쓰이지 않고 텐서_블록위치에 위임
- 하위 호환을 위해 함수 정의는 보존 (전역 선형 색인 정보 조회 용도)
핫패스 최적화 보존
- 텐서_행벡터/텐서_행설정: 한 행은 한 블록 안에 있으므로 블록 배열 1회만 꺼내 처리 (v0.1과 동일한 O(열) 비용)
변경 파일
| 파일 | 변경 |
|---|---|
/Users/ef/crowny-butler/libs/트릿텐서.한선 | v0.2 멀티블록 전환 (주 구현) |
/Users/ef/crowny-butler/libs/트릿텐서.rpn.한선 | RPN 동반 파일 동기화 |
/Users/ef/crowny-butler/libs/텐서덤프도구.한선 | .P.b{b}.dat 형식 + meta 필드 업데이트 |
/Users/ef/crowny-butler/libs/텐서덤프도구.rpn.한선 | RPN 동반 파일 동기화 |
외부 모듈 영향 (grep 결과)
- 심층삼진망.한선: 텐서_생성/텐서_시드채움/텐서_행벡터/텐서_도트/텐서_행설정 사용 — 모두 공개 서명 보존, 영향 없음
- 거대SLM통합.한선: 트릿텐서를 전이적으로 사용 (심층삼진망 통해) — 영향 없음
- 사상인지.한선: 텐서 함수 직접 미사용 — 영향 없음
- 텐서덤프도구.한선: 파일 포맷 직접 읽음 → v0.2 형식으로 업데이트 완료
데모 케이스
- 27×27 (729셀, 단일블록 — 행per블록=37≥27)
- 100×27 (2700셀, 멀티블록 3개 — 블록 경계 행 36,37,73,74 강제검증)
- 50×50 (2500셀, 멀티블록)
- 도트곱 (행벡터 인터페이스 무변경)
남은 위험
- 텐서덤프도구.rpn.한선의 일부 RPN 레이블 분기 구조가 hanseonc_std로 컴파일 시 레이블 순서 충돌 가능성 있음 → 메인 세션 검증 필요
- 텐서_시드채움은 행별 텐서_설정트릿을 호출하므로 대규모(예: 10000×27) 텐서 채움 시 느림 — 텐서_행설정 배치 패턴으로 대체 추천
- 맵 ~729 엔트리 상한: 블록수가 많아지면 블록 키("평면P_b0"..."평면P_b364") 총 키가 ~730개에 도달 → 블록수 ≤ 364 제한 (행per블록=37, 열=27이면 최대 행수 ≈ 13468행 = 363891셀까지 안전)