| `solvers/linear` | PARDISO 배열·분해·solve·해제 및 실패 변환 | 다른 trial의 matrix를 추정하거나 BC를 바꾸지 않음 |
| `results`와 `io/hdf5` | 각각 물리량 복구/candidate와 serialization/self-check/최종 교체 | 복구를 writer로 옮기거나 부분 accepted history를 정상 final로 공개하지 않음 |
| 외부 성능 도구 | 프로세스 측정·VTune 수집·원본 비교 연결·보고 | 제품 runtime에서 Python/VTune 또는 측정 JSON을 호출·읽지 않음 |
Consumer는 backend-neutral 값을 사용하고 MKL/TBB/HDF5 설정·include·handle은
해당 private 경계 안에 둔다. 서로 닮은 Hex8와 shell 반복문을 하나의 범용
procedure로 합치지 않는다. 재사용은 물리·정밀도·수명·실패 의미가 같은 작업에
한하며 소유권을 뒤집는 공통화는 하지 않는다.
#### 데이터 종류별 수명과 무효화
| 데이터 | Owner와 유효 범위 | 재사용 전 확인 / 무효화 조건 |
| --- | --- | --- |
| 모델 정의와 reference 형상·재료 | Domain 및 그 정의로 생성한 immutable runtime element; 현재 해석 실행 | 다른 Domain/element/section/material에는 재사용하지 않음 |
| reference 적분량·승인 질량·불변 local data | 현재 runtime element 또는 해당 procedure 준비 결과 | 현재 형상·질량·정밀도 계약이 같을 때만 재사용; trial 형상량과 구별 |
| equation·scatter·pattern·partition | DofManager; 현재 active view/profile와 경계조건으로 준비된 실행 | 같은 node 수만으로 동일성을 판단하지 않음; profile·active layout·partition 변경 시 다시 준비 |
| 작업용 capacity·index-owned buffer | procedure/assembly 호출의 명시적 owner | 같은 저장 공간을 써도 새 계산 값은 초기화·교체; TBB thread ID를 element identity로 사용하지 않음 |
| geometry 인증·내력·접선·reconstructed rates·recovery | 평가 중인 현재 trial | 입력 state/정밀도/context가 달라지거나 trial 거부 시 해당 계산 결과 재사용 금지 |
| CSR 값과 private MKL 변환 배열/handle | 현재 matrix와 이를 사용하는 math/backend owner | 값/shape/pattern 교체, copy/move, 저장 배열 재할당·파괴에 맞춰 갱신·해제; 주소 일치만으로 유효성을 판단하지 않음 |
| PARDISO numeric factorization | backend가 성공적으로 분해한 현재 matrix | 새 값·pattern·matrix 성질 또는 새 분해 실패에서는 이전 matrix 분해로 solve 금지; 성공 전 출력 candidate를 공개하지 않음 |
| accepted state/history와 완료 outcome | 기존 procedure state와 results commit 경계 | 모든 기존 검증 뒤에만 반영; failed trial/workspace와 alias하지 않음 |
이 표는 필수 논리 조건이며 모든 데이터에 새 generation counter나 hash를
붙이라는 뜻은 아니다. 불변 객체와 소유 범위로 입증할 수 있으면 그것으로 충분하다.
그 방법으로 유효성을 입증할 수 없는 재사용은 채택하지 않는다.
작업용 storage는 현재 모델/worker의 필요한 크기로 제한하고, 매 Newton 반복의
cache를 계속 쌓지 않는다. 기존 필수 accepted history를 줄이지 않는다.
#### MKL 경계와 fresh factorization
MKL 호출 전에 shape·CSR·finite·integer range를 검증하고, public `std::size_t`
index를 private MKL integer 배열로 안전하게 변환한다. 폭이 다른 배열을 포인터
cast로 재해석하지 않는다. Borrowed CSR 값이 있다면 모든 backend 접근이 끝날
때까지 원본 storage가 살아 있고 변하지 않아야 한다. Handle 해제를 배열 파괴
전에 수행하며 copy가 다른 객체의 배열을 가리키는 cache를 복제하지 않게 한다.
동일 객체의 const 연산을 동시에 호출할 때 숨은 mutable cache 경쟁을 만들지 않는다.
현재 `SparseMatrix`는 canonical CSR 값을 소유하고 accessor는 const다.
단발 연산에 필요한 RAII 자원만으로 요구를 만족하면 그것을 우선한다.
Handle/변환 배열을 지속 보존하는 최적화는 실제 반복 비용과 수명·동시 접근
검증 근거가 있을 때만 추가한다. 특정 PImpl/cache class 도입 자체가 목표는 아니다.
현재 `TangentSolver::FactorizeFresh`는 이전 상태를 해제한 뒤 새 접선을
검증·분석·numeric factorization한다. 공개 fresh 의미를 유지하고 새 접선의
numeric 단계를 생략하지 않는다. Symbolic 분석 재사용은 계측 후보일 뿐 필수
변경이 아니다. 채택하려면 matrix 성질·shape·전체 ordered pattern·backend 설정의
동일성과 새 값의 numeric 갱신, 실패 뒤 무효화, fresh 호출의 실패 의미를 입증한다.
이 입증 없이 현재 lifecycle을 교체하지 않는다.
새 분해 실패와 잘못된 RHS의 solve 실패는 구별한다. RHS 검증 실패만으로 현재
유효 matrix의 분해가 반드시 무효라는 새 정책을 만들지 않으며, correction 보존과
backend 상태의 유효성은 현재 해법 계약에 따라 처리한다.
Backend 상태 오류는 기존 `Status/Result` 및 해당 연산의 exception 경계에 맞춰
owner가 변환한다. 현재 `Multiply`의 값 반환·shape 오류 의미를 문서 보강만으로
새 public signature로 바꾸지 않는다. 호출자가 정상값을 받았는데 실제 연산이
실패한 상태를 허용하지 않으며 vendor 원시 오류나 stale 성공 값을 그대로 공개하지 않는다.
zero·full-space reaction 근거와 실패 진단 선택을 유지한다. 정렬/lookup을 줄이는
후보가 원래 누적과 같은 행동을 입증하지 못하면 기존 reduction을 유지한다.
전역 CSR atomic add나 작업 종료 순서에 따른 reduction을 도입하지 않는다.
Float64 일반 행렬 연산과 normalized high+low/보상/interval 경로를 구별한다.
차원이 같다는 이유로 정밀도 경로를 합치거나 low를 떨어뜨려 adapter에 넣지 않는다.
불변 index/shape와 실제 trial 값은 별도로 취급한다. Element/procedure가 같은
값을 두 번 계산하지 않도록 개선하더라도 field별 수치 의미는 그대로여야 한다.
TBB local 계산과 MKL 수치 연산의 자원 정책은 실행 호출자의 명시적 범위에서
관리한다. Worker가 process-wide thread 설정을 변경하지 않는다. Local 작업이
join한 뒤 global 조립/solve를 수행하는 현재 단계 경계를 지킨다. Local 계산 안의
MKL이 병렬 region을 만들 경우 outer/inner 실행의 실제 thread 수와 총 자원
사용을 확인하고 oversubscription 비용을 줄이는 설정을 기록한다.
정확한 thread 수와 scoped 제어 구현은 조정 가능하며 새 제품 CLI를 요구하지 않는다.
Local 정책 변경은 해당 범위를 벗어나 다음 MKL solve나 다른 실행을 오염시키면 안 된다.
#### 외부 측정과 증거의 책임
측정 도구는 입력 준비 → native 실행/종료 측정 → 실행 사실 기록 → 결과 검사·
비교 연결 → 판정 요약의 순서를 따른다. 시계와 실행 기록의 owner는 측정기,
수치 판정의 owner는 기존 comparator, 작업 완료 판정의 owner는 최종 보고다.
같은 native 실행과 결과 hash로 이 자료들을 연결한다. 비교 후 원시 경과 시간을
다시 계산하거나 report 수정으로 실패를 성공으로 만들지 않는다.
실제 source/binary·설정은 한 측정 묶음 동안 고정하며 기준과 최종 결과를 섞지 않는다.
새 보고 파일은 최종 기록 완료 후 공개하고 실패 시 이미 수집한 실행 사실을 보존한다.
아키텍처 검증에는 바뀐 경계의 consumer compile, handle/배열 수명, 반복 호출·
copy/move·pattern/값 교체, 실패 뒤 재실행, trial 거부 후 cache 초기화,
직렬/TBB 결과·진단 순서와 local 병렬 정책 복원을 포함한다.
VTune으로 초기 준비·정수 변환/handle 준비·local 계산·조립·분해/solve·복구/출력의
비용을 가능한 범위에서 구별하여 실제 필요한 재사용만 채택한다.
별도 메모리 상한이나 목표 시간을 추가하지 않으며, 새 지속 cache를 채택하면
보존하는 크기·수명과 반복 후 증가하지 않는 근거를 함께 보고한다.
## 선택의 이유와 제외 범위
전체 경과 시간은 실제 사용자가 결과를 받기까지의 시간을 반영한다.
5회 모두 합격하는 기준은 우연히 빠른 한 번을 완료로 인정하지 않기 위한 것이다.
현재 PC와 소프트웨어 샘플링을 고정하여 실제 작업 환경에서 평가한다.
MKL은 일반 행렬 연산에 필수로 사용하면서 작은 좌표 계산의 호출 비용과
특수 정밀도 계약을 보존하는 예외를 허용한다.
새 요소·새 procedure, 입력 단순화, 시간간격 조정, 질량/정식화 변경,
reference/tolerance 수정, 출력 축소 및 기존 다른 문제의 포괄적인 수리는 제외한다.
프로파일러 연결만 완료하거나 시간만 충족한 상태는 전체 작업 완료가 아니다.
## 현재 checklist
- [ ] 최적화 빌드·측정기의 행동 검증, 환경과 source/input/binary identity 확보.
- [ ] 세 원본의 기준 전체 실행·외부 비교와 VTune 소프트웨어 병목 자료 확보.
- [ ] 일반 행렬 곱셈·선형 해법의 MKL 경계와 수명 검증, 적용·예외 목록 확보.
- [ ] Hex8 병목 개선·관련 행동/수치·원본 검증 완료.
- [ ] Reduced shell 병목 개선·관련 행동/수치·원본 검증 완료.
- [ ] 최종 세 모델의 워밍업 후 5회 전부 시간 목표 및 매 결과의 외부 비교 통과.
- [ ] 최종 전체 MSVC x64 Debug build/CTest와 필요한 Python 검사 완료·기존 예외 대조.
- [ ] 필요한 독립 수치·물리 검토 및 VTune 전후 결과, 최종 보고 완료.
과거 다른 기능의 PASS/FAIL/SKIP과 사용자 중단은 이 checklist를 대체하지 않는다.
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.