docs(performance): initialize approved optimization scope
This commit is contained in:
@@ -0,0 +1,369 @@
|
||||
# FESA 계산 성능 개선 요구사항
|
||||
|
||||
사용자가 승인한 요구사항이다. 구현과 성능 측정을 이 계약에 따라 실행한다.
|
||||
기능 ID는 `calculation-performance`다. 기준 소스는 병합된
|
||||
`eaa5cbeb21b231862ed80f89386412232b0571c9`이며 현재 브랜치는
|
||||
`dryforge/calculation-performance`다. 기존 프로젝트 문서와 승인 이력을 유지한다.
|
||||
|
||||
## 목적과 범위
|
||||
|
||||
Intel VTune으로 실제 병목을 찾고, 계산·데이터 재사용·행렬 연산을 개선하여
|
||||
아래 원본 모델의 전체 실행 시간을 줄인다. 계측 전에 느린 함수나 개선 효과를
|
||||
단정하지 않는다. 최신 코드의 Hex8 및 reduced-coordinate shell HHT를 대상으로
|
||||
하며 새로운 요소·물리·입력 지원을 추가하는 작업은 아니다.
|
||||
|
||||
이번 아키텍처 보강은 기존 책임과 수명 계약을 성능 변경의 설계·검증 기준으로
|
||||
구체화한다. 시간 목표와 측정·정확성 기준은 그대로다. 기존 모듈 안에서 필요한
|
||||
최소 변경을 하며 공용 cache framework, 새로운 solver registry나 제품 실행기를
|
||||
추가하는 전면 재설계는 포함하지 않는다.
|
||||
|
||||
### FEM-REQ-PERF-001 — 시간 목표
|
||||
|
||||
| 원본 입력 | 전체 실행 경과 시간 상한 |
|
||||
| --- | ---: |
|
||||
| `reference/hexa/hexa_nonlinearstatic.inp` | 2초 |
|
||||
| `reference/hexa/hexa_dynnonlinear.inp` | 100초 |
|
||||
| `reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine.inp` | 100초 |
|
||||
|
||||
세 모델 모두 목표를 만족해야 한다. 경계값은 합격에 포함한다. 배수 개선이나
|
||||
한 모델의 성공으로 다른 모델의 시간 초과를 상쇄하지 않는다. 목표 미달은
|
||||
미달로 보고하며, 입력·검증 기준을 바꾸어 달성으로 표시하지 않는다.
|
||||
|
||||
### FEM-REQ-PERF-002 — 재현 가능한 시간 측정
|
||||
|
||||
기준 PC는 현재 AMD Ryzen 7 5800H(8코어·16논리 프로세서) Windows PC다.
|
||||
MSVC x64 최적화 Release 실행 파일을 사용한다. 기존 Debug 검증 구성을
|
||||
유지하며 별도 Release 빌드 디렉터리와 재현 가능한 설정을 마련한다.
|
||||
프로파일링용 심볼을 포함하되 시간 평가와 프로파일링에는 같은 빌드 설정의
|
||||
실행 파일을 사용한다. Debug 시간을 Release 목표에 대입하지 않는다.
|
||||
|
||||
각 모델을 별도 프로세스로 워밍업 1회 실행한 다음 5회 측정한다.
|
||||
**측정한 5회 각각이 해당 시간 상한 이내여야 합격**이다. 평균·중앙값·최솟값은
|
||||
참고로 기록할 수 있지만 합격 판정을 대체하지 않는다. 워밍업도 정상 해석과
|
||||
결과 저장을 완료해야 하며 합격 표본에는 포함하지 않는다.
|
||||
|
||||
단조 증가 시계로 프로세스 시작 요청 직전부터 정상 종료를 확인한 직후까지
|
||||
측정한다. 프로세스 시작, 입력 읽기, 모델 준비, 모든 계산·복구, 필수 로그와
|
||||
최종 HDF5 저장·닫기·교체를 포함한다. 입력 복사, 빌드, VTune 후처리와 외부
|
||||
결과 비교는 측정 구간 밖이다. CPU 시간 합계나 Abaqus CPU 시간과 혼용하지 않는다.
|
||||
시간 평가 중 VTune 및 별도 계측 도구는 실행하지 않는다.
|
||||
|
||||
원본과 바이트가 같은 입력을 실행별 독립 임시 디렉터리에 복사한다. 기존 출력과
|
||||
원본을 덮어쓰지 않는다. 타이머 종료 후 native exit 0, 새 결과의 입력 identity,
|
||||
완전한 frame inventory 및 결과 유효성을 확인한다. 파일 존재만으로 성공을
|
||||
판정하지 않는다. 실행 실패·timeout·중단·불완전 출력은 합격 표본이 아니다.
|
||||
성공했지만 느린 실행은 표본에서 제외하지 않는다.
|
||||
|
||||
최적화 전 기준 소스와 최종 소스를 같은 측정 절차로 실행한다. 컴파일 설정,
|
||||
의존성 버전, 전원 조건, thread 설정과 실행 환경을 동일하게 고정하여 비교한다.
|
||||
빌드·다른 해석·CTest·프로파일링과 공식 시간 측정을 동시에 수행하지 않는다.
|
||||
Thread 수와 sampling interval은 조정 가능 값이며 baseline 전에 정하고 기록한다.
|
||||
서로 다른 설정의 탐색 결과는 구분하고, 최종 설정에서 기준 소스도 다시 측정해
|
||||
전후 비교의 조건을 맞춘다. OS 파일 캐시는 워밍업으로 준비하며 매 실행마다
|
||||
강제 초기화하는 별도 요구는 없다.
|
||||
|
||||
### FEM-REQ-PERF-003 — VTune 근거
|
||||
|
||||
현재 PC에서 Intel VTune Hotspots의 소프트웨어 샘플링을 사용한다.
|
||||
설치된 도구의 실제 버전·명령 지원을 확인한다. 전후 원시 수집 결과와
|
||||
함수·호출 경로별 시간 요약을 보존하고, 주요 변경을 계측된 비용에 연결한다.
|
||||
가능하면 모델 준비, 요소 응답, 조립, 선형 해법, 복구·출력 비용을 구분한다.
|
||||
|
||||
VTune 실행 시간은 수집 비용을 포함하므로 시간 목표의 합격 evidence로 쓰지
|
||||
않는다. 긴 기준 실행은 병목 탐색용 부분 수집을 허용하되 부분 수집이라고
|
||||
명시하며 전체 실행 기준 측정과 구별한다. 짧은 정적 모델의 표본이 부족하면
|
||||
독립 실행을 반복 수집하고 그 사실을 기록한다. 원시 자료 없이 추정한 병목을
|
||||
확인된 병목으로 보고하지 않는다.
|
||||
|
||||
수집 실패나 함수 식별 불가를 확인한 경우 설정·심볼 문제를 해결한다.
|
||||
해결하지 못하면 이유와 필요한 환경을 보고하고, 다른 도구의 결과를 VTune
|
||||
요건 충족으로 대체하지 않는다. Intel 하드웨어 카운터 수집은 필수 범위가 아니다.
|
||||
소프트웨어 수집 옵션의 근거는 [Intel collect 안내](https://www.intel.com/content/www/us/en/docs/vtune-profiler/user-guide/2025-4/collect.html)다.
|
||||
|
||||
### FEM-REQ-PERF-004 — MKL 필수 적용과 예외
|
||||
|
||||
Production의 일반 밀집·희소 행렬 곱셈과 선형계 해법은 Intel MKL을 사용한다.
|
||||
기존 `Matrix::Multiply`의 BLAS와 PARDISO를 유지·개선하고, 현재 직접 CSR
|
||||
루프로 계산하는 `SparseMatrix::Multiply` 및 procedure·element 내부의 직접
|
||||
행렬 곱셈 경로도 조사한다. MKL 연결 여부만으로 실제 사용을 입증하지 않는다.
|
||||
경로별 실제 adapter 호출과 검사 근거를 기록한다. MKL 실패 시 직접 계산하는
|
||||
silent fallback을 추가하지 않는다. MKL vendor 타입은 공개 core에 노출하지 않는다.
|
||||
|
||||
작은 고정 크기 좌표 계산과 승인된 특수 정밀도 연산은 예외를 허용한다.
|
||||
예외마다 파일·함수·연산·크기 또는 정밀도·예외 이유·수치/성능 근거를 기록한다.
|
||||
고비용이라는 이유만으로 일반 행렬 곱셈을 예외로 돌리지 않는다.
|
||||
특히 normalized high+low, 보상 누적, outward interval 인증을 일반 Float64
|
||||
BLAS로 접어 정확성을 잃는 변경은 허용하지 않는다. 작은 연산은 MKL 호출 비용과
|
||||
기존 수치 의미를 고려한다. 테스트의 독립 scalar oracle은 production 대체 경로가 아니다.
|
||||
|
||||
MKL 적용에 따른 연산 순서 변경은 수치 변경으로 검토한다. 0차원·빈 free system,
|
||||
shape mismatch, index 변환/overflow, CSR validation, handle 수명·copy/move,
|
||||
실패 후 재사용과 candidate 보존을 기존 계약대로 처리한다.
|
||||
|
||||
### FEM-REQ-PERF-005 — 계산 의미와 재사용 수명
|
||||
|
||||
성능을 위해 물리식, 질량, 정밀도, 적분점, 시간간격·전체 해석 구간·증분,
|
||||
반복 제한, Newton/내부 수용 기준과 reference tolerance를 변경하지 않는다.
|
||||
필수 복구·출력을 줄이거나 실패 검사를 생략하지 않는다. `/fp:fast` 등으로
|
||||
승인된 roundoff/finite 의미를 깨는 최적화도 허용하지 않는다.
|
||||
|
||||
Hex8은 현재 Total Lagrangian–StVK와 reference-weighted mean-volume energy,
|
||||
BC 제한 전 full reference row-sum lumped 질량, point identity, normalized
|
||||
high+low 상태·힘·energy와 최종 RN64 출력 의미를 유지한다.
|
||||
Shell은 현재 reduced-coordinate HHT, 승인된 lumped kinetic mass,
|
||||
analytic null/고정 basis·chart·초기 Newton 정책, physical a/public A와
|
||||
private integrator history 구별 및 schema v2를 유지한다.
|
||||
|
||||
중복 계산 제거·workspace 재사용·희소 pattern 및 해법 재사용은 실제 owner와
|
||||
수명을 따른다. 불변 모델량과 trial-dependent 양을 구별하고, 동일하지 않은
|
||||
trial의 geometry·접선·factorization·recovery를 재사용하지 않는다. 실패한 trial이
|
||||
유효 cache·committed state·accepted history를 오염시키면 안 된다.
|
||||
조립은 index-owned local buffer와 결정적 reduction을 유지한다.
|
||||
|
||||
상세 권위는 [Hex8 최종 인계](../hex8-structural-analysis/final-handoff.md),
|
||||
[Hex8 numeric controls](../hex8-structural-analysis/numeric-controls.md),
|
||||
[Shell PRD](../hht-implicit-dynamics/PRD.md),
|
||||
[Shell 축소좌표 식](../hht-implicit-dynamics/formulation-reduced-coordinate.md)와
|
||||
[현재 결과 계약](../hht-implicit-dynamics/io-reduced-coordinate.md)이다.
|
||||
|
||||
### FEM-REQ-PERF-006 — 공개 계약과 원본 보존
|
||||
|
||||
제품 CLI는 `fesa.exe <model.inp>`를 유지한다. 입력 subset, 공개 API의 의미,
|
||||
결과 schema·dataset·frame·source identity·물리량·단위·성분·진단과 출력
|
||||
lease/atomic replacement 계약을 변경하지 않는다. 추가 performance runner는
|
||||
제품 CLI와 분리하며 performance 자료는 외부 artifact로 기록한다.
|
||||
|
||||
모든 reference INP/CSV/TXT와 관련 없는 사용자 변경을 보존한다. 원본 생성·보정,
|
||||
Abaqus 실행·라이선스 비용, 원격 push·배포·release 감사는 범위 밖이다.
|
||||
새 물리·입력·영속 schema·acceptance 변경이 필요하면 근거와 영향을 사용자에게
|
||||
알리고 별도 결정을 받는다. 목표를 맞추기 위해 그런 변경을 자동 채택하지 않는다.
|
||||
|
||||
### FEM-REQ-PERF-007 — 정확성과 회귀 검증
|
||||
|
||||
변경한 행동의 관련 Debug 검사부터 수행한다. 수치 연산·reduction·cache 수명
|
||||
변경에는 독립 numerical review와 해당 analytical/invariant·평형/energy·접선·
|
||||
시간수렴·직렬/TBB 결정론·실패 보존 검증을 적용한다. 최종 물리 검토는 변경한
|
||||
경로와 실제 결과에 근거하며 CSV 변위 일치만으로 전체 physics를 보증하지 않는다.
|
||||
|
||||
최종 소스에서 구성된 전체 MSVC x64 Debug build/CTest를 제외 없이 완료한다.
|
||||
최신 등록 수는 실행 때 discovery로 확인한다. 과거 856개·44 PASS 후 중단은
|
||||
현재 전체 통과 근거가 아니다. 기존 FAIL/SKIP은 이름·상태·metric body와 baseline
|
||||
소스를 대조해 구별하며, 새로운 실패나 악화를 기존 예외로 분류하지 않는다.
|
||||
최신 baseline이 불명확한 실패는 기준 소스의 관련 검사를 재현하여 확인한다.
|
||||
확인되지 않은 회귀·중단·미실행이 남으면 검증 완료로 표시하지 않는다.
|
||||
확인된 기존 문제는 보존하고 성능 작업의 성공과 전체 green을 구별해 보고한다.
|
||||
|
||||
필수 외부 비교는 새로 실행·저장한 최종 결과로 수행한다.
|
||||
|
||||
| 범위 | 필수 비교 |
|
||||
| --- | --- |
|
||||
| Hex8 정적 목표 | `hexa_nonlinearstatic`의 전체 U, constrained RF, point S |
|
||||
| Hex8 동적 목표 | `hexa_dynnonlinear`의 초기부터 끝까지 101-frame U |
|
||||
| Shell 동적 목표 | schema v2·전체 729-node inventory 확인 후 고정 9-node subset의 101-frame U blocking / UR warning-only |
|
||||
| 공유 math·해법·Hex8 경로 회귀 | Hex8 원본 5개: 선형/비선형 정적, frequency, 선형/비선형 동적의 기존 필수 비교 |
|
||||
|
||||
원본 3개는 최종 Release 시간 평가의 새 결과를 비교한다. 5개 Hex8 비교의
|
||||
나머지 모델도 최종 소스의 새 결과를 사용한다. 각 모델의 허용 Debug/Release
|
||||
evidence 구성을 [Hex8 인계](../hex8-structural-analysis/final-handoff.md)에 맞춰
|
||||
명시하며 다른 빌드의 결과를 시간 표본의 결과로 대신하지 않는다.
|
||||
필요한 다른 공유 consumer의 기존 reference 검사는 전체 CTest 및 영향 검사에 포함한다.
|
||||
|
||||
Identity·row/component completeness·finite/schema 검사를 tolerance보다 먼저
|
||||
적용한다. 현재 [공통 수치 정책](../TOLERANCE.md)의 near-zero 1%, 일반 행
|
||||
상대오차 5%, family relative RMS 1%와 zero-scale exact-zero를 유지한다.
|
||||
Eigen의 별도 MITC4 예외를 Hex8에 확대하지 않는다.
|
||||
5회 시간 표본의 모든 결과를 기존 비교기로 확인하며 비교 시간은 타이머 밖이다.
|
||||
Reference 파일 부재·identity 충돌·비교 실패는 완료를 차단한다.
|
||||
|
||||
### FEM-REQ-PERF-008 — 산출물과 완료 보고
|
||||
|
||||
최소한 기준/최종 시간 측정 JSON, VTune raw 결과와 hotspot 요약,
|
||||
MKL 적용·예외 목록, 검증/독립 검토 근거와 한국어 최종 보고서를 남긴다.
|
||||
기계 생성 자료는 `.harness/performance/` 아래에 실행별로 보존하고,
|
||||
정식 보고서는 `docs/calculation-performance/`에서 상대 경로로 연결한다.
|
||||
실제로 없는 개인 artifact를 존재하는 근거처럼 링크하지 않는다.
|
||||
|
||||
시간 보고서에는 case별 target seconds, 워밍업/측정 구별과 측정 번호,
|
||||
각 elapsed seconds, native exit, 입력/실행 파일/결과 identity와 SHA-256,
|
||||
command/cwd, 로그 위치와 결과 검증 판정을 기록한다. 환경 기록은 source
|
||||
commit 및 dirty 여부, MSVC/flags/build type, dependency/VTune 버전, CPU/OS,
|
||||
전원 상태, MKL/TBB/OpenMP thread 및 관련 환경 설정을 포함한다.
|
||||
전후 비교에는 각 5회 값·최댓값·개별 합격 여부와 전체 판정이 있어야 한다.
|
||||
성능 판정과 수치/검증 판정을 별개로 표시하며 최종 완료는 둘 다 충족해야 한다.
|
||||
|
||||
측정 진입점은 `python scripts/performance/measure.py --exe <fesa.exe>
|
||||
--output-dir <새 artifact 디렉터리>`다. 대상은 위 세 모델이며 프로세스당
|
||||
원본 입력 인자 하나만 전달한다. 입력 복사와 산출물은 지정 artifact 디렉터리
|
||||
아래에 두고, 비어 있지 않은 기존 실행 디렉터리는 덮어쓰지 않는다.
|
||||
보고서 `measurements.json`에는 `schema=fesa-performance-v1`, 환경 정보,
|
||||
case별 `case`, `target_seconds`, `runs`, `all_measured_runs_within_target`을 둔다.
|
||||
정상 완료한 `runs`는 워밍업 1개와 측정 5개이며 `kind`는 `warmup|measurement`,
|
||||
`measurement_index`는 워밍업 0 또는 측정 1–5다. 각 행의 `elapsed_seconds`는
|
||||
유한한 비음수, `native_exit`는 실제 정수 종료 코드 또는 시작 실패 시 null이다.
|
||||
실행 상태 `execution_state`는 `completed|launch-failed|timed-out|interrupted`다.
|
||||
중단/실패 시 이미 수집한 행과 실패 행을 보존하고, 누락 표본은 완료로 채우지 않는다.
|
||||
각 행에는 입력/실행 파일/결과 hash, 로그·native 기록 경로와
|
||||
`comparison_status=pending|passed|failed`, 비교 report 경로를 연결한다.
|
||||
아직 비교하지 않은 값은 `pending`이며 성공으로 채우지 않는다.
|
||||
|
||||
각 Hex8 실행의 `native.json`은 현재 비교기가 소비하는 `case`, `command`
|
||||
(실행 파일과 실제 scratch 입력의 2문자열 배열), `native_exit`,
|
||||
`original_sha256`, `scratch_sha256`, `result_sha256`, `source_unchanged`,
|
||||
`scratch_unchanged`, `result_exists`를 실제 실행·hash 검사로 기록한다.
|
||||
비교기 입력 계약을 측정기 편의로 변경하지 않는다. 원본과 scratch의 변경 여부는
|
||||
실행 전후 raw byte hash로 확인한다. 시작 실패나 출력 부재에서 hash를 꾸미지 않는다.
|
||||
Shell에도 같은 실행 사실을 보존하되 Hex8 비교기의 적용 범위를 확대하지 않는다.
|
||||
|
||||
측정기 종료 0은 전체 표본의 정상 실행·기록 완료를 뜻하며 시간 목표나 외부 비교
|
||||
전체 합격을 뜻하지 않는다. 실행/기록 실패는 1, 잘못된 인자는 2다.
|
||||
최종 보고의 작업 판정은 `passed|failed|incomplete`로 구별한다. 전 모델 시간·
|
||||
필수 검증·VTune/MKL 조건이 모두 충족할 때만 `passed`다. 확정된 목표 초과나
|
||||
새 정확성 실패는 `failed`, 필요한 실행/검토가 남은 상태는 `incomplete`이며
|
||||
미완료 이유를 함께 기록한다. 실패와 미실행이 함께 있으면 `failed`로 보고하고
|
||||
미실행 목록도 보존한다.
|
||||
|
||||
기능 문서는 실행 시 `FEATURED_AGENTS.md`, `PRD.md`, `ADR.md`를 추가하여
|
||||
기존 공통 문서를 유지한다. 요구사항 ID는 이 문서의 `FEM-REQ-PERF-###`를
|
||||
계승하고 현재 구현·검증 checklist는 해당 Feature PRD 한 곳에서 관리한다.
|
||||
요구사항 준비에서는 `.dryforge/`의 요구사항·계획·인계 문서만 작성했다.
|
||||
사용자 승인 후 실행 단계는 이 계약에 따라 구현·계측·검증을 진행한다.
|
||||
|
||||
### FEM-REQ-PERF-009 — 아키텍처 경계와 자원 수명
|
||||
|
||||
현재 [시스템 구조](../ARCHITECTURE.md)와 각 영역의 AGENTS가 책임과 의존성의
|
||||
원본이다. 아래는 그 계약을 성능 변경에 적용한 요구사항이다. 새로운 public
|
||||
타입·cache 계층을 반드시 추가하라는 지시가 아니다. 구체적 private 구현은
|
||||
VTune 비용과 이 계약을 만족하는 가장 작은 변경으로 결정한다.
|
||||
|
||||
#### 책임과 의존성
|
||||
|
||||
| Owner | 성능 변경에서 소유할 것 | 넘어가면 안 되는 경계 |
|
||||
| --- | --- | --- |
|
||||
| `app` | 객체 조합·경로·output lease·CLI 종료와 실행 범위의 자원 정책 | 요소식·수렴 판정·결과 물리 의미를 결정하지 않음 |
|
||||
| `model/Domain` | source identity와 모델·재료·단면·step 정의 | mutable trial·factorization·vendor handle을 저장하지 않음 |
|
||||
| `fem/DofManager` | profile·equation·full/free/constrained mapping·scatter·CSR pattern | Node/Element/backend가 equation을 새로 발급하지 않음 |
|
||||
| `elements/materials/loads` | 입력된 local state의 응답과 불변 reference data | global CSR 공유 쓰기·영속 결과 기록을 하지 않음 |
|
||||
| `assembly` | owner-issued scatter/pattern에 따른 ordered reduction | local 물리식을 다시 계산하거나 수렴을 판정하지 않음 |
|
||||
| `analysis` | procedure·run/worker workspace·trial·수렴·accept/commit·reduced context | concrete MKL handle 또는 HDF5 layout을 state에 넣지 않음 |
|
||||
| `math` | backend-neutral storage와 private dense/sparse 연산 adapter | 모델 cache key·physics tolerance를 결정하지 않음 |
|
||||
| `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 변경 시 다시 준비 |
|
||||
| shell fixed initial split/basis/chart | reduced procedure의 실행 context | fixed initial 정보만 실행 수명으로 재사용; state-dependent embedding/미분/rates는 trial 수명 |
|
||||
| 작업용 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 성공 값을 그대로 공개하지 않는다.
|
||||
|
||||
#### 조립·정밀도·병렬 자원
|
||||
|
||||
Scatter와 CSR 위치의 불변 metadata를 재사용하는 경우에도 기존
|
||||
`(row, column, element_order, local_order)` contribution 순서·중복 합산·structural
|
||||
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