From ab00ea7415038acec4eaa38ae581ef7c01f38937 Mon Sep 17 00:00:00 2001 From: "KOKO\\Mimi" Date: Wed, 14 Oct 2026 16:38:54 +0900 Subject: [PATCH] docs(performance): clarify MKL ownership and evidence limits --- docs/calculation-performance/mkl-coverage.md | 73 +++++++++++--------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/docs/calculation-performance/mkl-coverage.md b/docs/calculation-performance/mkl-coverage.md index 3e0baf7..cebfa28 100644 --- a/docs/calculation-performance/mkl-coverage.md +++ b/docs/calculation-performance/mkl-coverage.md @@ -58,7 +58,11 @@ CSR coefficient와 모든 RHS는 MKL 호출 전 math에서 finite 검증한다. 변경하지 않는다. Finite-input product overflow는 consumer의 기존 output finite 검증으로 실패한다. Empty/zero shape도 입력 finite/shape/range 검증을 유지한다. -Dense gemv/gemm도양쪽actualownedstorage/VectorRHS를중앙Matrix::Multiply에서finite-first로검사한다. PrivateTransposeLeft는이중앙dispatch를사용하며 nonfinite입력에서invalid_argument를전달한다. BuildEigenReduction/linearfrequency/FEAST owner는해당typedfailure를기존Result taxonomy로변환한다. MakeLift actual basis/scaled operands와FEAST normalizedphi/mass_modes producer도dispatch전에검사한다. +밀집 GEMV/GEMM은 `Matrix::Multiply`에서 양쪽 matrix storage와 Vector RHS를 +호출 전에 finite 검사한다. Private transpose-left 연산도 이 경계를 사용하며 +비유한 입력은 `invalid_argument`로 거부한다. Eigen reduction·frequency·FEAST +owner는 이를 기존 Result 실패 형식으로 변환한다. MakeLift의 실제 basis와 +scaled operand, FEAST의 normalized phi와 mass_modes도 dispatch 전에 검사한다. Production caller finite 입력은 별도로 확인한다. Recovery는 기존 `IsFiniteVector`→Multiply→finite output 순서를 유지한다. Linear frequency의 physical @@ -85,48 +89,51 @@ error·gamma·underflow certification·free/reaction 판정은 그대로다. [T1 실제 VTune](verification.md)의 OMP worker/spin 비용과 아래 toy n=1 lifecycle 근거로, SPD/Tangent의 `CallPardiso`에서 **현재 retained equation_count=1**인 경우만 -호출 기본 thread 정책을1로 제한한다. Phase11/22/33/−1 각각의 호출 범위다. -`mkl_set_num_threads_local(1)`의 이전 TLS override가0인 경우만 scope1을 유지하고 -끝에0을 복원한다. 이전값이비영이면 즉시 그값을복원하여 caller override대로 -backend를실행한다. n=0/2이상·전역 MKL/OpenMP 요청·dispatch·iparm·pivot/scaling/ -regularization·acceptance는변경하지않는다. 넓은size threshold는추정하지않았다. +호출의 기본 thread 수를 1로 제한한다. Phase 11/22/33/−1 각각의 호출 범위다. +`mkl_set_num_threads_local(1)`의 이전 TLS override가 0일 때만 1을 유지하고, +범위 종료 시 0을 복원한다. 이전값이 비영이면 즉시 그 값을 복원하여 호출자의 +override로 backend를 실행한다. n=0 또는 n≥2, 전역 MKL/OpenMP 요청, dispatch, +iparm·pivot/scaling·regularization·acceptance는 변경하지 않는다. +계측하지 않은 더 넓은 size threshold는 채택하지 않았다. -Release의oldfactor는old retained count, newfactor는newcount를각call에서사용하므로 -작은oldmatrix release 뒤 큰newmatrix가 single-thread로 오염되지 않는다. -현재원시기록의 외부 MKL/OMP 요청은8/dynamicFALSE로baseline과같고 실제 source -정책은default1×1 calls에서달라진다. 이 차이를환경동일이라는표현으로숨기지않는다. -Phase 성공/오류/exception·잘못된 RHS 및 concurrent worker의 TLS 복원과 candidate -보존을실제검사한다. Native process crash는C++ RAII unwind를보장하지않으며, 해당 -진단의scope설정은종료한process의TLS여서다음실행/전역환경에남지않는다. +Release는 이전 factor의 retained count, 새 factor는 새 count를 사용한다. +따라서 작은 matrix의 release 뒤 큰 matrix 호출에 설정이 남지 않는다. +외부 MKL/OMP 요청은 baseline과 같은 8/dynamic FALSE지만, 소스의 실제 자원 +정책은 기본 설정의 1×1 호출에서 달라진다. 두 조건을 구분해 보고한다. +Phase 성공·오류·exception, 잘못된 RHS와 동시 호출에서 TLS 복원과 candidate +보존을 검사한다. Native process crash는 C++ RAII unwind를 보장하지 않는다. +종료한 process의 TLS 설정은 다음 실행이나 전역 환경에 남지 않는다. ### Baseline PARDISO heap failure와 제한 -기존staticpartialfixture는full24×24/free1×1이다. `backend-isolation`의SpMV-only -1000회create/mv/destroy는native0이며, PARDISO-only100회예정실행은native -`−1073740940 (0xc0000374)`로중단됐다. 별도반복staticfixture도iteration3에서같은 -heap-corruption을재현했다. 이를새SpMV수명회귀나단순testPASS로분류하지않는다. +기존 static partial fixture는 full 24×24/free 1×1이다. `backend-isolation`의 +SpMV-only 생성·곱셈·해제 1,000회는 native 0이었다. PARDISO-only 100회 예정 +실행은 native `−1073740940 (0xc0000374)`로 중단됐다. 별도의 반복 static +fixture도 iteration 3에서 같은 heap 손상을 재현했다. +새 SpMV 수명 회귀와 분리해 기록하며 이 실패를 검사 통과로 표시하지 않는다. -같은freshauxTU를T1의기존Release library에`/O2 /Ob2 /MD /DNDEBUG /Zi`로link해 -실제baseline을대조했다. Baseline default8은61회완료뒤62에서같은nativecrash, -scoped1은100회native0와각scope끝effective8복원을기록했다. CurrentDebug -`/Od /Ob0 /MDd /RTC1 /Zi` recordedprobe의8/1은각100회완료했으나이전Debug -probe의2/3회crash를지우지않는다. 실패가간헐적이므로100회통과를vendor문제 -해결확정으로쓰지않는다. Debug/Release차이도그대로기록한다. +같은 독립 진단 소스를 T1의 기존 Release library에 +`/O2 /Ob2 /MD /DNDEBUG /Zi`로 link해 baseline을 대조했다. 기본 8-thread +실행은 61회 완료 뒤 62회에서 같은 native crash가 발생했다. Scoped 1-thread는 +100회 native 0이며 각 범위 종료 뒤 effective 8 복원을 기록했다. +현재 Debug `/Od /Ob0 /MDd /RTC1 /Zi` 대조의 8/1-thread는 각각 100회 +완료했지만, 이전 Debug 진단의 iteration 2/3 crash도 보존한다. 간헐적 실패이므로 +100회 통과를 vendor 문제의 해결 확정으로 쓰지 않는다. Debug/Release도 구분한다. -Ordered full/free CSR offsets/columns/rawdoublebits와RHS inputSHA는양쪽 +Ordered full/free CSR offsets·columns·raw double bits와 RHS의 input SHA는 양쪽 `CC7E72000783E9694BAF76627D95AB7B420A31198B210B5A60C7ACE93E5E2258`로같다. -ILP64·mtype2·actual pardisoinit defaultcontrols(26 checker/34 zerobased 포함), 동일 +ILP64·mtype 2·실제 pardisoinit 기본 controls(26 checker/34 zero-based 포함), 동일 MKL/runtimeDLL hash는[recorded-probes metadata](../../.harness/performance/t2/recorded-probes-metadata.json)와 -[native 기록](../../.harness/performance/t2/recorded-probes-native.json)에있다. -기존PARDISO/backend영역실패를실제baseline에서재현했으며vendor내부원인은미확정이다. +[native 기록](../../.harness/performance/t2/recorded-probes-native.json)에 있다. +기존 PARDISO/backend 영역의 실패를 실제 baseline에서 재현했지만 내부 원인은 미확정이다. [Intel release notes](https://www.intel.com/content/www/us/en/developer/articles/release-notes/onemkl/2026.html)의 -non-AVX2 PARDISO sporadic pivoting issue는조사근거이고현재원인확정이아니다. -설치·dispatch·전역registry/pageheap변경은하지않았다. +non-AVX2 PARDISO sporadic pivoting issue는 조사 근거이며 현재 원인을 확정하지 않는다. +설치·dispatch·전역 registry/pageheap은 변경하지 않았다. -같은toy n=1 보조비용실행에서default8은11회뒤crash/0.24s, -scope1은100회완료/0.15s였다. 이는동일입력준비/로그를포함한auxiliary이며 -실패/표본수차이가있어공식whole-model speedup이나시간목표판정에사용하지않는다. -[Tiny native 비용기록](../../.harness/performance/t2/tiny-pardiso-cost-native.json)에실제범위를기록했다. +같은 toy n=1 보조 실행에서 default 8-thread는 11회 뒤 crash/0.24초, +scoped 1-thread는 100회 완료/0.15초였다. 입력 준비와 로그를 포함한 보조 자료이며, +실패와 표본 수 차이가 있어 공식 모델의 개선 배수나 시간 목표 판정에 사용하지 않는다. +[비용기록](../../.harness/performance/t2/tiny-pardiso-cost-native.json)에 실제 범위를 남겼다. ## 특수 정밀도 개선과 예외