28 KiB
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 안내다.
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 numeric controls, Shell PRD, Shell 축소좌표 식와 현재 결과 계약이다.
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 인계에 맞춰 명시하며 다른 빌드의 결과를 시간 표본의 결과로 대신하지 않는다. 필요한 다른 공유 consumer의 기존 reference 검사는 전체 CTest 및 영향 검사에 포함한다.
Identity·row/component completeness·finite/schema 검사를 tolerance보다 먼저 적용한다. 현재 공통 수치 정책의 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 — 아키텍처 경계와 자원 수명
현재 시스템 구조와 각 영역의 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를 대체하지 않는다.