chore: remove retired workflow and historical material
This commit is contained in:
@@ -1,54 +0,0 @@
|
||||
# 계산 성능 개선 결정
|
||||
|
||||
이 문서는 이번 사용자 승인 범위와 선택을 기록한다. [PRD](PRD.md)가 요구사항과
|
||||
현재 checklist를 소유하며 [공통 ADR](../ADR.md), [공통 PRD](../PRD.md)와
|
||||
[AGENTS](../../AGENTS.md)의 기존 물리·수치·I/O 계약을 변경하지 않는다.
|
||||
|
||||
## PERF-ADR-001 — 전체 실행 시간과 반복 판정
|
||||
|
||||
- 상태: 사용자 승인.
|
||||
반복 횟수·워밍업 부분은 2026-10-14 PERF-ADR-004로 대체됐다.
|
||||
- 결정: 현재 AMD Ryzen 7 5800H PC에서 최적화 빌드 전체 경과 시간을 측정한다.
|
||||
정적 Hex8 2초·동적 Hex8 100초·shell 동적 100초를 모두 만족해야 한다.
|
||||
모델마다 워밍업 1회 후 비계측 5회 모두 상한 이내여야 한다.
|
||||
- 이유: 실제 결과를 받기까지의 시간을 평가하고 우연히 빠른 실행으로 판정하지 않는다.
|
||||
- 영향: 입력 준비·비교는 시계 밖, native 시작·계산·필수 로그와 HDF5 저장·종료는
|
||||
시계 안이다. 측정 도구 종료 0과 시간·정확성 합격을 구별한다.
|
||||
- 승인 근거: 이 세션의 측정 방식 선택, 반복 측정 제안 동의, 아키텍처 보강 문서 승인과
|
||||
`$dryforge:go` 실행 요청.
|
||||
|
||||
## PERF-ADR-002 — MKL 필수 범위와 정밀도 예외
|
||||
|
||||
- 상태: 사용자 승인.
|
||||
- 결정: 일반 밀집·희소 곱셈과 선형 해법에 MKL을 필수 사용한다. 작은 좌표 계산과
|
||||
특수 정밀도는 위치·연산·이유·근거를 남겨 예외를 허용한다. Silent fallback은 없다.
|
||||
- 이유: 일반 행렬의 MKL 적용을 확보하면서 호출 비용과 승인된 high+low/보상/
|
||||
interval 연산의 수치 의미를 보존한다.
|
||||
- 영향: private vendor 경계·checked index·자원 수명과 각 consumer 검증을 유지한다.
|
||||
Persistent handle·symbolic 재사용은 실제 비용과 lifecycle 입증이 필요한 후보다.
|
||||
- 승인 근거: 사용자 MKL 범위 선택과 보강 문서 승인.
|
||||
|
||||
## PERF-ADR-003 — 기존 구조와 최신 물리 계약 유지
|
||||
|
||||
- 상태: 사용자 승인.
|
||||
- 결정: 기존 프로젝트 문서를 유지하고 기능 문서만 추가한다. 기준 소스는
|
||||
`eaa5cbeb21b231862ed80f89386412232b0571c9`다. 최적화는 별도 feature branch에 두고
|
||||
기존 Domain/equation/element/assembly/procedure/backend/results/writer 책임을 유지한다.
|
||||
- 이유: 측정·수명 검증으로 필요한 최소 변경을 선택하고 기능 추가나 전면 재설계를
|
||||
성능 작업과 섞지 않는다.
|
||||
- 영향: Hex8 mean-volume·lumped/high+low, shell reduced-coordinate HHT/schema v2,
|
||||
원본·시간 schedule·수치 기준·필수 출력은 그대로다. 완료 뒤 최신 전체 MSVC x64
|
||||
Debug 및 필수 원본 비교·독립 검토를 수행하며 과거 중단을 PASS로 승계하지 않는다.
|
||||
- 승인 근거: 기존 문서 유지 선택, 최신 dev 병합 요청, 아키텍처 보강 문서 승인.
|
||||
|
||||
## PERF-ADR-004 — 워밍업 없는 단일 성능 측정
|
||||
|
||||
- 상태: 2026-10-14 사용자 승인; PERF-ADR-001의 반복 횟수·워밍업 부분을 대체한다.
|
||||
- 결정: 최적화 전후 각각 모델별 별도 프로세스로 워밍업 없이 1회만 공식 측정한다.
|
||||
시간 목표·전체 경과 시간의 범위·MKL/VTune·정확성·필수 출력 계약은 유지한다.
|
||||
- 이유: 사용자가 장시간 작업 중 PC 중단을 알리고 측정 횟수 변경과 작업 계속을 지시했다.
|
||||
중단 원인은 별도 입증 없이 특정하지 않는다.
|
||||
- 영향: 기존 raw 실행과 완료 표본은 과거 프로토콜 이력으로 보존한다. 중단된 표본은
|
||||
성공으로 채우지 않으며, 이전 워밍업 뒤 표본이나 가장 빠른 값을 단일 판정에 대입하지 않는다.
|
||||
수정된 측정 도구로 새 기준/최종 자료를 기록하고 각 결과를 타이머 밖에서 비교한다.
|
||||
- 승인 근거: “성능 테스트에 워밍업+측정5회를 측정1회로 변경하겠습니다. 작업을 계속 진행하세요.”
|
||||
@@ -1,45 +0,0 @@
|
||||
# 계산 성능 개선 작업 지침
|
||||
|
||||
- Feature ID: `calculation-performance`.
|
||||
- 목적: 원본 비선형 정적 Hex8 2초, 비선형 동적 Hex8 100초, shell 동적 100초.
|
||||
- 요구사항·현재 checklist: [PRD](PRD.md).
|
||||
- 사용자 선택과 구현 경계: [ADR](ADR.md).
|
||||
- 적용 공통 기준: [AGENTS](../../AGENTS.md), [공통 PRD](../PRD.md),
|
||||
[공통 ADR](../ADR.md), [구조](../ARCHITECTURE.md), [검증 규칙](../standards.md).
|
||||
|
||||
## 소유권
|
||||
|
||||
메인이 기능 계약·현재 checklist·공유 target/assembly 등록·통합 결과를 관리한다.
|
||||
측정 도구·빌드 설정, MKL/math/backend, Hex8, reduced shell 작업은 승인 계획의
|
||||
각 owner가 담당한다. 동시에 다른 owner의 파일을 수정하거나 변경을 되돌리지 않는다.
|
||||
Production MKL·수명·수치 변경에는 독립 수치 검토, 실제 완료 결과에는 필요한
|
||||
독립 물리 검토를 적용한다. 고정 전문 역할 순회는 하지 않는다.
|
||||
|
||||
## 반드시 보존할 기준
|
||||
|
||||
일반 밀집·희소 곱셈과 선형 해법에 MKL을 사용한다. 작은 좌표/특수 정밀도
|
||||
예외는 실제 위치·연산·이유·근거를 기록한다. Domain·DofManager·local response·
|
||||
assembly·procedure·backend·results·writer의 책임을 유지한다.
|
||||
불변 준비 데이터와 trial 계산 결과를 구별하고 stale factorization·실패 candidate
|
||||
노출·비결정적 공유 누적을 허용하지 않는다.
|
||||
|
||||
원본·물리식·질량·high+low·시간간격·수용 기준·필수 출력·schema·tolerance를
|
||||
성능을 위해 바꾸지 않는다. 원본은 scratch에 byte-identical로 복사하여 실행한다.
|
||||
전체 실행 경과 시간은 VTune 없이 워밍업 없는 모델별 1회가 목표 이내여야 한다.
|
||||
측정 횟수는 PC 중단 후 사용자의 2026-10-14 변경 지시를 따르며 이전 raw 이력을 보존한다.
|
||||
현재 AMD PC의 VTune 소프트웨어 수집과 공식 측정은 순차 실행한다.
|
||||
|
||||
## 소비할 상세 계약
|
||||
|
||||
- [Hex8 최종 인계](../hex8-structural-analysis/final-handoff.md),
|
||||
[수치 기준](../hex8-structural-analysis/numeric-controls.md),
|
||||
[원본 mapping](../hex8-structural-analysis/reference-model.md).
|
||||
- [Shell PRD](../hht-implicit-dynamics/PRD.md),
|
||||
[축소좌표 식](../hht-implicit-dynamics/formulation-reduced-coordinate.md),
|
||||
[schema v2](../hht-implicit-dynamics/io-reduced-coordinate.md).
|
||||
- [공통 tolerance](../TOLERANCE.md), [실행 방법](../operations.md),
|
||||
수정 영역의 지역 AGENTS.
|
||||
|
||||
현재 실행 근거는 `.harness/performance/`에 보존하고 정식 보고서에서 연결한다.
|
||||
기존 중단·FAIL/SKIP을 현재 PASS로 표시하지 않는다. 새 회귀와 목표 미달은
|
||||
완료를 차단하며 승인된 일반 수정에 반복 승인 절차를 추가하지 않는다.
|
||||
@@ -1,395 +0,0 @@
|
||||
# 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회 측정**한다.
|
||||
**측정한 1회가 해당 시간 상한 이내여야 합격**이다. 반복 실행 중 빠른 값을
|
||||
선택하거나 과거 워밍업 뒤 측정값으로 현재 단일 측정을 대신하지 않는다.
|
||||
2026-10-14 사용자가 장시간 작업 중 PC 중단을 알리고 기존 워밍업 1회·측정
|
||||
5회를 측정 1회로 변경했다. 이전 raw 자료는 별도 이력으로 보존한다.
|
||||
|
||||
단조 증가 시계로 프로세스 시작 요청 직전부터 정상 종료를 확인한 직후까지
|
||||
측정한다. 프로세스 시작, 입력 읽기, 모델 준비, 모든 계산·복구, 필수 로그와
|
||||
최종 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에 확대하지 않는다.
|
||||
모델별 1회 시간 표본의 결과를 기존 비교기로 확인하며 비교 시간은 타이머 밖이다.
|
||||
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 및 관련 환경 설정을 포함한다.
|
||||
전후 비교에는 각 모델의 1회 값·개별 합격 여부와 전체 판정이 있어야 한다.
|
||||
성능 판정과 수치/검증 판정을 별개로 표시하며 최종 완료는 둘 다 충족해야 한다.
|
||||
|
||||
측정 진입점은 `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개이며 `kind=measurement`,
|
||||
`measurement_index=1`이다. 이전 raw 이력의 `warmup`과 측정 2–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를 채택하면
|
||||
보존하는 크기·수명과 반복 후 증가하지 않는 근거를 함께 보고한다.
|
||||
|
||||
## 선택의 이유와 제외 범위
|
||||
|
||||
전체 경과 시간은 실제 사용자가 결과를 받기까지의 시간을 반영한다.
|
||||
사용자가 PC 중단 후 승인한 단일 측정은 장시간 반복 부하를 줄이기 위한 것이다.
|
||||
반복 중 빠른 값을 고르는 방식으로 단일 측정의 합격을 만들어내지 않는다.
|
||||
현재 PC와 소프트웨어 샘플링을 고정하여 실제 작업 환경에서 평가한다.
|
||||
MKL은 일반 행렬 연산에 필수로 사용하면서 작은 좌표 계산의 호출 비용과
|
||||
특수 정밀도 계약을 보존하는 예외를 허용한다.
|
||||
|
||||
새 요소·새 procedure, 입력 단순화, 시간간격 조정, 질량/정식화 변경,
|
||||
reference/tolerance 수정, 출력 축소 및 기존 다른 문제의 포괄적인 수리는 제외한다.
|
||||
프로파일러 연결만 완료하거나 시간만 충족한 상태는 전체 작업 완료가 아니다.
|
||||
|
||||
## 현재 checklist
|
||||
|
||||
- [x] 최적화 빌드·측정기의 행동 검증, 환경과 source/input/binary identity 확보.
|
||||
- [x] 세 원본의 기준 전체 실행·외부 비교와 VTune 소프트웨어 병목 자료 확보.
|
||||
- [ ] 일반 행렬 곱셈·선형 해법의 MKL 경계와 수명 검증, 적용·예외 목록 확보.
|
||||
- [ ] Hex8 병목 개선·관련 행동/수치·원본 검증 완료.
|
||||
- [ ] Reduced shell 병목 개선·관련 행동/수치·원본 검증 완료.
|
||||
- [ ] 최종 세 모델의 워밍업 없는 1회 시간 목표 및 각 결과의 외부 비교 통과.
|
||||
- [ ] 최종 전체 MSVC x64 Debug build/CTest와 필요한 Python 검사 완료·기존 예외 대조.
|
||||
- [ ] 필요한 독립 수치·물리 검토 및 VTune 전후 결과, 최종 보고 완료.
|
||||
|
||||
과거 다른 기능의 PASS/FAIL/SKIP과 사용자 중단은 이 checklist를 대체하지 않는다.
|
||||
|
||||
## 2026-10-16 사용자 요청에 따른 중간 병합
|
||||
|
||||
사용자가 여기까지의 작업을 마치고 dev에 병합·커밋하도록 요청했다. 추가 최적화와
|
||||
성능 실행을 중단하고, 검증된 구현 및 실제 실행 기록을 중간 상태로 보존한다.
|
||||
위 미완료 checklist를 완료로 변경하지 않는다.
|
||||
|
||||
- 일반 행렬 연산의 MKL 전환, Hex8 high/low 계산 최적화 및 guarded AVX2 경계,
|
||||
셸 Hessian 영값 계산 절감과 complete-trial 제약 재사용을 포함한다.
|
||||
- 최신 Hex8 기하 packet 후보는 Debug·Release 관련 검사 각각82개와 원본 대비
|
||||
9,804행 byte 비교를 통과했다. 단일 동적 개발 실행은117.7986225초/FESA native0,
|
||||
전체101 U frame과 schema 비교 통과였으며100초 목표에는 미달했다. 측정 wrapper의
|
||||
별도 실패와 uv native unknown 기록은 보존한다. 상세는 hex8-performance.md에 둔다.
|
||||
- 셸의 명시 영 seed 구현은 관련57개 검사와 실제 응답20,126개 byte 비교를 통과했다.
|
||||
이후 자료는 SW60 부분 프로파일이며 최신 구현의 전체 실행 시간은 미측정이다.
|
||||
Nodal6×6 후보는 제한된 micro 차이만 확인되어 보류했고 production에 포함하지 않는다.
|
||||
상세는 t4-shell-optimization.md에 둔다.
|
||||
- 최종 통합 source의 fresh 전체 MSVC x64 Debug build/CTest, 필수 reference 및
|
||||
세 모델의 공식 단일 시간 판정과 독립 수치·물리 검토는 미완료다. 개별 후보의
|
||||
관련 검사 결과를 통합 source의 전체 통과나 성능 목표 달성으로 대체하지 않는다.
|
||||
|
||||
이번 종료·병합에서는 새로운 solver 동작 변경이나 장시간 검사를 추가하지 않는다.
|
||||
기존 evidence는 유지하며 재개 시 위 checklist와 각 구현·실행 source를 먼저 대조한다.
|
||||
@@ -1,752 +0,0 @@
|
||||
# Hex8 계산 경로 개선 기록
|
||||
|
||||
이 기록은 성능 요구사항의 Hex8 구현 범위와 개발 검증을 설명한다.
|
||||
기준 작업 소스는 `8c7c41729eb9eaa904f6739b54d34c37b1bd555f`다.
|
||||
MKL 경계 수치 소스는 `71e08169ecfc3eee8372cd831b799b87aa47c78b`에서
|
||||
검토·검사했으며 이후 `43c747f`는 오류 우선순위 검사 두 개만 추가했다.
|
||||
`6d709fd`는 trial-local 반복 연산 제거로 별도 검토·검사했다.
|
||||
후속 `774bfbc`는 geometric 첫 곱을 같은 point 안에서 재사용하며, `6bc5cd3`은
|
||||
아래 선택적 paired Hessian의 준비 수명을 바꾼 소스다. `a08df0f`는 동시 호출
|
||||
검사의 시작 대기 조건만 추가했고 같은 production을 새 Debug/Release로 검증했다.
|
||||
후속 병합 `45aac19`에는 root의 공통 finite classifier `47d2a81`이 포함된다.
|
||||
이 병합 뒤의 소비자 재빌드와 동적 개발 실행은 문서 commit `decd959`에서 수행했다.
|
||||
이전 검사 결과를 새 소스의 통과로 대입하지 않는다.
|
||||
후속 `3576f3f`는 root가 공통 최하위 bit 검색을 MSVC x64 intrinsic으로 바꾼
|
||||
소스다. 같은 수치 header hash의 root Debug 검사와 T3 Release 실행을 아래에서
|
||||
구별한다. T3가 공통 산술을 직접 수정하지 않았다.
|
||||
공식 기준 Release 소스와 이 개발용 Debug 대조 소스를 혼용하지 않는다.
|
||||
|
||||
## 실제 병목에 대응하는 변경
|
||||
|
||||
기준 VTune의 `TwoSum → Add → Multiply → hex8_high_low::operator* →
|
||||
EvaluateHighLow` 호출 경로에서 확인한 pair 산술 비용을 줄였다.
|
||||
이 단계에서는 공통 high+low 산술을 바꾸지 않고 Hex8 private `hex8_pair_arithmetic.h`에
|
||||
두 helper를 추가했다.
|
||||
|
||||
- `AddPair`는 양쪽 입력의 finite·normalized 검사를 먼저 수행한다. Canonical
|
||||
zero operand만 항등원으로 처리하고 결과 low의 signed zero를 원래 Add와
|
||||
같은 +0으로 만든다. 두 항이 비zero면 원래 Add를 그대로 호출한다.
|
||||
- `MultiplyPair`는 같은 입력 검사를 유지한다. Low가 zero인 경우에만 정확히
|
||||
zero인 cross-product와 반복되는 zero Add를 생략한다. Nonzero component의
|
||||
곱 순서는 원래와 같으며 `TwoProduct`의 least-bit underflow 판정, FMA tail,
|
||||
overflow 실패를 유지한다. 두 low가 모두 비zero면 원래 Multiply를 호출한다.
|
||||
|
||||
Normalized pair에 zero를 더하는 원래 연산은 값과 비zero low를 보존하며 low의
|
||||
zero 부호만 canonicalize한다. 한 번 수행한 뒤 반복해도 같은 결과이므로 이
|
||||
항등 연산만 줄일 수 있다. 임의의 작은 값이나 거의 zero인 값을 제거하지 않는다.
|
||||
Signed zero·비정규화 pair·비유한 값은 shortcut 전에 원래 guard에서 거부한다.
|
||||
[최종 독립 수치 검토](../../.harness/performance/t3/source-numerical-review-71e0816.md)는
|
||||
이 증명과 아래 MKL·오류 수명 경계를 확인했다. 검토 PASS는 실제 실행이나 공식
|
||||
전체 성능 합격을 대신하지 않는다.
|
||||
|
||||
동일 trial point에서 `deviatoric_coefficient*fg`, `mu*fg`, `mu*fft`의 첫 곱을
|
||||
각각 24·24·9개 준비한다. 원래 576개 tangent entry마다 같은 첫 곱을 반복했던
|
||||
경로에서만 재사용하고 두 번째 곱과 덧셈 association은 유지한다. Bulk의 같은
|
||||
첫 곱도 row별 24개 준비한다. 다음 trial에서는 새로 계산하며 reference나 다른
|
||||
trial의 constitutive 값을 가져오지 않는다.
|
||||
[이 변경의 독립 검토](../../.harness/performance/t3/source-numerical-review-6d709fd.md)는
|
||||
같은 입력·연산으로 생성한 pair의 bit 및 invalid propagation이 유지됨을 확인했다.
|
||||
|
||||
Geometric의 `gradient[a][j]*s[l][j]`도 b에 무관하므로 point별 72개 첫 곱으로
|
||||
준비한다. 원래 뒤의 `gradient[b][l]` 곱과 j/l 누적 순서는 그대로다.
|
||||
이는 nonlinear trial point의 automatic storage 1,152 bytes이며 global 또는
|
||||
다른 trial의 cache가 아니다. 새로운 조기 finite 반환이나 clamp를 넣지 않는다.
|
||||
|
||||
## 선택적 paired Hessian의 준비 수명
|
||||
|
||||
현재 정적 모델은 Float64 `Evaluate`를 사용한다. 개발 static VTune에서 paired
|
||||
`EvaluateHighLow`는 `Create`가 선택적 zero-Hessian을 미리 준비하는 경로에
|
||||
나타났다. 초기 보고에서 static에 `EvaluateSolids`를 연결했던 설명은 잘못이었다.
|
||||
`EvaluateSolids`는 원래 dynamic profile의 경로이며 이번 static에는 없다.
|
||||
[소유 경로별 집계](../../.harness/performance/t3/vtune-owner-attribution.json)는
|
||||
Create의 descendant sampled CPU 5.15735초, writer 2.750676초, static state
|
||||
2.626941초를 보였다. 중첩 그룹이며 각 메서드의 header-leaf 자체 비용은 제외되어
|
||||
완전한 inclusive 총합이 아니다. 또한 `71e0816` binary 자료를 후속 후보의 비용으로
|
||||
소급하지 않는다.
|
||||
|
||||
기존 Create는 선택적 paired 준비가 실패해도 F64 모델을 거부하지 않았다. 따라서
|
||||
현재 후보는 모든 필수 Create geometry/material/reference stiffness/finite/positive
|
||||
diagonal 검사를 유지하면서 이 선택적 준비만 첫 유효 `EvaluateLinearHighLow`
|
||||
호출로 옮긴다. Float64 static·state·writer는 사용하지 않는 pair 준비를 하지 않는다.
|
||||
Nonlinear paired 계산은 이 cache의 ready/data를 읽거나 준비하지 않는다.
|
||||
|
||||
준비는 실제 trial의 환경·shape·normalized relative state·전체 current geometry
|
||||
검사를 통과한 뒤 실행한다. `call_once`의 zero-trial callback은 같은 private
|
||||
paired quadrature graph를 쓰며 재귀적인 once 진입을 명시적으로 건너뛴다.
|
||||
Unsupported rounding/FTZ/DAZ 호출은 once에 들어가지 않으므로 환경 복원 뒤 정상
|
||||
호출이 준비할 수 있다. 성공한 high와 low Hessian을 모두 저장한 뒤에만 ready를
|
||||
설정한다. 정상 trial 입력을 cache에 저장하지 않는다.
|
||||
|
||||
Private prepared-data에는 once flag·ready와 두 matrix만 있다. 같은 owned
|
||||
reference coordinates/points/material을 복사한 Element끼리 공유한다. Caller나
|
||||
Domain 주소에 의존하지 않고 callback의 `this`를 이후에 저장하지 않는다.
|
||||
성공한 저장량은 24×24 high/low 각 하나, logical value 9,216 bytes와 metadata다.
|
||||
다른 trial의 cache/history가 누적되지 않는다. Const 첫 호출의 동시성은 once로
|
||||
동기화한다. 실제 서로 다른 trial과 copy·move의 첫 호출 검사는 모든 worker가
|
||||
시작 대기에 도달한 뒤 함께 해제하며, 원래 전체 pair snapshot도 별도로 대조했다.
|
||||
Once 횟수와 최대 저장량의 source 구조 증명은 native 결과와 구별한다.
|
||||
[수명과 동기화의 독립 검토](../../.harness/performance/t3/source-numerical-review-6bc5cd3.md)는
|
||||
`6bc5cd3` production 소스를 확인한 자료다.
|
||||
|
||||
## MKL 적용과 연산 순서
|
||||
|
||||
| 경로 | 일반 연산 / MKL 경계 | 보존한 의미 |
|
||||
| --- | --- | --- |
|
||||
| `Hex8Element::Create` | Deviatoric·shear·bulk의 24×24 rank-one outer → `Matrix::Multiply` / DGEMM k=1 | Coefficient를 왼쪽 값에 먼저 곱하고 기존 point·entry 순서로 누적 |
|
||||
| `Hex8Element::Evaluate` | 같은 24×24 outer와 node/component permutation → DGEMM k=1 | 기존 material/geometric 분리와 최종 tangent 합 |
|
||||
| `GradientProduct` | Node Gram의 192 entry products → private `MultiplyDiagonal` / DSBMV k=0 | 원래 `(p0+p1)+p2` association |
|
||||
| `GradientProduct`의 geometric 경로 | 64개 entry의 9 terms, 두 단계 entry products → DSBMV k=0 | 원래 `ga[j]*s[l][j]` 뒤 `gb[l]` 곱, 원래 j/l 순서의 누적 |
|
||||
| `Hex8Element::ComputeMass` | 8×8 `rho*N_a*N_b` outer → DGEMM k=1 | Weight를 뒤에 곱하고 전체 consistent matrix의 행합을 BC 축소 전에 계산 |
|
||||
|
||||
Gram과 geometric 연산을 일반 GEMM으로 재결합했던 후보는 채택하지 않았다.
|
||||
중간 `G*Sᵀ`의 큰 합이 원래 term별 연산에는 없는 overflow를 만들 수 있기
|
||||
때문이다. 현재 entry products는 MKL을 사용하면서 원래 association과 ordered
|
||||
sum을 유지한다. Workspace는 단발 192 또는 576개의 연속 값이며 지속 cache나
|
||||
global dense matrix를 만들지 않는다.
|
||||
|
||||
공통 Matrix와 private diagonal adapter의 finite 입력 검사를 유지한다. 전역
|
||||
thread 설정이나 vendor dispatch, PARDISO 제어, controller·수렴 기준은 바꾸지
|
||||
않았다. 작은 MKL 호출의 비용을 아직 공식 전체 실행의 개선 효과로 단정하지 않는다.
|
||||
|
||||
## 실패한 계산과 진단
|
||||
|
||||
MKL 입력 검증이 이미 실패한 point 또는 bulk block에서만 원래 scalar 식을
|
||||
진단용으로 재현한다. 이는 원래 실패 위치와 뒤따르는 gate의 우선순위를 유지하기
|
||||
위한 경로다. `backend_inputs_failed`가 남으므로 기존 검사들이 모두 통과해도
|
||||
정상 element/response를 반환할 수 없다. 이 경우 명시적인 MKL finite-validation
|
||||
실패로 종료하며 직접 계산한 성공 결과로 대체하지 않는다.
|
||||
|
||||
Create의 volume·stiffness finite·positive diagonal 순서, Evaluate의 point tensor·
|
||||
최종 energy·각 row force/tangent 검사를 유지한다. 뒤 point의 geometry나 tensor
|
||||
실패가 먼저 선택되는 의미도 보존한다. 진단용 candidate는 caller state, accepted
|
||||
history, 최종 HDF5로 발행하지 않는다. 비유한 operand를 zero로 바꿔 backend를
|
||||
실행하거나 tolerance를 완화하지 않는다.
|
||||
|
||||
Density는 Create에서 finite positive로 검증되고 Gauss shape는 불변이며 (0,1)에
|
||||
있다. 따라서 mass의 `rho*N_a` 입력은 finite다. Product와 weight 뒤 finite 검사,
|
||||
consistent 누적 검사, 전체 행합의 positive/finite 검사는 각각 원래대로 남아 있다.
|
||||
|
||||
## 특수 정밀도와 소유권
|
||||
|
||||
| 파일 / 연산 | 크기·정밀도 | 예외 근거 |
|
||||
| --- | --- | --- |
|
||||
| `hex8_high_low.cpp`의 tensor·force·energy·24×24 tangent | Normalized binary64 high+low | Low 상태와 underflow-risk tail 정책을 Float64 BLAS로 대체할 수 없음. Shortcut은 원래 bit oracle와 독립 증명으로 제한 |
|
||||
| `hex8_geometry.cpp`의 whole-cell geometry certificate | Fixed3 좌표, outward interval | 전체 cell 양성 판정·depth 10·budget 65536을 유지. 변경 없음 |
|
||||
| `hex8_element.cpp`의 F/S/P/FFT/stress 좌표 tensor | Fixed3×3 좌표·구성 관계 | 좌표 contraction이며 일반 node outer와 구별. 변경 없음 |
|
||||
| 같은 파일의 displacement 차이와 force contraction | FMA residual 및 보상 누적 | 큰 translation에서 tiny strain을 보존하는 오차항과 association 유지 |
|
||||
| `solid_static_procedure.cpp`의 uncancelled arithmetic scale | 원래 CSR products의 절대값·오차 인증 누적 | 물리 matrix action이 아니라 기존 linear residual의 roundoff certificate. 변경 없음 |
|
||||
| MKL 검증 실패 block의 원래 scalar 식 | 실패 진단 전용 | 정상 성공 반환이 금지된 진단 재현. 성공 matrix action의 대체 경로가 아님 |
|
||||
|
||||
Element는 reference coordinates·gradients·weights를 값으로 소유한다. 새 helper나
|
||||
MKL workspace는 호출 수명이며 trial 상태를 주소로 재사용하지 않는다. Relative
|
||||
high+low gradient0은 다른 gradient들의 negative pair sum을 그대로 사용한다.
|
||||
Mean-volume energy, full reference row-sum mass, point identity, RN64 출력 및
|
||||
geometry/trial 검사를 변경하지 않았다. 조립의 deterministic tuple reduction과
|
||||
parallel buffer 소유권도 변경하지 않았다.
|
||||
|
||||
## 실제 개발 검증
|
||||
|
||||
| 범위 | 실제 결과 | 근거 |
|
||||
| --- | --- | --- |
|
||||
| 새 MultiplyPair oracle, production은 원래 경로 | Debug configure/build 0, Hex8 46/46 PASS | [Native](../../.harness/performance/t3/before-native.json), [log](../../.harness/performance/t3/before-checks.txt) |
|
||||
| Production `71e0816` | Debug build 0, Hex8·static·frequency·paired state/kinematics 84/84 PASS, native 0 | [Native](../../.harness/performance/t3/after-native.json), [log](../../.harness/performance/t3/after-checks.txt) |
|
||||
| `43c747f` tests-only delta | Build 0, overflow 진단 우선순위 2/2 PASS, native 0 | [Native](../../.harness/performance/t3/priority-native.json), [log](../../.harness/performance/t3/priority-checks.txt) |
|
||||
| `6d709fd` trial-local 반복 연산 제거 | Debug build 0, Hex8 48/48 PASS, native 0 | [Native](../../.harness/performance/t3/cache-native.json), [log](../../.harness/performance/t3/cache-checks.txt) |
|
||||
| 동일 TU의 원본/현재 Debug 진단 대조 | 60 finite-input 조합, 출력 306행 동일, 각각 native 0 | [Native](../../.harness/performance/t3/diagnostic-native.json), [comparison](../../.harness/performance/t3/diagnostic-comparison.json), [original manifest](../../.harness/performance/t3/original-debug/manifest.json) |
|
||||
| `a08df0f` 선택적 준비 수명 | Fresh Debug configure/build 0, Hex8·paired state/kinematics·serial/TBB 59/59 PASS, native 0 | [Native](../../.harness/performance/t3/lazy-native.json), [검사](../../.harness/performance/t3/lazy-checks.txt), [dependencies](../../.harness/performance/t3/lazy-dependencies.txt) |
|
||||
| 같은 TU의 원본/current pair snapshot | Flat/warped, linear/nonlinear 전체 response의 raw bits 9,804행 동일, 양쪽 compile/run native 0 | [Native](../../.harness/performance/t3/pair-snapshot-native.json), [대조](../../.harness/performance/t3/pair-snapshot-comparison.json) |
|
||||
| `decd959` 공통 finite classifier 통합 | Correct-prefix Debug configure/build/deps 0, HighLowArithmetic·Hex8·paired·serial/TBB 68/68 PASS, native 0 | [Native](../../.harness/performance/t3/postmerge-debug-native.json), [검사](../../.harness/performance/t3/postmerge-debug-checks.txt) |
|
||||
|
||||
Pair oracle는 고정된 원래 산술 header를 사용하여 raw high/low bits를 비교한다.
|
||||
Signed zero·half-ulp·invalid·최소 subnormal·최대값·overflow·underflow 경계,
|
||||
모든 power-of-two exponent와 양 부호, 12,000개의 deterministic raw random
|
||||
입력을 포함한다. 기존 analytical·energy/force/tangent·rigid·warped patch·mass·
|
||||
geometry·cached failure·state 보존 검사와 함께 실행했다.
|
||||
|
||||
별도 Release 개발 probe는 원본 정적 입력을 각각 새 scratch로 복사하여 워밍업
|
||||
없이 소스별 1회 실행했다. 최초 `43c747f`는 9.4669573초, 반복 연산을 줄인
|
||||
`6d709fd`는 5.2753221초, 선택적 준비를 지연한 `a08df0f`는 1.7391958초였다.
|
||||
각각 native 0, identity·finite·완전한 결과 검사와
|
||||
기존 전체 U/constrained RF/point S 비교를 통과했다.
|
||||
[최초 실행](../../.harness/performance/t3/development-static.json),
|
||||
[후속 실행](../../.harness/performance/t3/development-static-cache.json),
|
||||
[후속 비교](../../.harness/performance/t3/development-static-cache/run-1/comparison.json),
|
||||
[선택적 준비 지연 실행](../../.harness/performance/t3/development-static-lazy.json),
|
||||
[해당 비교](../../.harness/performance/t3/development-static-lazy/run-1/comparison.json)를
|
||||
모두 보존한다. 서로 다른 개발 소스의 값이며 빠른 값을 골라 공식 표본으로 쓰지
|
||||
않는다. 마지막 개발 값은 2초 이내지만 최종 통합 소스의 공식 목표 합격은 아직 아니다.
|
||||
|
||||
최초 개발 Release binary의 [VTune 함수 자료](../../.harness/performance/t3/vtune-functions.csv)와
|
||||
[호출 경로](../../.harness/performance/t3/vtune-callstacks.csv),
|
||||
[실제 명령과 native 기록](../../.harness/performance/t3/vtune-native.json)을 보존한다.
|
||||
Software sampling 10ms·stack 수집·hardware characterization 비활성 설정이다.
|
||||
Collector와 두 export는 native 0이며 target native는 독립 포착하지 않아 null이다.
|
||||
CPU 17.227초 중 effective 8.093초, spin 8.171초였고 iomp worker 6.605811초,
|
||||
LowestBitExponent 0.904216초, TwoSum 0.458413초, MultiplyPair 0.364517초였다.
|
||||
Fpclassify 29곳의 exclusive sampled CPU 합은 1.61345초다. Inclusive 호출 경로의
|
||||
시간과 합산하지 않고 프로파일 경과 시간을 공식 목표 판정에 대입하지 않는다.
|
||||
|
||||
원본 Debug library와 candidate를 같은 TU·compiler flags·runtime DLL로 대조했다.
|
||||
원본 library의 Hex8 production은 `8c7c417`이며 새 standalone helper 검사만
|
||||
있던 build다. 이 진단의 컴파일/실행을 CTest 종료 확인 전에 시작하여 약 10초
|
||||
CPU 작업이 겹쳤다. [겹침 기록](../../.harness/performance/t3/diagnostic-overlap.json)을
|
||||
보존하며 해당 elapsed는 성능 evidence에서 제외한다. 이미 완료된 동일 진단을
|
||||
반복하지 않았다. Finite 조합의 동일 결과를 모든 극단 입력의 증명으로 확대하지 않는다.
|
||||
|
||||
기존 Debug/Release Ninja의 MSVC include prefix가 깨졌고 조사한 Hex8 object의
|
||||
header dependency 수가 0이었다. [실제 조사](../../.harness/performance/t3/dependency-audit.txt)를
|
||||
보존한다. 산술 변경의 cpp 직접 재컴파일 로그는 있지만 header-only rebuild의
|
||||
정확성은 보장하지 않는다. `1d77e6b`는 private include guard만 고친 별도 commit으로
|
||||
산술 본문은 같다. 최종 검증과 공식 Release는 정상 dependency를 갖춘 fresh build가
|
||||
필요하며 기존 개발 build를 최종 검증으로 확대하지 않는다.
|
||||
VSLANG=1033만으로는 현재 설치의 Korean MSVC resource 문제를 해결하지 못했다.
|
||||
Root가 확인한 실제 prefix hook으로 `a08df0f`의 fresh Debug/Release build를
|
||||
구성했다. 각각 Hex8 high+low object의 Ninja dependencies 15개와 private/public
|
||||
header를 확인했다. [Release 기록](../../.harness/performance/t3/lazy-release-native.json)은
|
||||
configure/build와 dependency 검사의 실제 명령을 보존한다. 이번 private class layout의
|
||||
변경에는 factory·state·writer 등 모든 소비자를 새로 컴파일해야 하며 옛 object를
|
||||
수동 복사하거나 선택적으로 섞지 않는다.
|
||||
|
||||
Pair snapshot의 원본 executable은 `8c7c417` 전체 include tree를 동결하여 원본
|
||||
library와 함께 컴파일했다. Current executable은 current header와 fresh current
|
||||
library를 사용한다. 같은 probe TU와 Debug flags를 쓰되 두 executable의 response만
|
||||
대조했다. Current header를 원본 library에 연결하면 `Hex8Element`의 private layout
|
||||
변경으로 ABI가 맞지 않으므로 이 조합은 사용하지 않았다.
|
||||
|
||||
Root의 별도 `47d2a81` finite bit-classification 소스는 `45aac19`에서 통합했다.
|
||||
Root의 독립 검토와 62개 검사는 별도 공통 산술 자료다. 이 병합 뒤 올바른 include
|
||||
prefix metadata를 가진 기존 fresh tree에서 Debug 15개, Release 8개 build edge로
|
||||
실제 header 소비자를 재컴파일했다. Hex8 high+low dependencies 15개를 다시 확인했다.
|
||||
[Release 재빌드](../../.harness/performance/t3/postmerge-release-native.json)의
|
||||
configure/build/deps 모두 native 0이다. 이전 개발 시간이나 snapshot을 이 병합
|
||||
소스의 결과로 소급하지 않는다.
|
||||
|
||||
다음 동적 개발 실행은 재컴파일한 고정 소스의 원본 `hexa_dynnonlinear.inp`를
|
||||
워밍업 없이 한 번 실행하고 전체 경과 시간을 잰다. 제한은 150초이며 완료하면
|
||||
기존 전체 101-frame U 비교를 수행한다. 100초 초과 또는 timeout이면 같은 소스로
|
||||
30초 제한 VTune software sampling을 한 번 수집하는 범위가 승인되어 있다.
|
||||
실제 `decd959` 실행은 150.0362372초에서 timeout으로 종료했다. 외부 측정기와
|
||||
종료시킨 target native는 각각 1이며 결과 HDF5가 없어 101-frame 비교는 미실행이다.
|
||||
입력 원본/scratch 바이트와 실행 전후 source/header/binary/build/DLL identity는
|
||||
같았다. [실행 자료](../../.harness/performance/t3/development-dynamic-lazy.json)와
|
||||
[실제 target 기록](../../.harness/performance/t3/development-dynamic-lazy/run-1/native.json)을
|
||||
보존한다. 100초 목표 미달이며 timeout을 완료된 표본으로 처리하지 않는다.
|
||||
|
||||
후속 software sampling은 같은 binary로 30초 한 번만 수집했다. PowerShell이
|
||||
VTune의 정상 stderr를 `NativeCommandError`로 처리하여 wrapper native 1로
|
||||
끝났고 collector/target의 actual exit는 포착하지 못했다. 해당 값은 unknown이다.
|
||||
[실패 기록](../../.harness/performance/t3/vtune-dynamic-lazy-wrapper-failure.json)을
|
||||
보존하고 수집을 반복하지 않았다. 기존 raw 자료만 finalize/export했으며 두 export와
|
||||
그 wrapper는 native 0이다. 수집과 export 후 관련 프로세스가 모두 끝났음을 확인했다.
|
||||
[함수 자료](../../.harness/performance/t3/vtune-dynamic-lazy-functions.csv),
|
||||
[호출 경로](../../.harness/performance/t3/vtune-dynamic-lazy-callstacks.csv),
|
||||
[export native](../../.harness/performance/t3/vtune-dynamic-lazy-export-native.json)는
|
||||
부분 구간의 개발 profile이며 전체 실행 시간 자료가 아니다.
|
||||
|
||||
최신 sampled CPU는 LowestBitExponent 51.037592초, TwoSum 27.917520초,
|
||||
TwoProduct 13.335204초, Multiply 10.732785초, MultiplyPair 7.678654초다.
|
||||
LowestBitExponent에서 TwoProduct·Multiply·MultiplyPair를 거쳐 nonlinear
|
||||
EvaluateHighLow와 EvaluateSolids로 이어지는 경로가 확인된다. 여러 inline 함수가
|
||||
같은 주소의 서로 다른 attribution으로 표시되어 IsFiniteBinary64의 행들을 단순
|
||||
합산하지 않는다. 이전 source/profile의 sampled CPU와 이 부분 자료를 직접
|
||||
성능 비율로 비교하지 않는다. 공통 최하위 bit 검색의 정확한 같은 결과를 유지하면서
|
||||
비용을 줄이는 후보를 root 소유 범위의 후속 검토로 전달했다.
|
||||
|
||||
## 공통 bit-scan 통합 뒤의 개발 실행
|
||||
|
||||
Root는 같은 비영 significand의 최하위 bit 위치를 `_BitScanForward64`로 찾도록
|
||||
공통 private helper를 바꿨다. Exponent 구성과 exact dyadic-tail 거부 기준은
|
||||
유지했다. [독립 source 검토](../../.harness/performance/shared-bitscan/source-numerical-review.md)는
|
||||
header SHA `F231B9C1B0FBF963EBE1AA88D7FE4C7A291CE91C5CE4E28280AEDEB3155B7A71`의
|
||||
수치·계약 범위 PASS이며 실행 검증과 구별한다. 같은 working candidate hash에서
|
||||
root가 Debug 소비자 36개 edge를 재빌드하고 합성 68개 검사를 통과한
|
||||
[native 기록](../../.harness/performance/shared-bitscan/after-native.json)을 보존한다.
|
||||
그 뒤 root가 `3576f3f`로 commit했으며 T3는 동일 Debug 검사를 반복하지 않았다.
|
||||
|
||||
T3는 `3576f3f`를 동기화하고 기존 정상 dependency Release tree의 소비자 8개
|
||||
edge를 재컴파일했다. Configure/build/deps 모두 native 0이며 Hex8 dependencies
|
||||
15개를 확인했다. [Release 기록](../../.harness/performance/t3/bitscan-release-native.json)에
|
||||
실제 argv와 소스를 남겼다. 새 binary SHA는
|
||||
`54fa853d3f16ef63b0b056d1cdd18bb6b28e6e723ade3caa4b0b6b01b9d1d97e`다.
|
||||
|
||||
이 binary의 원본 동적 입력 개발 실행은 워밍업 없이 한 번만 수행했으며
|
||||
150.1015395초 timeout이었다. Target와 측정 wrapper native는 각각 1,
|
||||
execution_valid는 false이며 최종 HDF5가 없어 101-frame U 비교는 미실행이다.
|
||||
[실행 자료](../../.harness/performance/t3/development-dynamic-bitscan.json),
|
||||
[target 기록](../../.harness/performance/t3/development-dynamic-bitscan/run-1/native.json),
|
||||
[wrapper native](../../.harness/performance/t3/dynamic-bitscan-native.json)를 보존한다.
|
||||
원본/scratch 바이트와 source/header/binary/build/runtime DLL/thread/power identity가
|
||||
전후 같았다. AC 연결 상태 1과 전원 scheme GUID
|
||||
`8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c`를 기록했다. 종료 뒤 관련 프로세스가
|
||||
없음을 확인하고 CPU 권한을 반환했다. 이번 실행 뒤 새 profile은 수집하지 않았다.
|
||||
|
||||
이전과 이번 실행은 모두 제한 시간에 중단되었으므로 두 elapsed로 전체 실행의
|
||||
개선 비율을 계산하지 않는다. Bit-scan의 source/Debug 검증 PASS를 동적 100초
|
||||
목표의 합격으로 확대하지 않는다.
|
||||
|
||||
## Bit-scan 소스의 남은 병목
|
||||
|
||||
같은 binary로 별도 승인된 software sampling 30초를 한 번 수집했다. 새 wrapper는
|
||||
ProcessStartInfo의 stdout/stderr를 비동기로 분리하고 collector의 actual native를
|
||||
즉시 기록했다. Collector native는 4, wrapper는 1이며 이 값을 성공으로 바꾸지
|
||||
않는다. Raw result는 finalize 100%를 완료했고 기존 자료의 함수·전체 callstack·
|
||||
summary export는 각각 native 0, 별도 export wrapper도 0이었다. Target native는
|
||||
독립 포착하지 못해 unknown이다. 관측한 owned descendant PID 5개의 시작 ticks를
|
||||
보존했으며 강제 종료 없이 모두 닫혔다. 관련 프로세스도 0개였다.
|
||||
[실제 명령과 종료](../../.harness/performance/t3/vtune-dynamic-bitscan-native.json)를 보존한다.
|
||||
|
||||
[Summary](../../.harness/performance/t3/vtune-dynamic-bitscan-summary.csv)의 구간 elapsed는
|
||||
29.859555초, CPU 227.129758초, effective 185.250598초, spin 36.140758초,
|
||||
overhead 5.738402초다. 수집·finalization을 포함한 collector 경과 41.2746919초와
|
||||
구별하며 어느 값도 전체 시간 목표 판정으로 사용하지 않는다.
|
||||
[함수](../../.harness/performance/t3/vtune-dynamic-bitscan-functions.csv)와
|
||||
[전체 호출 경로](../../.harness/performance/t3/vtune-dynamic-bitscan-callstacks.csv)는
|
||||
TwoSum·Add·Multiply·MultiplyPair를 거쳐 nonlinear EvaluateHighLow로 이어지는
|
||||
병목이 남음을 보여준다.
|
||||
|
||||
| 함수 | 보고된 self CPU초 | 제한된 core 경로의 inclusive CPU초 |
|
||||
| --- | ---: | ---: |
|
||||
| LowestBitExponent | 11.061455 | 11.061455 |
|
||||
| TwoSum | 33.144893 | 33.144893 |
|
||||
| Add | 6.402455 | 33.202178 |
|
||||
| Multiply | 13.868298 | 51.911387 |
|
||||
| MultiplyPair | 9.711280 | 71.850858 |
|
||||
| AddPair | 4.231358 | 16.787786 |
|
||||
|
||||
Self는 같은 함수 이름의 export 행들을 합한 값이다. Inclusive 열은 각 blank로
|
||||
구분한 stack의 첫 양수 weight 중 다른 arithmetic helper leaf만 더한 제한된
|
||||
집계다. 같은 주소로 표시되는 inline finite/normalized/constructor attribution은
|
||||
합산에서 제외했다. 완전한 inclusive 비용이 아니며 중첩 그룹을 서로 합산하지
|
||||
않는다. [집계 근거](../../.harness/performance/t3/vtune-dynamic-bitscan-path-summary.json)에
|
||||
방법과 leaf별 자료를 남겼다.
|
||||
|
||||
LBE/TwoSum의 독립 주소와 호출 경로는 out-of-line 경계 후보를 뒷받침하지만 실제
|
||||
disassembly는 실행하지 않아 call/spill 수를 확정하지 않았다. HighLow는 16-byte
|
||||
사용자 정의 pair이며 out-of-line 기본 MSVC x64 ABI에서는 간접 인자·반환 저장소가
|
||||
필요하다. [Microsoft ABI 문서](https://learn.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-170)가
|
||||
이 구조체의 호출 경계 근거다. Root가 검토할 좁은 MSVC x64 force-inline 후보는
|
||||
식·guard·flags를 유지하며 실제 codegen과 개발 실행으로 효과를 확인해야 한다.
|
||||
|
||||
AddPair 검증 뒤의 Add와 양 low 비zero MultiplyPair 뒤의 Multiply는 normalized
|
||||
입력 guard를 반복한다. 이는 source로 확인한 중복이며 inline finite attribution을
|
||||
별도 비용으로 더해 절감량을 추정하지 않는다. Guard 제거보다 좁은 inline 후보를
|
||||
먼저 검토하도록 전달했으며 이 단계에서 production을 수정하거나 추가 실행하지 않았다.
|
||||
|
||||
[Identity 자료](../../.harness/performance/t3/vtune-dynamic-bitscan-metadata.json)의 최종
|
||||
before/after는 export 경계를 기록한다. 수집 전 준비 metadata는 export wrapper가
|
||||
덮어썼으므로 독립 보존된 전체 수집 전후 대조로 주장하지 않는다. 최종 binary와
|
||||
header/input hash는 고정된 이전 동적 실행과 같으며 이 한계를 함께 보존한다.
|
||||
|
||||
## 좁은 inline 선언 후보 뒤의 개발 실행
|
||||
|
||||
Root의 `8021dee`는 MSVC 호환 x64에서 TwoSum과 LowestBitExponent의 선언만
|
||||
force-inline으로 바꾼 후보다. T3는 이를 `cb25d744`로 병합했다. 고정 arithmetic
|
||||
header SHA는 `4F360FD4D11FCA68863E9FA7C084ED80E70FC4D903B9DF170AC946D19472987C`다.
|
||||
Root의 [source-only 독립 검토](../../.harness/performance/shared-inline/source-numerical-review.md)와
|
||||
fresh Release 205개 edge 및 같은 68개 consumer
|
||||
[검사 native 0 자료](../../.harness/performance/shared-inline/after-native.json)를 보존한다.
|
||||
T3는 같은 Debug 검사를 반복하지 않았다.
|
||||
|
||||
같은 flags·runtime·thread·power 설정으로 T3 Release 소비자 8개 edge를 재빌드했고
|
||||
configure/build/deps native 0 및 Hex8 dependencies 15개를 확인했다.
|
||||
[재빌드 native](../../.harness/performance/t3/inline-release-native.json)를 보존한다.
|
||||
새 binary SHA는 `1532666241ab623854cdc08648fc5485371881aed9b09e1896068422185032ad`다.
|
||||
|
||||
원본 동적 입력을 워밍업 없이 한 번 실행한 결과는 150.0319488초 timeout이다.
|
||||
Target와 측정 wrapper native는 1, execution_valid는 false이며 최종 HDF5가 없어
|
||||
101-frame U 비교는 미실행이다. [실행](../../.harness/performance/t3/development-dynamic-inline.json)과
|
||||
[wrapper native](../../.harness/performance/t3/dynamic-inline-native.json)를 보존한다.
|
||||
이번에는 타이머 밖의 [before identity](../../.harness/performance/t3/development-dynamic-inline-before.json)와
|
||||
[after identity](../../.harness/performance/t3/development-dynamic-inline-after.json)를
|
||||
각각 별도 파일에 저장했다. Source/input/header/exe/DLL/build/runtime/thread/power
|
||||
identity가 전후 같았고 종료 후 관련 프로세스가 없음을 확인해 CPU 권한을 반환했다.
|
||||
|
||||
새 profile이나 disassembly는 실행하지 않았다. Source의 annotation을 실제 모든
|
||||
호출이 inline되었다는 증거로 확대하지 않는다. 이 후보도 100초 목표 미달이며,
|
||||
제한 시간에 중단된 이전 후보들과의 전체 시간 개선 비율을 계산하지 않는다.
|
||||
|
||||
## Inline 후보의 실제 codegen과 후속 profile
|
||||
|
||||
별도 승인으로 같은 binary의 software sampling 30초를 한 번 수집했다. Collector
|
||||
actual native 4와 outer wrapper 1을 유지한다. 기존 raw 자료만 함수·전체 callstack·
|
||||
summary로 export했고 세 report와 export wrapper는 모두 native 0이다. 이번에는
|
||||
collection과 export 각각의 metadata/native/before/after 파일을 분리했다.
|
||||
[Collection native](../../.harness/performance/t3/vtune-dynamic-inline-collection-native.json),
|
||||
[export native](../../.harness/performance/t3/vtune-dynamic-inline-export-native.json),
|
||||
[collection metadata](../../.harness/performance/t3/vtune-dynamic-inline-collection-metadata.json)를
|
||||
보존한다. Target native는 unknown이며 관련 owned PID는 모두 종료했다.
|
||||
|
||||
Source/input/header/exe/build/DLL/thread/power는 전후 같았다. 환경을 수집한 uv의
|
||||
임시 Python Scripts PATH 첫 entry만 달랐으며 나머지 entry는 같았다. 실제 profiler가
|
||||
상속한 parent PATH를 독립 필드로 저장하지 않았으므로 전체 runtime PATH equality는
|
||||
false라는 한계를 유지한다. [Identity 검사](../../.harness/performance/t3/vtune-dynamic-inline-collection-identity-checks.json)는
|
||||
이 차이를 포함하며 개발 profile을 공식 환경 합격으로 표시하지 않는다.
|
||||
|
||||
[Summary](../../.harness/performance/t3/vtune-dynamic-inline-summary.csv)는 elapsed
|
||||
29.871824초, CPU 222.433211초, effective 173.657543초, spin 43.736681초,
|
||||
overhead 5.038986초다. [함수 자료](../../.harness/performance/t3/vtune-dynamic-inline-functions.csv)의
|
||||
Multiply 12.163382초, TwoProduct 11.910763초, MultiplyPair 9.367977초가 남는다.
|
||||
TwoSum은 여러 inline 위치로 보고되어 다른 finite attribution의 같은 주소와
|
||||
별도 비용으로 합산하지 않는다.
|
||||
|
||||
Hex8 paired TU 하나만 read-only dumpbin symbols/disasm으로 확인했으며 두 명령과
|
||||
wrapper native는 0이다. [실제 codegen 명령](../../.harness/performance/t3/inline-codegen-native.json)과
|
||||
[disassembly](../../.harness/performance/t3/inline-codegen-disasm.txt)를 보존한다.
|
||||
이 TU의 direct call TwoSum/LowestBitExponent는 0개이며 TwoProduct 내부에 BSF와
|
||||
TwoSum 식이 펼쳐진 명령을 확인했다. 독립 COMDAT symbol은 남아 있으므로 전체
|
||||
binary의 모든 호출이 inline되었다고 주장하지 않는다. 이전 TU의 동일한 해시 object를
|
||||
별도로 보존하지 않아 정확한 function-byte 크기 변화는 비교하지 않았다.
|
||||
|
||||
TwoProduct에는 실제 `call fma`가 남는다. Profile의 UCRT fma self는 0.975742초,
|
||||
import thunk는 0.044582초이며 fma를 ancestor로 가진 다른 leaf 경로는 없었다.
|
||||
단독 hardware residual dispatch는 좁지만 현재 주 병목에 대한 영향 근거가 작아
|
||||
우선 후보로 선택하지 않았다. Scalar graph나 guard를 제거하는 대안으로 쓰지 않는다.
|
||||
|
||||
libiomp worker self 37.973383초 중 spin은 32.949078초다. Callstack은
|
||||
OpenMP worker→BaseThreadInitThunk→RtlUserThreadStart만 보인다.
|
||||
[FMA·spin 경로 자료](../../.harness/performance/t3/vtune-dynamic-inline-fma-spin-paths.json)는
|
||||
이를 보존한다. Global PARDISO 뒤 dormant worker인지, paired TBB와 실제 시간상
|
||||
겹친 resource 비용인지는 이 stack만으로 확정하지 못한다. Model을 작은 equation
|
||||
system으로 가정하거나 전역 PARDISO threshold/thread 정책을 바꾸지 않았다.
|
||||
|
||||
`geo*point.weight`의 동일 결과를 diagonal 세 곳에서 재사용하는 작은 후보는 원래
|
||||
식·누적 순서를 유지할 수 있는 별도 검토 사항으로만 남겼고 구현하지 않았다.
|
||||
후속 4-column 특수 pair packet도 아직 구현·검증 전이며 이 profile의 통과 결과로
|
||||
표시하지 않는다.
|
||||
|
||||
84개 실행과 추가 두 검사 실행은 서로 다른 검사 범위다. 이를 하나의 최종 전체
|
||||
검사 실행으로 표시하지 않는다. 최종 전체 Debug/CTest, Hex8 필수 원본 5개 비교,
|
||||
동적 101-frame 비교, 최종 VTune과 공식 단일 시간 측정은 아직 이 작업의 개발
|
||||
검증으로 완료되지 않았다.
|
||||
|
||||
## 특수 pair material tangent의 4열 packet과 ISA 경계
|
||||
|
||||
Nonlinear Hex8의 material tangent 네 열을 독립 lane으로 계산하는 private packet을
|
||||
추가했다. 일반 Float64 제품과 선형 해법은 MKL을 유지하며, packet은 normalized
|
||||
high/low 특수 정밀도 예외에만 사용한다. 각 lane의 세 제품, `(first+second)+third`,
|
||||
weight 제품과 기존 누적 Add 순서는 원래와 같다. Low-zero별 기존 MultiplyPair
|
||||
분기 graph를 유지하며 mixed branch와 특수 입력은 원래 scalar graph로 연결한다.
|
||||
Lane reduction, 대칭 복제, 새 모델 실패 gate는 추가하지 않았다.
|
||||
|
||||
최초 생산 `9b8e53`와 검사 `c0e23503` 후보의 Debug·Release 관련 74개 검사는
|
||||
각각 native 0이었다. 실제 AVX2 선택과 4630 packet oracle, 16 uniform low-zero
|
||||
fixture, 4 overflow lane 위치를 확인했다. 원본 whole-response 9804행도 일치했다.
|
||||
Snapshot wrapper의 native null과 저장층 BOM/추가 newline 실패를 원본 실패 자료로
|
||||
유지하고 별도 exact-stream assertion native 0으로 연결했다.
|
||||
[과거 snapshot native](../../.harness/performance/t3/packet-snapshot-repaired-native.json),
|
||||
[과거 exact assertion](../../.harness/performance/t3/packet-snapshot-comparison-native.json)은
|
||||
새 소스의 통과로 소급하지 않는다.
|
||||
|
||||
최초 Release codegen에서 실제 ANDN과 AVX2 TU가 공통 inline math 실행 COMDAT를
|
||||
방출하는 경계 문제를 발견해 해당 후보의 동적 전체 실행을 시작하지 않았다.
|
||||
[MSVC /arch 문서](https://learn.microsoft.com/en-us/cpp/build/reference/arch-x64?view=msvc-170)는
|
||||
AVX2 설정에서 BMI 등의 비벡터 명령이 생성될 수 있음을 설명한다. 지원 gate는
|
||||
FMA·XSAVE·OSXSAVE·AVX·AVX2·OS XCR0와 BMI1/BMI2를 요구하고, 지원하지 않으면
|
||||
기존 scalar backend를 선택한다.
|
||||
|
||||
보강 후보 `446d3fa059fce8141ed30d985dc8a4fa7e26a719`는 private header를 plain
|
||||
C-array POD로 제한하고 공통 math/HighLow/std::array 정의를 AVX2 TU에서 제거했다.
|
||||
기본 ISA out-of-line noinline 연결 함수가 checked Add/MultiplyPair/TwoProduct를
|
||||
lane 0..3 순서로 호출한다. Raw high/low는 field별로 보존한다. AVX2 내부 finite·
|
||||
normalized·least-bit exponent 판정은 원래 body와 guard 순서를 유지한다.
|
||||
POD는 trivial carrier이며 public API·공통 math·CMake·FP flags는 이 보강에서 불변이다.
|
||||
[고정 manifest](../../.harness/performance/t3/packet-boundary-446d3fa/manifest.json)와
|
||||
[독립 source 검토](../../.harness/performance/t3/source-numerical-review-packet-boundary.md)를 보존한다.
|
||||
Source-only PASS는 native 실행이나 ISA 검증을 대체하지 않는다.
|
||||
|
||||
Corrected-prefix Debug·Release build는 각각 8개 edge와 native 0이었다.
|
||||
실제 discovery의 관련 76개 검사는 Debug 10.18초, Release 4.24초로 각각 전부
|
||||
native 0이었다. 새 synthetic capability·frozen scalar bridge raw-bit 검사와 기존
|
||||
Hex8·paired·HighLowArithmetic 검사를 포함한다. 두 binary 모두 실제 AVX2 evaluator를
|
||||
선택했고 packet oracle 4630개·uniform fixture 16개·overflow 위치 4개를 확인했다.
|
||||
[Debug native](../../.harness/performance/t3/packet-boundary-debug-native.json),
|
||||
[Release native](../../.harness/performance/t3/packet-boundary-release-native.json),
|
||||
[Debug backend](../../.harness/performance/t3/packet-boundary-debug-backend.json),
|
||||
[Release backend](../../.harness/performance/t3/packet-boundary-release-backend.json)을 보존한다.
|
||||
이는 내부 helper telemetry가 아니라 실제 backend 선택과 source/codegen에 연결한
|
||||
구체 fixture 검사 범위다.
|
||||
|
||||
두 구성의 전체 symbols/disassembly 명령은 모두 native 0이었다. AVX2 객체의
|
||||
정의된 external 실행 심볼은 전용 EvaluateMaterialPacketAvx2 하나이며 공통 math·
|
||||
HighLow 생성자·std::array 실행 정의는 없었다. Scalar bridge는 UNDEF 외부 참조이며
|
||||
상수 data와 CRT 외부 참조를 실행 정의와 구분했다. Baseline dispatch의 AVX/YMM/ANDN
|
||||
명령은 0개이고 kernel fused instruction은 명시 Product residual VFMSUB 하나다.
|
||||
일반 mul/add contraction은 확인되지 않았다.
|
||||
[경계 assertion](../../.harness/performance/t3/packet-boundary-codegen-assertion.json)은 전체
|
||||
symbol 목록과 disassembly를 연결한다. 기존 precise와 compiler flags는 유지했다.
|
||||
|
||||
새 Debug LIB와 정합한 현재 header로 candidate snapshot을 compile/run한 native는
|
||||
각각 0이다. 성공 native 0과 original header/LIB/probe identity가 연결된 기존 old
|
||||
oracle를 재사용했으며 old 실행은 반복하지 않았다. ProcessStartInfo stdout을 처음부터
|
||||
BOM이나 추가 newline 없이 저장했다. 새 candidate와 원본의 raw response 9804행은
|
||||
바이트 단위로 같고 SHA는 둘 다 `DED8D2C380D15E297A73BDD018B1B840C1ADC0D8372934D9FC2EF2B628A36F63`이다.
|
||||
비교 assertion wrapper native 0을 [새 snapshot native](../../.harness/performance/t3/packet-boundary-snapshot-native.json)와
|
||||
[새 비교](../../.harness/performance/t3/packet-boundary-snapshot-comparison.json)에 연결했다.
|
||||
|
||||
같은 고정 Release binary로 원본 동적 입력을 워밍업 없이 한 번 실행했다.
|
||||
150.0500624초에 제한 시간으로 중단됐고 target/측정 wrapper native는 1이다.
|
||||
Execution_valid는 false이고 최종 HDF5가 없어 101-frame U 비교는 미실행이다.
|
||||
100초 목표는 미달이다. [개발 실행](../../.harness/performance/t3/development-dynamic-packet-boundary.json),
|
||||
[wrapper native](../../.harness/performance/t3/dynamic-packet-boundary-native.json),
|
||||
[before identity](../../.harness/performance/t3/development-dynamic-packet-boundary-before.json),
|
||||
[after identity](../../.harness/performance/t3/development-dynamic-packet-boundary-after.json)를 보존한다.
|
||||
Source/input/header/exe/DLL/build/runtime/thread/power identity가 전후 같았으며 원본과
|
||||
scratch SHA도 같았다. 종료 후 관련 프로세스 0개를 확인하고 CPU 권한을 반환했다.
|
||||
추가 profile/micro 또는 전체 시간 실행은 하지 않았다. 제한 시간에 중단된 후보끼리의
|
||||
개선 비율을 계산하지 않는다. 최종 전체 검사·필수 원본 비교·공식 시간 목표는 미완료다.
|
||||
|
||||
## Packet 후보의 잔여 비용과 출력 단계 해석의 한계
|
||||
|
||||
150초 timeout의 마지막 accepted increment는 100/time10/iteration2였다. 그러나
|
||||
`prepared_analysis.cpp`는 ExecuteInto를 마친 뒤 모든 IterationRecords를 log.Write한다.
|
||||
따라서 이 행은 실시간 진행 timestamp가 아니다. Log는 실행 시작 21:20:21에 생성되어
|
||||
21:22:50에 마지막 작성됐고, 14,911,565-byte candidate tmp는 21:22:51에 생성됐다.
|
||||
Cutoff에 출력 작성이 진행 중인 사실은 확인하지만, 출력이 전체 시간을 지배한다는
|
||||
추론은 하지 않는다. 최종 파일 완성과 전체 elapsed는 여전히 미확인이다.
|
||||
|
||||
Writer BuildSolidPlan은 저장된 accepted frame을 CommitAcceptedFrame으로 재검증한다.
|
||||
Pair/identity/physical force/energy gates를 반복하지만 full nonlinear Hex8 response를
|
||||
프레임마다 다시 계산하지 않는다. 기준 inventory의 factory.Create+EvaluateLinear(zero)는
|
||||
ModelPlan과 validator.Create에서 요소마다 각각 실행된다. 이는 소스상 중복 finding이며
|
||||
실측 비용 근거 없이 최우선 후보로 선택하거나 검사를 생략하지 않는다.
|
||||
|
||||
같은 생산 `446d3fa`와 binary로 SW30 수집을 한 번 추가했다. Collector actual native4,
|
||||
outer wrapper1, target native unknown을 유지한다. 기존 raw에서 함수·전체 callstacks·
|
||||
summary를 export한 세 native와 export wrapper는 모두0이다.
|
||||
[Collection native](../../.harness/performance/t3/vtune-dynamic-packet-boundary-collection-native.json),
|
||||
[export native](../../.harness/performance/t3/vtune-dynamic-packet-boundary-export-native.json)를 보존한다.
|
||||
수집과 export의 metadata를 분리하고 실제 parent PATH를 별도로 저장했다. Source/input/
|
||||
exe/arithmetic/packet header·kernel·dispatch/parent PATH/thread/runtime DLL/power는
|
||||
각각 전후 같았다. 환경 수집용 uv subprocess PATH와 actual parent PATH는 구분한다.
|
||||
Target owned PID는 모두 정리했고 CPU 권한을 반환했다.
|
||||
|
||||
[Summary](../../.harness/performance/t3/vtune-dynamic-packet-boundary-summary.csv)의 elapsed는
|
||||
29.771803초, CPU219.787666초, effective152.367546초, spin59.900463초다.
|
||||
[함수 자료](../../.harness/performance/t3/vtune-dynamic-packet-boundary-functions.csv)는 packet Add
|
||||
self9.638549, Product9.444756, Multiply3.902459 CPU 초와 scalar MultiplyPair6.631925,
|
||||
TwoProduct5.432377 CPU 초를 보고한다. 전체 leaf별 callpath weight 합을 flat total과
|
||||
대조한 packet inclusive는61.265380 CPU 초, EvaluateHighLow inclusive는133.386968 CPU
|
||||
초다. Scalar bridge inclusive는 Add0.103136, Multiply0.039823, TwoProduct0.061110 CPU
|
||||
초여서 fallback 지배 근거는 작다. [경로 자료](../../.harness/performance/t3/vtune-dynamic-packet-boundary-selected-paths.json)는
|
||||
node를 path마다 한 번 포함하며, 중첩된 inclusive 그룹이나 inline attribution을 별도 비용으로
|
||||
합산하지 않는다. 이 초기30초 표본은 후처리·출력 비용을 판정하지 못한다. Iomp spin의
|
||||
PARDISO 기원이나 TBB 시간 중첩은 여전히 unknown이므로 전역 thread 정책을 바꾸지 않았다.
|
||||
|
||||
다음 후보는 packet Add/Multiply의 POD 왕복과 scalar normalized/zero/low-shape 검사를
|
||||
동일 vector masks로 계산하는 최소 범위다. [증명 계획](../../.harness/performance/t3/packet-vector-guard-proposal.md)은
|
||||
finite bit gate-beforeFP, left-invalid의 right predicate short-circuit neutralization,
|
||||
canonical zero/RN64/overflow/sticky union/fallback/기존 FENV/ISA·COMDAT 경계를 명시한다.
|
||||
이는 아직 구현·검증 전이며 산술 graph나 모델 gate를 생략하는 변경이 아니다.
|
||||
추가 whole-model 실행이나 180초 수집은 수행하지 않았다.
|
||||
|
||||
## Vector guard와 exact tail screen의 합성 후보
|
||||
|
||||
계획의 조건부 독립 검토 이후 `0b5adf43e0ccbbb8780277f568815377a67f5028`에
|
||||
private AVX2 cpp와 기존 Hex8 tests 두 파일만 변경했다. Normalized vector guard는
|
||||
active·finite mask 이후 RN sum의 두 operand와 equality RHS를 모두 중립화한다.
|
||||
Right active는 left normalized mask이며 left finite만으로 결정하지 않는다.
|
||||
Canonical both-zero와 signed low-zero 분기를 유지하고 mixed/invalid packet은 기존
|
||||
baseline bridge로 연결한다. 각 lane 산술 graph와 모델 실패 gate는 그대로다.
|
||||
|
||||
Tail screen은 finite/nonzero 이후 원래 exact LBE 위치에서 adjusted encoded exponent
|
||||
합>=1076일 때만 scan 두 개를 생략한다. False이면 원래 exact LBE와−1074 비교를
|
||||
실행한다. 충분조건을 필요조건으로 사용하지 않고 rounded product finite→명시 residual
|
||||
FMA→error finite→TwoSum 순서를 유지한다. Public header·bridge·공통 math·CMake·FP
|
||||
flags·일반 MKL은 불변이다. [고정 manifest](../../.harness/performance/t3/packet-guard-screen-0b5adf4/manifest.json)와
|
||||
[독립 actual source 검토](../../.harness/performance/t3/source-numerical-review-packet-guard-screen.md)를 보존한다.
|
||||
|
||||
Corrected-prefix Debug·Release configure/build는 각각 native0과 6개 edge였다.
|
||||
실제 discovery의 관련 78개 검사는 Debug10.24초·Release4.31초로 각각 native0이다.
|
||||
두 구성 모두 실제 AVX2 선택, 기존 packet4630/uniform16/overflow4를 확인했다.
|
||||
새 guard132/tail64 fixture는 left-invalid/right-overflow·sNaN·signedzero·mixed prefix·
|
||||
subnormal·tail threshold1076/1075·conservative false·rounded overflow를 다룬다.
|
||||
각 fixture에서 unchanged baseline과 selected evaluator를 별도 동일 초기 상태로 실행해
|
||||
raw high/low·FE_ALL_EXCEPT·MXCSR status6bits를 비교했다. Prior inexact/denormal
|
||||
상태를 포함하고 test 후 x87/MXCSR를 복원했다. Frozen original은 별도 raw-bit oracle다.
|
||||
[Debug native](../../.harness/performance/t3/packet-guard-screen-debug-native.json),
|
||||
[Release native](../../.harness/performance/t3/packet-guard-screen-release-native.json),
|
||||
[Debug backend](../../.harness/performance/t3/packet-guard-screen-debug-backend.json),
|
||||
[Release backend](../../.harness/performance/t3/packet-guard-screen-release-backend.json)을 보존한다.
|
||||
|
||||
각 구성의 두 TU symbols/disassembly 네 명령과 wrapper는 native0이다. AVX2 객체의
|
||||
정의된 external 실행 심볼은 전용 evaluator 하나이고, 공통 math/HighLow/std::array
|
||||
실행 정의는 없다. Baseline dispatch의 AVX/YMM/ANDN은0이며 kernel fused instruction은
|
||||
명시 residual VFMSUB 하나다. Release Product의 네 `cmp rax,434h` 다음 unsigned JAE가
|
||||
각각 BSF 두 개를 넘어 같은 join으로 가며 false는 원래 BSF 두 개를 수행한다.
|
||||
[실제 codegen assertion](../../.harness/performance/t3/packet-guard-screen-codegen-assertion.json)은
|
||||
각 branch와 전체 symbol/disassembly를 연결하고 실행 assertion native0을 보존한다.
|
||||
|
||||
새 정합 Debug LIB/header snapshot의 compile/run/비교 wrapper는 native0이다.
|
||||
기존 actual-native0 old oracle는 identity를 확인하고 재사용했으며 old 실행은 반복하지
|
||||
않았다. 새 응답9804행과 원본은 exact bytes와 SHA `DED8D2C380D15E297A73BDD018B1B840C1ADC0D8372934D9FC2EF2B628A36F63`가 같다.
|
||||
[Snapshot native](../../.harness/performance/t3/packet-guard-screen-snapshot-native.json),
|
||||
[exact 비교](../../.harness/performance/t3/packet-guard-screen-snapshot-comparison.json)를 보존한다.
|
||||
[종료 identity](../../.harness/performance/t3/packet-guard-screen-delivery-identity.json)는 검토의
|
||||
8개 source SHA 전후 일치와 두 구성의 exe/LIB/build SHA를 연결한다. 관련 actor0을
|
||||
확인하고 CPU 권한을 반환했다. 이번 슬롯에서 whole-model/profile는0회다.
|
||||
이 검사 통과는 실제 성능 개선이나 100초 목표 달성 증거가 아니며, 이전446의 timeout과
|
||||
미실행101-frame·최종 전체/공식 검증 한계를 그대로 유지한다.
|
||||
|
||||
## 합성 후보의 단일 동적 완주와 101-frame 비교
|
||||
|
||||
검증된 `0b5adf4` 생산과 문서 `33e6aa0`를 고정하고, 같은 Release binary로 원본
|
||||
hexa_dynnonlinear를 워밍업 없이 한 번 실행했다. 전체 프로세스 elapsed는135.9302297초,
|
||||
actual native0, execution_state completed, execution_valid true이며 최종 HDF5와
|
||||
result validation이 통과했다. 개발 실행일 뿐 최종 공식 시간 검증은 아니다.
|
||||
100초 목표는35.9302297초 초과해 아직 미달이다.
|
||||
[개발 실행](../../.harness/performance/t3/development-dynamic-guard-screen.json)과
|
||||
[측정 wrapper native](../../.harness/performance/t3/dynamic-guard-screen-native.json)를 보존한다.
|
||||
|
||||
Source/input/header/exe/DLL/build/runtime/thread/power identity는 타이머 밖에서 각각
|
||||
전후 기록했고 같았다. FESA를 실행한 Python의 실제 PATH와 측정 wrapper의 실제
|
||||
parent PATH도 각각 전후 같았다. Uv helper의 임시 Scripts PATH를 actual parent의
|
||||
전체 PATH equality와 혼동하지 않는다.
|
||||
[Before identity](../../.harness/performance/t3/development-dynamic-guard-screen-before.json),
|
||||
[after identity](../../.harness/performance/t3/development-dynamic-guard-screen-after.json),
|
||||
[wrapper before](../../.harness/performance/t3/dynamic-guard-screen-parent-before.json),
|
||||
[wrapper after](../../.harness/performance/t3/dynamic-guard-screen-parent-after.json)를 보존한다.
|
||||
원본과 scratch input SHA1685f86f…ff9는 같고 Release exe SHA는
|
||||
`adcc89f910ce530898a23d911d69c77aa4d87bb1c884b35a0e95a3b80d351ea1`이다.
|
||||
|
||||
최종 HDF5가 완성된 뒤 타이머 밖에서 approved comparator를 한 번 실행했다.
|
||||
Actual comparator native0이며 increment0..100의 모든101 U frame이 blocking PASS다.
|
||||
각 frame1326행의 identity/time mapping을 비교했고 최대 절대오차는7.77901169066e-9,
|
||||
최대 relative RMS는2.15558603912e-6이다. 승인된 near-zero/relative/RMS 기준을 바꾸지
|
||||
않았다. [전체 비교](../../.harness/performance/t3/development-dynamic-guard-screen/run-1/comparison.json),
|
||||
[비교 native](../../.harness/performance/t3/dynamic-guard-screen-comparison-native.json),
|
||||
[101-frame 요약](../../.harness/performance/t3/dynamic-guard-screen-comparison-summary.json)을 보존한다.
|
||||
|
||||
종료 후 관련 actor0을 확인하고 CPU 권한을 반환했다. 이번 슬롯에는 추가 profile나
|
||||
반복 whole-model 실행이 없었다. 이전446의 timeout/미실행 비교를 이 완주로 소급해
|
||||
수정하지 않는다. 이 결과는 root의 최신 T4 통합 검사나 최종 전체 Debug·필수 원본
|
||||
비교·공식 단일 시간 gate를 대체하지 않는다. 목표 미달의 남은 비용은 실제 profile과
|
||||
보존되는 수식·진단 경계를 근거로 다음 후보에서 줄여야 한다.
|
||||
|
||||
## 합성 후보 이후의 추가 표본과 다음 범위
|
||||
|
||||
검증된0b5/문서678의 같은 binary로 SW30 수집을 한 번 수행했다. Collector actual
|
||||
native4/outer1, target native unknown이며 세 export와 export wrapper는 native0이다.
|
||||
수집과 export의 metadata/native를 분리하고 actual parent PATH를 각 전후 저장했다.
|
||||
Source/input/exe/arithmetic/packet3files/parent PATH/thread/runtime DLL/power가 각각
|
||||
전후 같았다. 관련 owned PID와 actor0을 확인한 뒤 CPU 권한을 반환했다.
|
||||
[수집 native](../../.harness/performance/t3/vtune-dynamic-guard-screen-collection-native.json),
|
||||
[export native](../../.harness/performance/t3/vtune-dynamic-guard-screen-export-native.json),
|
||||
[수집 identity](../../.harness/performance/t3/vtune-dynamic-guard-screen-collection-identity-checks.json),
|
||||
[export identity](../../.harness/performance/t3/vtune-dynamic-guard-screen-export-identity-checks.json)를 보존한다.
|
||||
|
||||
[Summary](../../.harness/performance/t3/vtune-dynamic-guard-screen-summary.csv)는 elapsed29.859103초,
|
||||
CPU220.306573초, effective136.119435초, spin72.884832초다. Packet Add self3.599027,
|
||||
Product5.306884, Multiply3.124338 CPU 초와 scalar MultiplyPair6.644332·TwoProduct5.757428
|
||||
CPU 초가 남는다. [함수](../../.harness/performance/t3/vtune-dynamic-guard-screen-functions.csv)와
|
||||
[선택 경로](../../.harness/performance/t3/vtune-dynamic-guard-screen-selected-paths.json)는 모든
|
||||
leaf의 positive callpath 합을 flat total과 대조했다. Inclusive packet37.421782,
|
||||
EvaluateHighLow115.756670, EvaluateSolids116.935189, RecoverEndpoint3.011111,
|
||||
SetRates0.296302, EffectiveTangent1.563077 CPU 초다. 중첩된 그룹이나 inline attribution을
|
||||
별도 합산하지 않는다. 이 표본은 기초 운동학·복구·조립보다 local paired 계산의 비용을
|
||||
줄일 근거를 준다. Writer0은 초기 구간의 미표본이며 후처리 비용이0이라는 의미가 아니다.
|
||||
|
||||
Scalar MultiplyPair inclusive46.239080 중 가까운 비math caller가 직접 EvaluateHighLow인
|
||||
경로는39.247775, Dot 경로는6.683994 CPU 초다. 이 자료만으로 직접 EvaluateHighLow의
|
||||
force/FG/constitutive 준비/geometric source-line 비용을 분리하지 못한다. Iomp spin의
|
||||
기원이나 TBB 시간 중첩도 unknown이므로 전역 환경·thread 정책은 바꾸지 않았다.
|
||||
|
||||
[후속 계획](../../.harness/performance/t3/packet-geometric-contraction-proposal.md)은 gradient
|
||||
Dot3-term과 geometric9-term의 독립 b4 lane을 기존 zero-start·component/j,l 순서와
|
||||
검증된 Multiply/Add helpers로 계산하는 범위다. `geo*weight`의 동일 제품을 한 번 계산해
|
||||
각 기존 diagonal accumulator Add에 쓰는 작은 대안도 명시했다. High/low 정밀도는
|
||||
유지하며 일반 Float64 MKL 경로를 바꾸지 않는다. 이는 아직 구현·검증 전인 제안이고
|
||||
현재 source를 변경하지 않았다. Whole-model 추가 반복이나 profile 추가 수집은 없다.
|
||||
|
||||
## 기하 수축 packet 구현과 Release 상태 차이 수정
|
||||
|
||||
위 제안을 `9677265`에서 구현했다. 독립 b4 lane은 기존 `dots[b]` 및 material의
|
||||
`col=3*b+k`와 연결하며, gradient-stress의 원래 준비 제품과 Dot의 component 순서,
|
||||
geometric의 j,l 순서 및 zero-start를 보존한다. 동일 `geo*weight`는 공유하지만 세
|
||||
diagonal accumulator의 Add는 각각 수행한다. Unsupported 환경과 linear 응답은
|
||||
원래 scalar loop를 사용한다. Private POD·baseline bridge·AVX2 경계를 유지하고
|
||||
일반 Float64 MKL, CMake, 공통 math 및 public ABI를 바꾸지 않았다.
|
||||
|
||||
이 후보의 Debug 관련 81개 검사는 통과했으나 Release는 80/81 통과였다.
|
||||
Ordered overflow fixture에서 raw bit는 같고 selected FE21/baseline5 및 MXCSR41/40,
|
||||
prior 상태에서는43/42로 INVALID 차이가 있었다. 당시 wrapper가 stderr를 먼저
|
||||
예외 처리하여 CTest native는 unknown, wrapper native는1이었다. 이 실패를 현재
|
||||
통과로 소급하지 않는다. [실패 XML](../../.harness/performance/t3/packet-geometric-release-gtest/fesa_unit_tests_53.xml),
|
||||
[실패 binary 보존](../../.harness/performance/t3/packet-geometric-9677265/failure-release/manifest.json)을 유지한다.
|
||||
후속 Release codegen·snapshot·전체 모델·profile은 당시 수행하지 않았다.
|
||||
|
||||
최소 수정 `0c29a9f`는 private AVX2 cpp와 기존 Hex8 검사 두 파일에 한정한다.
|
||||
Vector TwoSum의 첫 sum이 nonfinite이면 error 계산 전에 false를 반환한다. 각 Add의
|
||||
head/tail/middle/joined/final 위치와 Product의 마지막 TwoSum 실패는 원래 입력과
|
||||
mode로 기존 noinline scalar bridge를 호출한다. Partial 결과를 재사용하지 않으며
|
||||
조건부 Debug 분기, flags clear, 기대값 완화, 산술식 및 진단 gate 변경은 없다.
|
||||
[고정 manifest](../../.harness/performance/t3/packet-geometric-fix-0c29a9f/manifest.json)와
|
||||
[독립 source 검토](../../.harness/performance/t3/source-numerical-review-packet-geometric-fix.md)는
|
||||
10개 hash의 전후 일치와 source-only PASS를 기록한다.
|
||||
|
||||
새 검사는 normalized near-max joined overflow, N=2^-1022와 d=2^-1074에 의한
|
||||
subnormal error, 다른 lane의 성공 prefix 이후 overflow, 각 lane 위치 및 prior 상태를
|
||||
포함한다. 원래 세 weight 제품과 서로 다른 세 accumulator의 raw bit·FE_ALL_EXCEPT·
|
||||
MXCSR status를 기준으로 삼았다. 첫 narrow 실행은 Debug·Release 각각2/2,
|
||||
actual AVX2의 기존 실패6개와 새 prefix34개가 통과했다. 이후 실제 discovery는
|
||||
82개였고 Debug 82/82(10.43초), Release 82/82(4.46초), 모든 단계 native0이었다.
|
||||
[Debug 명령/native](../../.harness/performance/t3/packet-geometric-fix-full-debug-native.json),
|
||||
[Release 명령/native](../../.harness/performance/t3/packet-geometric-fix-full-release-native.json),
|
||||
[Release XML](../../.harness/performance/t3/packet-geometric-fix-full-release-gtest/)을 보존한다.
|
||||
Configure/build는 corrected MSVC dependency prefix, 병렬4 이하로 순차 수행했다.
|
||||
|
||||
두 구성의 전체 객체 symbol/disassembly는 AVX2 외부 실행 정의2개, 공통 math 정의0개,
|
||||
baseline AVX·YMM·ANDN0개를 확인했다. Kernel의 fused 명령은 명시 residual VFMSUB
|
||||
1개뿐이고 Product의 충분조건 true 분기4개는 각각 두 BSF를 건너뛰며 false는 원래
|
||||
두 BSF를 유지한다. [코드 생성 assertion](../../.harness/performance/t3/packet-geometric-fix-codegen-assertion.json)을 보존한다.
|
||||
실제 Release dispatch 객체의 scalar Add는 first-sum0x16e 이후 finite 분기0x18a에서
|
||||
error 계산0x18f를 건너뛴다. TwoSum도0x25에서0xb1로 같은 순서의 return을 한다.
|
||||
Linked unit exe에서 해당 Add byte signature가 한 곳에 존재함을 확인했다.
|
||||
[Hoist 근거](../../.harness/performance/t3/packet-geometric-fix-release-scalar-hoist.json)는
|
||||
PDB를 통한 개별 callsite나 COMDAT winner 식별까지 주장하지 않는다. 실제 bridge의
|
||||
raw/status 동등성은 위 Debug·Release oracle로 별도 확인했다.
|
||||
|
||||
기존 actual native0 원본 oracle의 정합 header/LIB/입력 연결을 검증한 뒤 새 candidate만
|
||||
compile/run했다. 두 native와 엄격한 비교 wrapper는0이며9,804행과 전체 byte가 동일하다.
|
||||
양쪽 SHA는 `DED8D2C380D15E297A73BDD018B1B840C1ADC0D8372934D9FC2EF2B628A36F63`이다.
|
||||
[Snapshot 명령/native](../../.harness/performance/t3/packet-geometric-fix-snapshot-native.json),
|
||||
[엄격한 비교](../../.harness/performance/t3/packet-geometric-fix-snapshot-comparison.json)를 보존한다.
|
||||
[종료 확인](../../.harness/performance/t3/packet-geometric-fix-full-cleanup.json)은 source/hash
|
||||
불변, tracked clean 및 관련 actor0을 기록한다. CPU를 반환했고 이번 슬롯에서 전체 모델과
|
||||
profile은 실행하지 않았다. 이 후보의 전체 경과 시간 및 최종101-frame 비교는 미실행이며,
|
||||
기존135.9302297초 개발 결과와 목표100초 미달, 최종 전체·공식 검증 미완료는 유지한다.
|
||||
|
||||
## 기하 packet 후보의 단일 동적 개발 실행
|
||||
|
||||
생산 `0c29a9f`, 문서 HEAD `f81a0b6` 및 검증된 Release exe를 고정해 원본 동적 모델을
|
||||
워밍업 없이 한 번 실행했다. 실제 FESA native0, completed, elapsed117.7986225초,
|
||||
execution_valid true 및 result_validation_state passed였다. 최종 HDF5가 정상 완성됐고
|
||||
원본과 scratch의 SHA1685f86f…ff9는 전후 같았다. Source/header/exe/DLL/build/runtime/
|
||||
thread/power 및 실제 FESA parent PATH identity도 전후 같았다. 이 개발 결과는
|
||||
100초 목표를17.7986225초 초과하며 최종 공식 시간 검증은 아니다.
|
||||
[실제 실행 native](../../.harness/performance/t3/development-dynamic-geometric-fix/run-1/native.json),
|
||||
[개발 결과와 전후 identity](../../.harness/performance/t3/development-dynamic-geometric-fix.json)를 보존한다.
|
||||
|
||||
측정 wrapper는 owned child가 종료되는 경합에서 null StartTime을 읽어 native1로
|
||||
중단됐다. 이미 실행 중인 동일 FESA의 정확한 argv·PID·CIM CreationDate를 확인해
|
||||
원래150초 제한 안에서 종료를 관찰했다. Solver나 측정은 다시 실행하지 않았다.
|
||||
FESA는 기존 Python run_once에 actual native0를 기록했고 사후 target handle 관찰도0이었다.
|
||||
Outer wrapper1과 uv native unknown은 그대로 유지한다. Wrapper parent PATH의 사후
|
||||
기록은 예외로 누락됐으며, 이를 Python의 실제 FESA parent PATH 전후 일치로 대체하지 않는다.
|
||||
[Wrapper 실패](../../.harness/performance/t3/dynamic-geometric-fix-wrapper-failure.json),
|
||||
[기존 target 관찰](../../.harness/performance/t3/dynamic-geometric-fix-target-observation.json)을 보존한다.
|
||||
|
||||
완성된 결과만 별도 comparator로 비교했다. 비교 wrapper에 종료된 자식의 null
|
||||
StartTime을 건너뛰는 최소 보강을 적용하고 변경 전 script/hash와 실패 원본 wrapper를
|
||||
보존했다. Comparator 실제 native0, wrapper0 및 increment0..100의 모든101 U frame이
|
||||
blocking PASS였다. Schema·source identity·approved mapping·physical-value precheck를
|
||||
통과했고 최대 절대오차7.77901169066e-9, 최대 relative RMS2.15558603912e-6이었다.
|
||||
[전체 비교](../../.harness/performance/t3/development-dynamic-geometric-fix/run-1/comparison.json),
|
||||
[비교 native](../../.harness/performance/t3/dynamic-geometric-fix-comparison-native.json),
|
||||
[101-frame 요약](../../.harness/performance/t3/dynamic-geometric-fix-comparison-summary.json),
|
||||
[Wrapper 보강 이력](../../.harness/performance/t3/dynamic-geometric-fix-comparison-wrapper-fix.json)을 보존한다.
|
||||
|
||||
[종료 자료](../../.harness/performance/t3/dynamic-geometric-fix-cleanup-delivery.json)는 관련
|
||||
actor0, source와 binary 불변 및 각각의 native 범위를 기록한다. CPU를 반환했다.
|
||||
이번 슬롯에는 추가 build·profile·반복 측정이 없었다. 이전 source의135.9302297초와
|
||||
이번 source의117.7986225초는 각 단일 개발 실행이며 차이를 특정 호출의 독립 비용이나
|
||||
반복 통계로 해석하지 않는다. 목표100초와 최종 전체·공식 검증은 아직 미완료다.
|
||||
@@ -1,375 +0,0 @@
|
||||
# MKL 적용 범위와 수명 근거
|
||||
|
||||
FEM-REQ-PERF-004/005/007/009의 T2 구현 기록이다. 공통 요구사항·물리·수치
|
||||
기준과 reference는 변경하지 않았다. T3/T4 인계 목록은 해당 owner가 완료한
|
||||
실제 diff와 검사를 통합한 뒤 갱신한다. 이 기록만으로 전체 production 적용이나
|
||||
세 모델의 공식 시간 목표 통과를 주장하지 않는다.
|
||||
|
||||
## 공통 연산 경계
|
||||
|
||||
| 위치 | 연산 / 실제 private 호출 | 유지하는 의미 |
|
||||
| --- | --- | --- |
|
||||
| `math/matrix.cpp::Multiply` | dense gemv/gemm, `cblas_dgemv/dgemm` | 기존 shape/empty/checked MKL_INT 및 새 actual operand finite preflight |
|
||||
| `math/vector.cpp` | Dot/Scale/Axpy와 copy, dense BLAS | 기존 공개 값·실패 의미 유지 |
|
||||
| `math/dense_blas_internal.cpp::MultiplyTransposeLeft` | transpose storage copy 뒤 `Matrix::Multiply`; diagonal DSBMV(k0); LAPACK dpotrf/dtrtri | transpose-left shape 확인; ordinary product는 MKL |
|
||||
| `math/sparse_matrix.cpp::Multiply` | `mkl_sparse_d_create_csr` → `mkl_sparse_d_mv` → destroy | canonical CSR와 structural zeros, general full matrix, zero-based index |
|
||||
| `solvers/linear/mkl_pardiso_solver.cpp` | PARDISO SPD factorization/solve | 기존 경로와 scoped n=1 policy |
|
||||
| `solvers/linear/mkl_pardiso_tangent_solver.cpp` | fresh phase 11/22, solve 33 | 새 분해 전 release; 실패 뒤 stale 사용 금지; 동일 성공 분해의 여러 RHS 허용 |
|
||||
| `results/global_equilibrium_recovery.cpp` | full K*d, free/constrained masked RHS의 각 K*d | Kff*df/Kfc*dc scale를 별도로 유지; 원래 free rows만 norm 판정 |
|
||||
| `analysis/linear_frequency_procedure.cpp` / `solid_frequency_procedure.cpp` | original/whitened pencil sparse action, dense Dot | original-pencil finite/independent residual/energy/Gram 검사 유지 |
|
||||
| `solvers/eigen/mkl_feast_eigen_solver.cpp` | independent scaled full/mass/mirrored sparse actions; QR ddot/daxpy | FEAST actual 호출·count/solve budget·seed/Householder 절차 유지; backend residual로 독립 residual 대체하지 않음 |
|
||||
| `analysis/eigen_reduction.cpp` | nodal/block congruence, mode restoration, nodal mass action | nodal analytic null split과 scaled original pencil 유지 |
|
||||
| `analysis/thermal_transient_algebra.cpp` | BE RHS entry의 compact diagonal DSBMV, reduced/full/dissipation CSR actions | raw old constrained state·signed temperature·actual delta·independent interval companion 보존 |
|
||||
| `elements/euler_beam_3d.cpp` | B*d, BᵀDB, TᵀKT, interpolationᵀq | 2 Gauss points·closed stiffness invariant·local force/section identity 유지 |
|
||||
|
||||
### Sparse 단발 자원
|
||||
|
||||
입력 의존성은 현재 matrix의 전체 CSR shape/index/value와 현재 RHS이다.
|
||||
`Validate()`가 canonical CSR와 finite coefficient를 확인한 뒤 actual `MKL_INT`
|
||||
폭에 맞춰 rows/columns/nnz/각 index를 checked 변환한다. 공개 `size_t` storage는
|
||||
변경하지 않고 기존 private `ToMklSize`를 재사용한다. 이 설치의 ILP64를 public
|
||||
API에 하드코딩하지 않는다.
|
||||
|
||||
호출 stack이 변환 index 배열·복사 values와 handle을 소유한다. handle은 배열 뒤에
|
||||
생성되며 RAII destroy가 배열 소멸보다 먼저 실행된다. MKL이 CSR 배열을 참조한다는
|
||||
[Intel create CSR 계약](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/mkl-sparse-create-csr.html)을 따른다.
|
||||
직접 private values 복사는 const-cast 없이 const 동시 호출을 분리한다.
|
||||
호출 종료가 invalidation이며 지속 handle/cache가 없다. 저장량은 단발
|
||||
`(rows+1+nnz)*sizeof(MKL_INT)+nnz*sizeof(double)` 및 output이다.
|
||||
측정 근거 없는 symbolic/persistent cache는 채택하지 않았다. 아래 n=1 PARDISO의 제한된 TLS 정책만 실제 baseline/보조 근거로 채택했다.
|
||||
|
||||
0 rows/0 columns/no entries는 검증과 index range 확인 뒤 zero vector를 반환한다.
|
||||
nonempty matrix의 구조상 빈 row는 MKL 결과의 zero row다. Copy/move/assignment는
|
||||
공개 CSR 값 storage 수명만 갖고 backend pointer를 보관하지 않는다. Moved-from
|
||||
불완전 CSR은 사용 전에 validation에서 거부되므로 indexing UB로 진행하지 않는다.
|
||||
|
||||
backend failure는 scalar fallback이나 성공 candidate 없이 `runtime_error`로,
|
||||
integer overflow는 `length_error`로 전달한다. vendor enum/원시 오류 번호는 공개하지
|
||||
않는다. `GlobalEquilibriumRecovery`와 frequency/eigen/thermal consumer는 해당
|
||||
새 실패를 `Status/Result`로 변환하며 이전 state/history/final 결과를 commit하지 않는다.
|
||||
실제 allocation/backend fault를 강제한 native 시험은 실행하지 않았다. 해당
|
||||
실패 branch의 fallback 부재·exception 변환·RAII 해제는 정적 검토 범위이며,
|
||||
일반 실패/반복·copy/move·동시 const 호출과 bad RHS 복구는 실제 검사 범위다.
|
||||
|
||||
### Finite의 owner
|
||||
|
||||
CSR coefficient와 모든 RHS는 MKL 호출 전 math에서 finite 검증한다. 비유한 RHS는
|
||||
기존 값 반환/exception 형식의 `invalid_argument`로 거부하며, public signature는
|
||||
변경하지 않는다. Finite-input product overflow는 consumer의 기존 output finite
|
||||
검증으로 실패한다. Empty/zero shape도 입력 finite/shape/range 검증을 유지한다.
|
||||
|
||||
밀집 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
|
||||
및 whitened x, solid frequency의 raw/normalized mode는 finite-first이며, FEAST가
|
||||
반환한 벡터의 finite gate도 기존대로 유지한다. Thermal은 기존 Validate·solver
|
||||
candidate finite와 interval enclosures를 사용한다. Thermal RHS의 각 entry는
|
||||
`(c/delta)*(old-g)-k*g`라는 원래 association을 먼저 계산한 뒤 원래 row 순서로
|
||||
누적한다. 두 행곱을 별도로 합산한 뒤 빼는 후보는 stable b=4를 잃어 기존
|
||||
Cancellation 검사를 실패했으므로 폐기했다. 현재 private diagonal MKL은 O(nnz)
|
||||
compact band k=0 storage로 entry별 곱만 계산한다. Exact companion과 construction
|
||||
error·gamma·underflow certification·free/reaction 판정은 그대로다.
|
||||
비유한 product를 정상값으로 clamp하거나 tolerance를 완화하지 않는다.
|
||||
|
||||
### PARDISO 수명
|
||||
|
||||
현재 구현 그대로 `release → CSR/shape/width 확인 → private arrays → phase11 → phase22`
|
||||
를 수행한다. 값/pattern이 달라지면 `FactorizeFresh`를 다시 호출한다. 새 singular
|
||||
분해 실패 뒤 `SolveCorrection`은 not-factorized이며 caller correction은 보존된다.
|
||||
잘못된 RHS의 실패는 output 보존과 유효한 기존 matrix 분해의 수명을 구별한다.
|
||||
여러 RHS는 같은 성공 분해의 phase33을 사용할 수 있다. 새로운 symbolic 재사용이나
|
||||
다중 RHS framework를 도입하지 않았다.
|
||||
|
||||
### One-equation PARDISO의 scoped 자원 정책
|
||||
|
||||
[T1 실제 VTune](verification.md)의 OMP worker/spin 비용과 아래 toy n=1 lifecycle
|
||||
근거로, SPD/Tangent의 `CallPardiso`에서 **현재 retained equation_count=1**인 경우만
|
||||
호출의 기본 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는 이전 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와 제한
|
||||
|
||||
기존 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 수명 회귀와 분리해 기록하며 이 실패를 검사 통과로 표시하지 않는다.
|
||||
|
||||
같은 독립 진단 소스를 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·raw double bits와 RHS의 input SHA는 양쪽
|
||||
`CC7E72000783E9694BAF76627D95AB7B420A31198B210B5A60C7ACE93E5E2258`로같다.
|
||||
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에서 재현했지만 내부 원인은 미확정이다.
|
||||
[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은 변경하지 않았다.
|
||||
|
||||
같은 toy n=1 보조 실행에서 default 8-thread는 11회 뒤 crash/0.24초,
|
||||
scoped 1-thread는 100회 완료/0.15초였다. 입력 준비와 로그를 포함한 보조 자료이며,
|
||||
실패와 표본 수 차이가 있어 공식 모델의 개선 배수나 시간 목표 판정에 사용하지 않는다.
|
||||
[비용기록](../../.harness/performance/t2/tiny-pardiso-cost-native.json)에 실제 범위를 남겼다.
|
||||
|
||||
## 특수 정밀도 개선과 예외
|
||||
|
||||
T1의 실제 Hex8 VTune stack은 `TwoSum → Add → Multiply → hex8_high_low::operator*`
|
||||
비용 및 frexp/ldexp 분류 비용을 확인했다. T2는 arithmetic association과 underflow
|
||||
정책을 바꾸지 않고 두 helper만 개선했다.
|
||||
|
||||
- `high_low_arithmetic.h::IsNormalized`: finite와 canonical exact-zero guard 뒤
|
||||
`RN(high+low)==high`. 이 경우 기존 TwoSum의 bridge=0/restored=high/error=low이며,
|
||||
반대 방향도 기존 predicate의 high equality가 같은 조건이다. overflow/nonfinite와
|
||||
noncanonical signed zero를 먼저 거부한다.
|
||||
- `LowestBitExponent`: IEEE binary64를 memcpy로 읽어 정상은
|
||||
`(encoded exponent−1075)+trailing(implicit53bits)`, subnormal은
|
||||
`−1074+trailing(fraction)`으로 계산한다. 부호를 제외하고 actual least bit를 보존한다.
|
||||
TwoProduct의 least-bit-sum < −1074 거부와 FMA residual·TwoSum 정규화는 그대로다.
|
||||
- zero/low-zero shortcut, nonzero multiplication association 변경은 채택하지 않았다.
|
||||
|
||||
이후 공통 산술 담당자는 실제 `fpclassify` 비용을 근거로 이 private header의
|
||||
finite 분류만 보강했다. `IsFiniteBinary64`는 memcpy로 읽은 binary64 exponent가
|
||||
2047인지 확인하며 NaN/Inf를 거부한다. 연산식·검사 위치·정규화·FMA·exact-tail
|
||||
기준은 그대로다. [독립 source 검토](../../.harness/performance/shared-classification/source-numerical-review.md)는
|
||||
분류와 지원 환경의 값·실패 조건 보존을 확인했다. Signaling NaN의 exception flag나
|
||||
trap 관측까지 동등하다고 주장하지 않는다. 원래 분류의 새 경계 검사 9/9와
|
||||
변경 후 pair bit oracle·Hex8·paired state/kinematics 62/62가 native 0으로 통과했다.
|
||||
[변경 전 기록](../../.harness/performance/shared-classification/before-native.json),
|
||||
[변경 후 기록](../../.harness/performance/shared-classification/after-native.json)과
|
||||
[검사 로그](../../.harness/performance/shared-classification/after-checks.txt)를 보존한다.
|
||||
이 결과는 최종 모델의 시간 목표나 전체 회귀 검사를 대체하지 않는다.
|
||||
|
||||
후속 동적 Hex8의 30초 SW raw 자료에서는 `LowestBitExponent`가 51.037592
|
||||
sampled CPU초로 나타났다. 150초 제한의 개발 실행은 완료되지 않았으며 이 값은
|
||||
전체 경과 시간이나 개선 배수가 아니다. 공통 산술 담당자는 MSVC 호환 x64 macro
|
||||
조건에서만 6단계 trailing-bit 검색을 `_BitScanForward64`로 교체했다.
|
||||
[Microsoft 계약](https://learn.microsoft.com/en-us/cpp/intrinsics/bitscanforward-bitscanforward64?view=msvc-170)의
|
||||
least-set-bit index를 사용하며 정상 수의 implicit bit와 비영 subnormal fraction이
|
||||
mask가 0이 아님을 보장한다. Exponent 구성, -1074 exact-tail 거부, FMA와
|
||||
모든 pair 산술식은 그대로다. Macro 조건 밖에서는 기존 portable 검색을 유지한다.
|
||||
MSVC 호환 macro를 정의하는 다른 compiler의 실행까지 검증했다고 주장하지 않는다.
|
||||
|
||||
[독립 source 수치 검토](../../.harness/performance/shared-bitscan/source-numerical-review.md)는
|
||||
이 검색값과 downstream gate 보존을 확인했다. 정확한 include dependency를 가진
|
||||
MSVC Debug에서 unit/integration/CLI consumer를 36개 edge로 재빌드했고,
|
||||
기존 frozen exponent·pair bit oracle와 통합 Hex8·paired state/kinematics·직렬/TBB
|
||||
검사 **68/68이 native 0**으로 통과했다.
|
||||
[실행 기록](../../.harness/performance/shared-bitscan/after-native.json)과
|
||||
[검사 로그](../../.harness/performance/shared-bitscan/after-checks.txt)를 보존한다.
|
||||
새 검색의 전체 동적 시간, 최종 reference 및 전체 Debug 판정은 아직 미실행이다.
|
||||
|
||||
Bit-scan 적용 소스의 동적 개발 단일 실행도 150.1015395초 제한 안에 완료되지
|
||||
않았다. 새 30초 SW 수집은 collector native 4의 부분 자료이고 report 세 개는
|
||||
native 0이다. `TwoSum` 33.144893, `LowestBitExponent` 11.061455 sampled CPU초와
|
||||
독립 start address/호출 경로가 확인되어 두 helper의 MSVC 호환 x64 선언에만
|
||||
`__forceinline`을 적용했다. 본문·guard·HighLow layout·signature·전역 compiler
|
||||
flags는 그대로다. 다른 경로는 `inline`을 유지한다.
|
||||
[Microsoft 설명](https://learn.microsoft.com/en-us/cpp/cpp/inline-functions-cpp?view=msvc-170)처럼
|
||||
이는 expansion 요청이며 실제 inline이나 속도 향상을 보장하지 않는다.
|
||||
|
||||
[독립 source 검토](../../.harness/performance/shared-inline/source-numerical-review.md)는
|
||||
ODR·지원 환경·산술 의미의 보존을 확인했다. 변경된 실제 최적화 codegen의 반증을
|
||||
위해 정확한 include prefix의 **fresh Release**에서 unit/integration/CLI를
|
||||
205개 edge로 빌드하고 frozen oracle 및 통합 consumer **68/68을 native 0**으로
|
||||
검증했다. [실제 기록](../../.harness/performance/shared-inline/after-native.json)과
|
||||
[검사 로그](../../.harness/performance/shared-inline/after-checks.txt)를 보존한다.
|
||||
Debug의 `/Ob0` 검사 시간을 Release 개선 배수로 사용하지 않는다. 새 선언의
|
||||
전체 모델 시간, disassembly와 최종 검증은 아직 미확인이다.
|
||||
|
||||
해당 SW 수집은 export wrapper가 metadata 경로를 재사용해 수집 전 기록이
|
||||
덮어써졌다는 한계가 있다. 남은 전후 hash는 export 구간과 이전 고정 binary의
|
||||
일치만 증명한다. 전체 수집의 독립 identity 대조로 확대하지 않으며, 후속 wrapper는
|
||||
수집과 export 기록을 분리한다. 원래 실패·unknown target exit 자료도 보존한다.
|
||||
|
||||
통합한 Hex8의 ordinary MKL 연산, 원래 누적·진단 순서, private pair의 영항 생략과
|
||||
선택적 선형 tangent의 지연 준비는 [전용 기록](hex8-performance.md)에 있다.
|
||||
선택적 준비는 Float64 Create의 필수 검사를 바꾸지 않으며 검증된 현재 trial의
|
||||
요청에서만 초기화한다. 해당 기록의 1.7391958초는 과거 a08 source의 개발 단일
|
||||
실행이고 최신 통합 source의 공식 시간 합격으로 소급하지 않는다.
|
||||
|
||||
위 검증 중 기존 MSVC/Ninja의 include prefix 인식 오류도 확인했다. 이 PC에는
|
||||
한국어 compiler resource만 있어 `VSLANG=1033`만 지정한 fresh build도 dependency가
|
||||
0개였다. 실제 출력 접두사 `참고: 포함 파일: `를 별도 로컬 CMake include로 지정한
|
||||
fresh build에서는 `hex8_high_low.cpp.obj`의 13개 dependency와 산술 header를 확인했다.
|
||||
[실제 dependency](../../.harness/performance/shared-classification/after-dependencies.txt)를 보존한다.
|
||||
공용 preset·compiler flags·설치 환경은 바꾸지 않았다. 기존 자료의 직접 cpp 재컴파일과
|
||||
header 변경 추적의 한계를 구별하며 최종 검증도 보정한 fresh build에서 수행한다.
|
||||
|
||||
[독립 수치 검토](../../.harness/performance/t2/arithmetic-numerical-review.md)는
|
||||
위 두 helper proof/source 범위 PASS이며 실제 검사/속도와 전체 MKL diff 검토를
|
||||
대체하지 않는다. Frozen original oracle는 pinned `b4fc1bb`의 원본이며 include guard와
|
||||
namespace만 바꾼 test 전용 `high_low_arithmetic_original.h`이다. 실제 모든 정상
|
||||
exponent×53 trailing-bit×양 부호, subnormal boundaries, signed zero/ties/overflow/
|
||||
invalid/raw random 입력의 bit 대조 및 기존 analytical checks를 실행했다.
|
||||
|
||||
| 파일 / 함수 | 연산·크기·정밀도 | 예외 이유 / 검사·owner |
|
||||
| --- | --- | --- |
|
||||
| `math/high_low_arithmetic.h` 전체, `elements/hex8_high_low.cpp::EvaluateHighLow` | normalized binary64 high+low, 3×3 tensor 및 24×24 pair tangent | ordinary Float64 BLAS로 low/tail rejection을 잃을 수 없음; frozen oracle/Hex8HighLow·T3 |
|
||||
| `elements/hex8_geometry.cpp`의 interval/relative coordinate 인증 | 3×3 inverse/Jacobian 및 outward interval | whole-cell certificate·직접 geometry predicate 보존; Hex8 geometry 검사·T3 |
|
||||
| `elements/hex8_element.cpp` gradient/inverse·F/S/P/FFT/stress의 3×3 tensor | fixed3-coordinate contraction | 3-coordinate geometry/constitutive 의미; 24×24 ordinary tangent는 이 예외로 일괄 분류하지 않음·T3 |
|
||||
| `elements/finite_rotation.cpp` Rodrigues/skew/invariant | fixed3×3 axis coordinate | 좌표 rotation/invariant; finite rotation 검사 |
|
||||
| `analysis/eigen_reduction.cpp::MakeLift` analytic director/frame basis와 null-coordinate checks | fixed6 nodal coordinates, 최대6 positive basis | 고정 director/frame의 analytic 좌표 선택만 예외. 일반 mass whitening/Cholesky/inverse/congruence/reconstruction은 MKL 전환·EigenReduction |
|
||||
| `elements/thermal_shell.cpp` shape/metric contraction | fixed4 shape·fixed3 gradient·2D metric, separable integration coefficient | local coordinate/shape quadrature; global capacity/conduction actions는 MKL·thermal local oracle |
|
||||
| `analysis/thermal_transient_algebra.cpp`의 `I`/Add/Mul/Sub/Div/Norm/Error/Roundoff/Tiny | outward interval·construction/underflow enclosure | floating product와 분리된 정확대수 인증, gamma/epsilon/limit 변경없음·TransientHeatProcedure/ThermalPhysics |
|
||||
| `analysis/hht_reduced_operators.cpp` Projection/Embed/Sum, BasisValue, reduced blocks | compensated sums 및 outward basis radius | low/error compensation 유지, ordinary Hessian/product는 T4 판별/전환 |
|
||||
| `analysis/hht_dynamic_algebra.cpp` AddCompensated·constraint radius 및 3-vector director dot | compensated error·fixed coordinate | 승인 N3/N7·scale 인증; 일반 CSR contraction과 구별·T4 |
|
||||
| `elements/nonlinear_mitc4_shell.cpp` / `nonlinear_mitc4_inertia.cpp` Jet 산술 | analytic derivative jets, fixed3 rotation | AD derivative association/coordinate 의미; ordinary24×24 Hessian/dense congruence blanket 예외 금지·T4 |
|
||||
| `io/hdf5/nonlinear_hdf5_results_writer.cpp` spatial moment transform | fixed3×3 rotation coordinate | 공개 generalized/spatial quantity 변환 보존·T4 |
|
||||
|
||||
## T3/T4 인계
|
||||
|
||||
전수 검색의 raw 위치 목록은 [ordinary-product-audit](../../.harness/performance/t2/ordinary-product-audit.txt)다.
|
||||
검색은 +=*만으로 완료하지 않고 Multiply·중첩 루프와 각 함수의 precision/owner를
|
||||
함께 확인했다. 이 목록은 후속 diff에서 갱신해야 한다.
|
||||
|
||||
- T3: Hex8 pair tangent/relative geometry/mean-volume certification은 pair/interval
|
||||
예외로 유지한다. Float64 24×24 response/tangent의 일반 contractions와 procedure
|
||||
직접 products는 ordinary MKL 적용 여부를 확인한다.
|
||||
- T4: `mitc4_shell.cpp::` transformation congruence(기존241 주변), strainᵀCstrain
|
||||
stiffness(기존635 주변), `nonlinear_mitc4_inertia.cpp` complement Gram/projection
|
||||
(기존449/456), `hht_reduced_operators.cpp` bilinear Hessian action(기존620),
|
||||
reduced block/gradient products(기존970 이후), `hht_dynamic_algebra.cpp` 일반
|
||||
stiffness projection(기존442)은 MKL 또는 구체적인 compensated 예외 근거가 필요하다.
|
||||
`Jet*`의 derivative array 크기가24라는 이유만으로 모든24×24 Float64 products를
|
||||
특수 정밀도 예외로 분류하지 않는다.
|
||||
- 공통 recovery/eigen/thermal/beam은 T2 확장 owner로 직접 변경했다. Shared
|
||||
assembly tuple reduction/source identity와 task별 CMake 등록은 root owner이며 변경하지 않았다.
|
||||
|
||||
## 실제 검증과 남은 작업
|
||||
|
||||
Parent artifact `.harness/performance/t2/`는 worktree cleanup 뒤에도 남는다.
|
||||
각 native JSON은 argv/cwd/실제 exit와 source 또는 snapshot 구분을 보존한다.
|
||||
아래 링크는 통합한 저장소의 feature 문서 위치를 기준으로 한다.
|
||||
|
||||
| 실행 범위 / source | 결과 | 실제 기록 |
|
||||
| --- | --- | --- |
|
||||
| 최초 Debug build | include 누락 exit2; 수정 뒤 build0 | `build-debug-initial-failed.txt`, `build-native-initial-failed.json` |
|
||||
| 초기 개발 snapshot | core43/43·consumer71/71 PASS; whole-source hash 없는 precommit 자료 | `core-native.json`, `consumer-native.json` |
|
||||
| Extended66 개발 snapshot | 64 PASS·1 thermal FAIL·1 large-mesh interrupted; whole native−1 | `extended-native.json`, `extended-checks.txt`, `extended-interruption.json`, `extended-cleanup.json` |
|
||||
| 59c8e93 후보100개 | 99 PASS·열 RHS 상쇄1 FAIL; native8 | `final-native.json`, `final-checks.txt` |
|
||||
| Thermal/finite/Gram/whitening 수정 snapshot82개 | 82/82 PASS; native0 | `corrected-native.json`, `corrected-checks.txt` |
|
||||
| 후속 eigen20개 | 19 PASS·기존 PARDISO heap fixture1 native crash; native8 | `null-products-native.json`, `null-products-checks.txt` |
|
||||
| 770fa2a scoped-policy 후보 | build0·99/99 PASS; native0 | `policy-build-native.json`, `policy-native.json` |
|
||||
| 9c4e685 중앙 dense finite 후보 | build0·120/120 PASS; native0 | [build](../../.harness/performance/t2/finite-build-native.json), [native](../../.harness/performance/t2/finite-native.json), [log](../../.harness/performance/t2/finite-checks.txt) |
|
||||
| 6fc7011 tests-only delta | build0·1↔2 retained-size 전환2/2 PASS; native0 | [build](../../.harness/performance/t2/transition-build-native.json), [native](../../.harness/performance/t2/transition-native.json), [log](../../.harness/performance/t2/transition-checks.txt) |
|
||||
|
||||
`MklPardisoSolver.SingleEquationScopeTransitionsBetweenRetainedSizes`와
|
||||
`TangentSolver.SingleEquationScopeTransitionsBetweenRetainedSizes`는 각각
|
||||
1→2→1 factorize/solve와 old/new retained count별 TLS 복원을 직접 확인한다.
|
||||
동시 default TLS의 성공→다른값→bad RHS→새 분해 실패→stale solve 거부는
|
||||
`SingleEquationPolicyPreservesLifecycleAndConcurrentTls` 및
|
||||
`SingleEquationScopeRestoresTlsAcrossFreshFailureAndReuse`에서 확인한다.
|
||||
Caller의 비영 TLS override·exception unwind와 큰 크기 정책은
|
||||
`DenseBlasInternal.SingleEquationScopeRestoresTlsAndRespectsOverrides`의 직접 관찰이다.
|
||||
|
||||
SpMV destroy/PARDISO release-error를 live 주입한 검사는 미실행이다. 유효 handle에서
|
||||
이를 안전하게 발생시킬 근거가 없고 production mutable fault hook은 추가하지 않았다.
|
||||
정상 release·분해 오류 후 release·반복 및 크기 전환은 실제 검사이며, 원시 release
|
||||
오류 분기의 candidate 실패 전달과 자원 수명은 독립 정적 검토 범위다.
|
||||
|
||||
9c4e685 production source의 [독립 conformance 재검토](../../.harness/performance/t2/source-conformance-review.md)는 PASS다. 이후 6fc7011은
|
||||
검토자가 요청한 transition tests-only delta이며 production source는 같다.
|
||||
High+low 두 helper의 독립 proof는 앞 절의 실제 보고서와 연결했다.
|
||||
검토 PASS와 actual execution PASS는 서로 대체하지 않는다.
|
||||
|
||||
최초 실패·상쇄 회귀·간헐적 heap 실패·중단 자료를 삭제하거나 현재 PASS로 바꾸지 않았다.
|
||||
전체 MSVC Debug/CTest, 원본3+Hex8 필수5 비교, VTune 최종 raw 및 공식
|
||||
no-warmup/one-measurement 평가는 T5에서 미실행 항목을 완료해야 한다.
|
||||
Task source를 fresh build했으며 다른 source의 object를 수동 복사하지 않았다.
|
||||
Baseline-linked auxiliary는 root가 승인한 보존된 T1 Release library를 직접 link하고
|
||||
그 flags/runtime/input을 별도로 기록했으므로 현재 Debug evidence로 대체하지 않는다.
|
||||
|
||||
High+low standalone 보조 microbenchmark는 같은 compiler/한 exe에서
|
||||
original/optimized 각400000 products를3회 대조했다. Original은
|
||||
0.129315/0.129951/0.129560s, optimized는0.069739/0.070177/0.068700s이며
|
||||
모든 checksum이 같고 native0이다.
|
||||
[보조기록](../../.harness/performance/t2/microbench.jsonl)과
|
||||
[native](../../.harness/performance/t2/microbench-native.json)는 helper 비용 근거이며
|
||||
3모델의 공식 wall 평가를 대체하지 않는다.
|
||||
|
||||
CSR consumer 전수 보강 검색은
|
||||
[csr-consumer-audit](../../.harness/performance/t2/csr-consumer-audit.txt)에 있다.
|
||||
`assembly/load_assembler.cpp::EffectiveFreeRhs`의 Kfc*dc는 공통 조립 담당자가
|
||||
entrywise MKL diagonal products와 기존 개별 product/ordered row-sum finite gate로
|
||||
연결했다. O(nnz) 입력 벡터를 사용하며 원래 CSR 순서의 상쇄와 첫 오류 진단을 유지한다.
|
||||
변경 전 LoadAssembly 13개, 변경 후 관련 조립·복구·선형 정적 검사 41개가 native 0으로
|
||||
통과했다. [실행 기록](../../.harness/performance/shared-assembly/after-native.json)과
|
||||
[검사 로그](../../.harness/performance/shared-assembly/after-checks.txt)를 보존한다.
|
||||
독립 정적 검토는 compact band k=0 layout과 row 진단 순서 보존을 확인했다.
|
||||
이 공유 파일은 T2가 수정하지 않았다. 최종 production 전수 완료는
|
||||
이 인계와 T3/T4 일반 연산 적용까지 확인해야 한다.
|
||||
|
||||
최종 source/test hash·production 검토 이후 source 변경 없음·874개 검사 discovery native0은
|
||||
[final-source-manifest](../../.harness/performance/t2/final-source-manifest.json)에 기록했다.
|
||||
[final CMakeCache](../../.harness/performance/t2/final-CMakeCache.txt)는 actual dependency와 Debug flags를 보존한다.
|
||||
Whole changed-file clang-format dry-run은 기존 및 후보 formatting 위반으로 exit1이었다.
|
||||
[실제 기록](../../.harness/performance/t2/clang-format-native.json)을 보존하며 formatter PASS로 보고하지 않는다.
|
||||
|
||||
## 통합한 요소별 MKL 경계와 특수 정밀도 예외
|
||||
|
||||
Hex8의 `446d3fa`와 셸의 `0e5b3e0` 구현을 feature branch에 통합했다.
|
||||
아래 목록은 해당 source의 적용·예외 경계이며, 통합 후 전체 build/reference 또는
|
||||
세 모델의 최종 시간 합격을 뜻하지 않는다. 기존 T2 기록과 실패 자료는 유지한다.
|
||||
|
||||
| 위치 | 일반 행렬 연산의 MKL 경계 | 예외 또는 보존하는 순서 |
|
||||
| --- | --- | --- |
|
||||
| `elements/hex8_element.cpp` | ordinary outer/Gram/geometric/mass 제품 | entrywise diagonal 제품 뒤 원래 row/point 누적 순서를 유지한다. |
|
||||
| `elements/mitc4_shell.cpp` | 선형 BᵀCB와 좌표 congruence | 고정 3차원 좌표 계산은 기존 작은 좌표 예외다. |
|
||||
| `elements/nonlinear_mitc4_shell.cpp` | Jet gradient outer의 private GEMM, physical Gram/congruence와 LAPACK inverse | 증명된 상수의 zero Hessian 작업만 생략하며 값·방향 미분·finite gate는 유지한다. |
|
||||
| `elements/nonlinear_mitc4_inertia.cpp` | nodal Gram/scatter와 bilinear 제품 | 원래 local block 배치와 mass 의미를 유지한다. |
|
||||
| `analysis/hht_dynamic_algebra.cpp` | local mass의 private LAPACK Cholesky/inverse, ordered mass projection과 graph metric 제품 | pivot/inverse 실패를 구분하고 compact diagonal 제품 뒤 원래 entry association과 합 순서를 유지한다. |
|
||||
| `analysis/hht_reduced_operators.cpp` | constraint Hessian bilinear 제품과 algebra의 ordered metric 호출 | 원래 entry association과 합 순서를 유지한다. |
|
||||
| `analysis/hht_dynamic_assembly.cpp` | hidden Hessian·방향 곱과 mass·가속도 제품 | uncancelled scale의 개별 product와 기존 finite/ordered gate를 유지한다. |
|
||||
|
||||
`hex8_high_low.cpp`, `hex8_pair_arithmetic.h`와 private
|
||||
`hex8_pair_simd_avx2.cpp`의 material tangent packet은 정규화된 high+low 값의
|
||||
특수 정밀도 연산이다. 일반 Float64 BLAS로 대체하면 low component, 정확한 tail
|
||||
판정과 invalid propagation 계약을 잃으므로 MKL 예외로 유지한다. SIMD는 독립
|
||||
column 네 개의 같은 pair graph만 실행한다. Vendor/ISA 타입은 public core에
|
||||
노출하지 않고 baseline POD·dispatch·scalar bridge와 AVX2 TU를 분리한다.
|
||||
지원 CPU/OS/FP control 밖에서는 기존 scalar pair 경로를 사용한다.
|
||||
자세한 입력 guard·진단·ISA/bit 비교는 [Hex8 기록](hex8-performance.md)에 있다.
|
||||
|
||||
셸의 local dense BLAS scope는 기존 양의 caller TLS override를 존중하고 default
|
||||
TLS에서만 1을 사용한 뒤 모든 종료 경로에서 원복한다. 재사용 판정용 private
|
||||
getter도 같은 scope 안에서 BLAS 최대 thread 정책과 dynamic 정책을 읽고 원복한다.
|
||||
이는 실제 worker 수 측정이나 global 정책 변경이 아니다. 일반 PARDISO와 기존
|
||||
global thread 설정을 해당 getter로 바꾸지 않는다.
|
||||
|
||||
완성된 true trial의 constraint 자료 재사용은 새로운 행렬 backend가 아니다.
|
||||
기존 전체 internal 평가와 inertia·ordered assembly gate가 성공한 뒤 네 response
|
||||
field를 trial-owned storage로 이동하고, 동일한 finite 구성·identity·q/v·owner와
|
||||
지원 FP/local BLAS 정책에서만 원래 소비 위치에 제공한다. 불일치하면 원래 full
|
||||
평가를 수행한다. 외부 primitive와 후속 gate는 매번 수행하며 accepted history나
|
||||
HDF5에 cache를 저장하지 않는다. 소유권·누락 key 수정·실제 검사와 미실행 범위는
|
||||
[셸 기록](t4-shell-optimization.md)에 있다.
|
||||
|
||||
두 요소의 구현은 각각 독립 source 검토와 관련 실행 검사를 받았다. 현재 feature
|
||||
통합 source 전체의 consumer 검사, 최종 VTune 비교, 원본 결과 비교와 시간 목표는
|
||||
남아 있다. 후속 `0b5adf4`의 vector guard/LBE screen도 독립 source 검토와
|
||||
Debug·Release 각각 78개, raw/FP 상태·ISA 경계·9,804행 응답 대조 뒤 통합했다.
|
||||
이는 위 특수 정밀도 예외의 검사 비용만 바꾸며, 전체 모델 성능 증거와는 구별한다.
|
||||
@@ -1,425 +0,0 @@
|
||||
# Shell 계산 경로의 성능 변경
|
||||
|
||||
이 기록은 reduced-coordinate shell의 local 계산 변경과 근거를 구분한다.
|
||||
전체 시간 목표와 최종 원본 비교는 [PRD](PRD.md)의 계약이며 아래의 단계 검사는
|
||||
그 계약의 최종 합격을 대신하지 않는다.
|
||||
|
||||
## 계측과 변경의 연결
|
||||
|
||||
원본 meshfine shell의 기준 전체 실행은 6372.3256209초다. VTune 소프트웨어
|
||||
샘플링의 별도 150초 부분 수집은 accepted increment 2 / time 0.2까지 포함한다.
|
||||
`Jet*`는 sampled CPU 133.466초(27.6%), `malloc`은 30.289초(6.3%)였다.
|
||||
`EvaluateAssembly`의 inclusive 257.862958 CPU초와 중첩 selector의 1.600014초는
|
||||
겹치는 호출 경로이므로 더하거나 전체 경과 시간으로 바꾸지 않는다.
|
||||
|
||||
`nonlinear_mitc4_shell.cpp`의 모든 Jet는 기존에 값이 상수인 경우도 576-double
|
||||
Hessian을 영 초기화한 `shared_ptr`로 할당했다. 상수의 영 Hessian은 이제
|
||||
읽기 전용 정적 영 배열을 참조하고 처음 쓰는 때만 기존 공유 storage를 할당한다.
|
||||
읽기 전용 영 배열에는 trial 값이 없으며 동시 호출은 그 배열을 수정하지 않는다.
|
||||
이미 할당된 Hessian의 복사/공유 수명은 그대로다. 현재 trial 이외의 형상·접선·
|
||||
도함수 응답을 저장하거나 주소에 따라 재사용하는 cache는 추가하지 않았다.
|
||||
|
||||
후속 후보는 576-entry 반복문 앞에서 입력 read pointer와 fresh output pointer를
|
||||
한 번씩 취득한다. fresh output은 단일 `make_shared` 할당을 유지하고 영 초기화를
|
||||
생략한 뒤 576개 전체를 기록한다. `operator+/-/*`, scalar scale, Compose, Atan2의
|
||||
모든 complete write와 MKL 거부 시의 NaN fill 뒤에만 결과를 읽거나 복사한다.
|
||||
일반 부분 mutable write는 영 초기화를 유지한다. 상수의 nullptr 복사에는 별도
|
||||
mutable 공유 객체가 없지만 실제 consumer는 복사된 상수 Hessian을 수정하지 않는다.
|
||||
이미 할당된 결과의 shared copy와 입력 alias는 수정하지 않는다.
|
||||
|
||||
## 일반 행렬 연산의 MKL 경계
|
||||
|
||||
| 파일 / 함수 | 연산과 크기 | 변경 |
|
||||
| --- | --- | --- |
|
||||
| `mitc4_shell.cpp::Stiffness`, `Congruence` | 5×20 strain의 BᵀCB, 20/4 local→24 congruence | `Matrix::Multiply`와 private transpose-left MKL GEMM, 상삼각 결과를 그대로 대칭 복사 |
|
||||
| `nonlinear_mitc4_inertia.cpp::CheckPhysicalMass` | 24×20 complement Gram·mass congruence, 20×20 Cholesky·inverse·reconstruction | GEMM 및 기존 private LAPACK helper; 같은 positivity, reconstruction, 2^-32 conditioning gate 유지 |
|
||||
| `nonlinear_mitc4_inertia.cpp::Evaluate` | 각 lumped mass-node의 6×3 coefficient Gram, velocity/position bilinear, 3방향 mass variation의 6×6 block | 무할당 row-major transpose-right GEMM; 원래 point/node/row/column scatter와 가중 누적 유지 |
|
||||
| `nonlinear_mitc4_shell.cpp::operator*`, `Compose`, `Atan2`, `DrillingEnergy` | ordinary 24×24 derivative outer products | private `OuterProduct`의 row-major GEMM k=1, 기존 Jet storage에 직접 기록 |
|
||||
| `hht_dynamic_algebra.cpp::BuildPhysicalSpace` | scaled free mass×analytic null 및 일반 complement congruence의 sparse contributions | entrywise compact-diagonal MKL products 뒤 원래 CSR/COO 순서 누적; full global dense matrix 없음 |
|
||||
| `hht_dynamic_algebra.cpp::CheckLocalMass` | nonempty nodal physical block, 크기1–6 | MKL Cholesky/inverse; 동일 inverse infinity norm과 2^-32 conditioning 검사 |
|
||||
| `hht_dynamic_algebra.cpp::CheckRegularity`, `hht_reduced_operators.cpp::CheckGraphRegularity` | scalar null stiffness metric와 gradient×null projection | MKL GEMV/dot 또는 entry products, 기존 fresh factorization/모든 unit RHS/residual/condition gate 유지 |
|
||||
| `hht_reduced_operators.cpp::ContractConstraintHessian` | failure-only bilinear replay의 sparse Hessian entries | 두 MKL diagonal product 뒤 기존 left association/entry order sum |
|
||||
|
||||
Outer product는 배열 copy나 Matrix 객체를 만들지 않는다. 크기·integer range·
|
||||
nonempty null storage를 검사하며 비유한 입력은 MKL 호출/출력 쓰기 전에 거부한다.
|
||||
유한 입력의 곱 overflow는 후속 owner finite gate가 판단한다. Jet consumer는
|
||||
거부된 operand의 결과를 NaN으로 표시하고 원래 equilibrium/constraint finite
|
||||
실패를 반환한다. 직접 scalar product로 계산하는 fallback은 없다.
|
||||
|
||||
`CholeskyLowerAndInverse`의 optional private failure reason은 validation 전에
|
||||
`kNone`으로 초기화된다. factor pivot/finite 실패와 inverse/finite 실패를 구분하여
|
||||
기존 positive-mass와 ill-conditioned-mass 진단을 유지한다. 실패에서는 lower와
|
||||
inverse output candidate를 교체하지 않는다. 기존 default-nullptr consumer의
|
||||
bool 의미는 그대로이며 live inverse 실패를 발생시킨 검사는 아직 없다.
|
||||
|
||||
Element-local dense work의 `ScopedLocalDenseThreads`는 caller TLS 요청이 default
|
||||
0일 때만 1을 적용한다. caller의 양수 override는 유지하고 정상 반환과 unwind 뒤
|
||||
원래 default를 복원한다. 전역 MKL/OpenMP 정책이나 이후 global solve에는 영향을
|
||||
주지 않는다. 각 scalar metric scope는 MKL 호출 뒤 끝나며 global PARDISO를 포함하지
|
||||
않는다. 현재 후보의 실제 비용과 복원 검사는 아래 단계 검증 기록으로 구분한다.
|
||||
TLS default 0, caller override 우선순위와 저장한 값을 복원하는 동작은
|
||||
[Intel 2026 thread-local reference](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/mkl-set-num-threads-local.html)의 계약을 따른다.
|
||||
|
||||
Hessian의 합산 순서와 ordinary product는 별도다. 곱셈 Jet는 원래의
|
||||
`left.second * right.value + outer1 + outer2 + left.value * right.second`를
|
||||
유지한다. Compose와 Atan2는 계수×gradient를 먼저 계산하여 원래 left association을
|
||||
유지한 뒤 outer product를 계산한다. GEMM의 연산과 signed-zero 결과는 원래 scalar
|
||||
구현의 bit 동일성을 주장하지 않으며 접선/방향/혼합 도함수의 수치 검토 대상이다.
|
||||
일반 24×24 연산을 AD라는 이유로 특수 정밀도 예외로 처리하지 않는다.
|
||||
|
||||
## 유지하는 특수 연산
|
||||
|
||||
| 파일 / 함수 | 크기·정밀도·이유 | 검증 범위 |
|
||||
| --- | --- | --- |
|
||||
| `nonlinear_mitc4_inertia.cpp::Jet`, `ExpSkew`, `LeftJacobian` | 3개의 nodal rotation coordinate에 대한 최대 3차 analytic derivative; 3×3×3 tensor | finite rotation, inertia force/position/velocity tangent와 null·momentum oracle |
|
||||
| `hht_reduced_operators.cpp::BasisValue`, fixed basis 생성 | normalized high+low 및 outward radius; 3-vector basis certificate | fixed chart/radius replay·partial-boundary·selector transversality |
|
||||
| `hht_reduced_operators.cpp::RateSum`, `GradientDot`, reduced block 누적 | sparse support의 원래 순서 Neumaier correction | cancellation, full defect, mixed rates·channel acceptance |
|
||||
| `nonlinear_mitc4_inertia.cpp::InertiaSum` | kinetic force/energy/momentum의 원래 순서 compensated contraction | 독립 inertia oracle와 omission 검출, 좌표/단위 변화 |
|
||||
| shell의 fixed3 coordinate tensor/rotation 변환 | 좌표·director·chart의 3-vector 또는 3×3 연산 | rigid motion/objectivity·principal chart 실패 |
|
||||
| `hht_dynamic_algebra.cpp::BuildPhysicalSpace`의 analytic nodal basis Gram, `InitializeAcceleration`의 force projection/lift | translation 1계수 또는 단일 절점의 최대3 rotation components; 현재 assembly의 nodal frame에 대한 Float64 좌표 변환 | 서로 다른 node의 basis support는 disjoint, 같은 node의 최대3-vector inner product만 사용; excluded fixed rows·원래 association·초기 acceleration 진단 순서 유지 |
|
||||
|
||||
보상 누적과 interval/basis 인증은 일반 Float64 GEMM으로 접어 수치 의미를 잃지 않는다.
|
||||
`hht_reduced_operators.cpp::GradientDot`, `Lift`, `ProjectPhysical`,
|
||||
`ReconstructPhysicalRates`, `AssembleAugmentedReducedSystem`의 support contractions는
|
||||
원래 entry 순서의 Neumaier correction과 high+low/outward fixed-basis certificate를
|
||||
유지하는 예외다. Plain sum과 달리 partition cancellation에서 소실되는 1을 유지하는
|
||||
`ReconstructsRatesAcrossSelectedPartitionCancellation` 및 augmented full-model defect
|
||||
검사가 해당 의미를 검증한다. 일반 24×24 outer와 mass matrix 제품은 이 예외로 묶지 않는다.
|
||||
`BuildPhysicalSpace`의 좌표 basis는 현재 assembly의 analytic null로 각 호출에서
|
||||
생성한다. 초기화는 initial assembly를 사용하고 후속 질량 인증은 해당 현재 assembly를
|
||||
사용한다. 실행 전체의 fixed initial chart와 같은 자료라고 판단하지 않으며
|
||||
다른 trial에 basis/응답을 재사용하지 않는다.
|
||||
|
||||
## 단계 검증 상태
|
||||
|
||||
변경 전 clean source `8c7c41729eb9eaa904f6739b54d34c37b1bd555f`의 fresh MSVC
|
||||
Debug configure/build는 native 0, local shell/inertia/reduced/math 70개는 모두 PASS다.
|
||||
별도 MITC4 linear kernel·mass·recovery 20개도 native 0으로 모두 PASS다.
|
||||
Mixed-time actual shell fixture는 144.84초에 정상 통과했으며 중단되지 않았다.
|
||||
[원래 실행 기록](../../.harness/performance/t4/baseline-native.json)과
|
||||
[linear 실행 기록](../../.harness/performance/t4/baseline-linear-native.json)을 보존한다.
|
||||
|
||||
첫 후보 build의 `Status` 기본 생성자 오류(native 2)는 별도로 보존하고
|
||||
`Status::Ok` 초기화로 수정했다. 수정 후보의 configure/build는 native 0이고
|
||||
91개 중 90 PASS, `HhtReducedEmbedding.ReconstructsActualShellRatesWithMixedTimeLoad`는
|
||||
180초 timeout으로 미통과다. 전체 CTest native 8과 실제 종료 상태를 보존한다.
|
||||
이 Debug 비용 악화를 Release 개선으로 표시하지 않는다. 이는
|
||||
`candidate-local-fixed` snapshot의 결과다. Read pointer hoist, fresh output의
|
||||
단일 allocation/full overwrite, 별도 이름의 local TLS scope와 추가 coverage를
|
||||
적용한 `packed-output-mkl-coverage` 결과는 별도로 기록한다.
|
||||
|
||||
기존 Korean compiler 환경의 Ninja header prefix가 mojibake이고 actual dependency
|
||||
graph가 0개인 사실을 확인했다. 그 build의 직접 변경 source/검사 결과는 보존하되
|
||||
header consumer 전체 재빌드를 입증한다고 해석하지 않는다. 설치된 compiler의
|
||||
locale fallback 때문에 `VSLANG=1033`만으로 해결되지 않는다는 root의 후속 근거가
|
||||
있다. 정확한 include prefix를 지정한 ignored metadata helper의 별도 probe 뒤
|
||||
full fresh build에서 actual Ninja header deps를 확인했다. 공용 preset/flag나
|
||||
source object를 바꾸어 혼합하지 않는다.
|
||||
|
||||
후속 `packed-output-mkl-coverage` snapshot의 source SHA-256은
|
||||
[source manifest](../../.harness/performance/t4/candidate-packed-source.json)에 있다.
|
||||
Corrected-prefix fresh configure/build는 각각 native 0이고
|
||||
`eigen_reduction.cpp.obj`의 실제 dependency inventory에
|
||||
`dense_blas_internal.h`가 포함되어 있다.
|
||||
기존 Cholesky/eigen consumer, local tangent/objectivity/patch·inertia,
|
||||
fixed chart·channel/failure·boundary·MKL scope/shape/finite 검사 **105/105 PASS**,
|
||||
native 0, CTest 36.94초다. 별도 mixed-time fixture도 **1/1 PASS**, native 0,
|
||||
fixture 60.69초다. [실행 기록](../../.harness/performance/t4/packed-native.json),
|
||||
[검사 로그](../../.harness/performance/t4/packed-4.txt),
|
||||
[mixed-time 기록](../../.harness/performance/t4/packed-mixed-native.json)을 보존한다.
|
||||
이 106개 결과는 전체 Debug/원본 비교/시간수렴을 통과했다는 뜻이 아니다.
|
||||
|
||||
첫 Release 보조 configure는 runtime DLL PATH를 compiler 탐색보다 앞에 두어
|
||||
icx가 선택되었고 `libircmt.lib` 없음으로 native 1 실패했다. 수치 실행은 없었으며
|
||||
실패 자료/cache를 보존한다. 동일 설치 MSVC cl을 명시한 별도 fresh directory의
|
||||
Release configure/build 97 edges는 native 0이다. [보조 실행 기록](../../.harness/performance/t4/release-micro-fixed-native.json)을 보존한다.
|
||||
|
||||
Jet 보조 측정은 frozen `8c7c417`의 실제 Jet source span과 현재 production
|
||||
`nonlinear_mitc4_shell.cpp`를 같은 translation unit에 두고 현재 source의
|
||||
Release library와 연결했다. 동일 입력·flags로 각 variant의 3000-product loop를
|
||||
워밍업 없이 한 번씩 측정했다. 모든 value/gradient/Hessian/directional/mixed
|
||||
coefficient 및 checksum이 같고 실제 native 0, scope 안 effective threads 1,
|
||||
종료 뒤 caller TLS 복원 true다. 정확성 대조는 모든 타이밍 후 수행했다.
|
||||
|
||||
| 보조 variant | 3000-product loop 경과 시간 |
|
||||
| --- | ---: |
|
||||
| frozen original | 0.0025384초 |
|
||||
| MKL candidate / default 8 | 0.0082295초 |
|
||||
| MKL candidate / element scope 1 | 0.0029779초 |
|
||||
|
||||
Scope는 새 MKL kernel의 default-thread 비용을 줄이지만 이 dense nonzero
|
||||
kernel 자체가 원래 구현보다 빠르다는 근거는 아니다. Scope 후보도 original보다
|
||||
약17% 느리다. 전체 모델의 준비·조립·allocator·선형 해법·출력 비용과 최종
|
||||
100초 목표는 이 보조 값으로 판단하지 않는다. 실제 production의 Constant/Jet
|
||||
allocation 빈도 감소는 최종 VTune에서 확인해야 한다.
|
||||
|
||||
Standalone include의 vendor C4819 경고는 보존했다. 실제 production과 같은
|
||||
`/W4 /WX /external:W0`로 compile/link만 추가 실행하여 native 0/경고 없음이고
|
||||
수치 타이밍은 반복하지 않았다. 측정된 exe는 별도 원본 copy로 보존했으며
|
||||
추가 exe의 `.text` SHA-256이 동일한 것을 확인했다.
|
||||
[기계어/실행 파일 보존 기록](../../.harness/performance/t4/micro-warning-policy-text-comparison.json)을 따른다.
|
||||
전체 Debug·원본 비교·C08 current grid·VTune 최종 수집·공식 단일 시간 측정은
|
||||
이 단계에서 실행하지 않았다. 변경되지 않은 reference와 tolerance를 사용해야 한다.
|
||||
|
||||
## f9 고정 source 후속 SW 프로파일 및 metric/coverage 수정
|
||||
|
||||
f9e0df66dc9ab04e6a3e295e7ade1df6add15193 source의 Release CLI target 빌드 native0,2.210초. 기존 동일 source의 fresh MSVC Release LIB 디렉터리에 정식 fesa_cli target만 --parallel4 빌드했으며 다른 source object를 복사하지 않았다. parent `.harness/performance/t4/cli-build-native.json`, `cli-runtime-hashes.json` 및 `f9-shell-sw-150s/frozen-profile-source.json`에 실제 argv/settings/source/CLI/DLL/PDB hash를 고정했다.
|
||||
|
||||
동일 원본 input SHA B8922243CA8DDFE20B1DD39F3123207F789A1A75F6B10DBB6B0BC0B5A40DFFF5를 scratch에 복사해 SW hotspots150초를 1회 수집했다. Collector native4는 제한 수집의 partial 종료이며 target native exit는 미확인이다. Collector 총171.409초, watchdog240초 미발동, ownedtarget18316 종료 및 remaining_targets=[] 확인. 원본/scratch 입력 hash 유지. summary/functions/callstacks export는 각각 native0이다. 수집 자료는 parent `.harness/performance/t4/f9-shell-sw-150s/`에 보존한다.
|
||||
|
||||
VTune summary elapsed149.866초/CPU466.466초. Self CPU: shell Jet*85.260초, iomp64.371초, MKL dgemm40.878초, PARDISO kernel31.029초, malloc24.373초, shell Jet+23.937초, inertia Jet*23.821초, errchk_dgemm12.305초, MultiplyTransposeRight8.105초. Callstack inclusive attribution은 EvaluateAssembly240.854초, EvaluateConstraintOperators78.270초, EvaluateInternalResidualAndTangent254.027초, MultiplyTransposeRight86.911초, CheckGraphRegularity2.386초다. Inclusive 값은 서로 겹치며 합산하거나 벽시계로 사용하지 않는다. 작은 MKL dispatch 비용과 내부 constraint 재평가 비용은 후속 후보의 근거다. Sample에는 constant operand/proven-zero derivative 여부가 없으므로 영도함수 생략의 실제 비중은 미확인이다.
|
||||
|
||||
150초 구간 마지막 accepted increment1/time0.1/iteration3이다. 기존150초 baseline은 increment2/time0.2였으므로 현재 후보를 전체 성능 개선이나100초 합격으로 기록하지 않는다. f9 source의 증거는 이후 수정에 소급하지 않는다. Callstack parser 최초 PowerShell 시도는 blank separator row에서 numeric parse 오류로 중단했고, 명시적 blank delimiter를 처리하는 `attribute-callpaths.py` native0 결과를 사용한다.
|
||||
|
||||
프로파일을 고정한 뒤 root85ae2eb를 병합한 source2853051896091ca0e612c95a65a442f48a8e5558에서 후속 수정했다. 공통 high+low finite classifier와 생성 build ignore를 동기화했으며 공통 public API/flags 변경은 없다. 해당 공통 수정의 독립 검증은 root evidence 소유다.
|
||||
|
||||
추가 독립 검토는 metric GEMV의 overflow 반례를 발견했다. M=DBL_MAX, epsilon=2^-26, t=sqrt(1-epsilon^2), n=(epsilon,0.6t,0.8t), B=[[0,M,M],[M,0,0],[M,0,0]]에서 기존 ordered (n_i*B_ij)*n_j 합은 finite positive지만 B*n의 첫 성분은 overflow한다. `HhtReducedOperators.NullMetricKeepsFiniteLeftAssociatedProducts`를 먼저 추가해 실제 RED(native8/1failed), 이후 GREEN(native0/1PASS)를 확인했다. PSD 가정을 새로 추가하거나 accepted metric 범위를 좁히지 않는다.
|
||||
|
||||
두 metric caller(CheckGraphRegularity/CheckRegularity)는 analysis-private `OrderedNullMetric`으로9entry MKL diagonal product를 두 번 계산하고 기존 i/j 순서로 누적한다. 첫 product가 nonfinite이면 원래 두 번째 product도 nonfinite이며 최종 양의 finite gate를 통과할 수 없으므로 caller의 기존 진단 위치로 NaN을 반환한다. Source nonfinite도 같은 caller gate로 반환한다. 실제 원래 assertion/failure category/condition2^-32/scale/diagnostic order를 유지한다. 불필요해진 SparseEntry만 제거했다.
|
||||
|
||||
EvaluateAssembly의 hidden_second는 인접 shell 조립 Hessian map의 일반 bilinear action이다. node map 크기를24로 제한하지 않고 map 순서대로 H_ij*v_i 및 결과*v_j를 MKL diagonal batch 두 번 계산한 뒤 기존 hidden_second/abs-scale 순서로 누적한다. mass residual scale의24x24 m(row,col)*a[col]도 MKL diagonal entry batch로 계산한 뒤 기존 row/column abs 누적 순서를 유지한다. 이 두 일반 product를 fixed3 또는 AD 예외로 묶지 않는다. Private EntryProducts는 finite pair만 backend에 전달하고 invalid/intermediate entries는 NaN으로 유지하여 원래 mass/hidden finite gate에서 실패하게 한다. Failed/partial candidate를 유효 state로 공개하지 않는다.
|
||||
|
||||
수정 첫 build는 mass_action pack을 잘못된 첫 Gather(a) 위치에 삽입해 native2로 실패했다. 실패 source patch와 native/log는 parent `metric-green-build-failed.patch`, `metric-green-native.json`에 보존했다. Correct ordered assembly 위치로 옮긴 frozen source `metric-coverage-source.json`에서 정식 Debug build native0/6edges, 반례 GREEN native0, 관련 short106/106 PASS(native0/36.02초)를 확인했다. Actual Ninja deps에 hht_dynamic_internal.h와 dense_blas_internal.h가 포함된다. Test106은 mixed-time fixture를 제외하며 최종 전체 Debug/CTest/reference/C08/전체 모델 검증은 여전히 T5 미실행이다. 이 수정은 후속 DGER/constant/reuse source와 분리하며 독립 source 검토를 추가로 받는다.
|
||||
|
||||
## MKL DGER rank1 후보와 현재 실제 검증
|
||||
|
||||
고정 f9 profile의 GEMM/dispatch self CPU 비용을 근거로 private OuterProduct만 checked row-major cblas_dger로 전환했다. 일반 MultiplyTransposeRight GEMM, public API/vendor 경계, local TLS scope와 AD coefficient/scaled-left/누적식은 유지한다. ILP64/byte-count/empty/null 및 양 입력 전체 finite validation 성공 뒤에만 destination 전체를+0 fill하고 alpha1/inc1/lda=columns GER를 수행한다. Finite input overflow는 원래 owner gate에 남긴다. 실제 gradient/scaled-left와 fresh result/temporary output의 nonalias 수명 계약을 유지한다.
|
||||
|
||||
최초 새 strict-bit 반증 fixture는 실제108중107 PASS/1failed(native8), 이후 좁은 진단도native8이었다. 36entry 중10개는 GEMM -0(bits0x8000000000000000)→GER +0뿐이며 이 제한 fixture에서 비영/subnormal/overflow 결과 차이는 없었다. 그때의 source, binary hash와 실패 로그는 parent dger-failed-source.patch/dger-failed-delivery.json/dger-diagnostic-delivery.json에 보존한다. 이번 성공을 과거 실패 자료에 소급하지 않는다.
|
||||
|
||||
추가 독립 `source-numerical-review-dger-zero-sign.md`는 현재 Hessian/DrillingEnergy의 영 부호 차이가 value·first·mixed 식, finite/실패, +0 초기 ordered map/COO/global CSR 및 공개 HDF5 의미를 바꾸지 않는다는 source 근거를 확인했다. 일반 GEMM kernel의 영 부호를 새 규칙으로 대체하는 sign-xor 복원은 만들지 않았다. Root 승인에 따라 owner가 이번에 작성한 반증 fixture만 실제 ordinary Hessian 계약과 구분해 비영 strict bits, 양쪽 numeric zero 값 동등 및 zero-sign 차이 명시 기록으로 조정했다. 기존 PRD/TOLERANCE·physics·pair arithmetic 기대값은 변경하지 않았다.
|
||||
|
||||
Current dger-contract-source.json manifestSHA7519444546C57A81F787DFCD21230081A093B02299B43DE8C60E571FA04405B4는 source2파일 및 fixture3파일을 고정한다. Production source SHA77748F73D8F4EECF40D658FC930016A7A6A3E640FE8BC3C055178266C8229E3D는 strict-bit 실패 당시와 동일하다. 정식 Debug rebuild native0와 관련109+기존serial/TBB/repeat 결정론1을 합친 **actual110/110 PASS(native0/98.21초)**를 확인했다. Successful CTest output도 dger-contract-ctest-last.log에 보존한다. Actual6x6 zero-sign 차이10, actual24x24 차이65를 기록했고 비영 strict bits·입력 bits·rounding/MXCSR control mode 검사는 통과했다. Sticky arithmetic exception status는 원래 연산도 발생시키므로 control mode와 구분한다.
|
||||
|
||||
동일 current source Release library 정식10edges build0, 생산 warning policy /W4 /WX /externalW0 standalone compile0, micro native0이다. 오래된 object/library를 복사하지 않고 actual production TU와 동일 source library를 링크했다. Frozen8c original, frozenf9 GEMM shadow route, current DGER를 동일 TU에서 비교한다. f9 Jet 계수/storage/연산식은 source span 그대로이며 OuterProduct 호출1곳만 변경되지 않은 checked MultiplyTransposeRight(inner1) GEMM wrapper로 명시적 shadow routing한다. 이 helper fixture는 전체 f9 executable 재현이 아니다.
|
||||
|
||||
3000iterations 각0warmup/1batch 측정 결과(seconds): original0.0025600, f9GEMMdefault0.0043713, DGERdefault0.0031520, f9GEMMscope1 0.0029526, DGERscope1 0.0030267. 같은 checksum32.759844928979874, 모든 coefficient 일치/TLS 복원 확인. DGER default는 f9 default보다 약27.9% 짧지만 실제 production local scope1에서는 약2.5% 길고 original보다 약18.2% 길다. **현재 production scope 비용 개선을 입증하지 못했다.** 단일 짧은 batch의 결과를 전체 모델 성능이나100초 합격으로 사용하지 않는다.
|
||||
|
||||
Timing 밖 actual Jet14cases 모두 PASS: signed-zero Constant value, seeded Variable mixed, Constant×seed, Compose mixed-third, thirdInf 실패, Sqrt0 실패, Atan2 seeded mixed, +/-0 value branch, zero/zero 실패, x2^300/y0 radius_fourthInf 수용, tiny-radius underflow 실패, zero×Infmixed 실패, allocated-zero copy. Value/first/directional/mixed 영 부호와 비영 bits는 strict 비교하고 Hessian의 양쪽 numeric zero만 허용했다. NaN payload는 결과 계약이 아니므로 양쪽 NaN 및 IsFinite 거부를 비교한다. 14case의 Hessian zero-sign 차이 수는 모두0이었다. 이 좁은 fixture는 모든 Compose/Atan2 입력·환경을 보증하지 않는다.
|
||||
|
||||
Actual source/lib/exe hash 및 native argv는 parent dger-contract-native.json/dger-contract-built-hashes.json에 보존한다. Release library SHA FA4F911DEB913EAA8042A28CAA42CDADE13F5AD85715C75C537EB63F2D9DAFCA, micro exe SHA BF6DC244E6C1653F632C90ED2BCCA3DDAAB25CA9C59BBAB351336F50CC901579. 전체 shell 목표, 후속 whole-model VTune/reference/C08/최종전체Debug는 미검증이다. DGER source와 검사는 Constant specialization/reuse source와 분리하여 고정한다.
|
||||
|
||||
### DGER 미채택 및 GEMM 복원
|
||||
|
||||
Root는 실제 production local thread1 scope에서 개선 근거가 없으므로 DGER를 채택하지 않기로 결정했다. 위110 PASS 및14 Jet 행동/단일 kernel 자료는 실험 source11af92809a674567262c51c0c0f2e7e130241ca7의 기록이며 현재 복원 source의 새 실행 결과가 아니다. 기본 thread 설정에서의27.9% 감소를 실제 production scope1의2.5% 증가와 바꾸어 주장하지 않는다.
|
||||
|
||||
Working/index에 다른 변경이 없음을 확인하고 T4가 소유한 dense_blas_internal.cpp와 dense_blas_internal_test.cpp만 c58d499727e2370cb405c96decea0efcb2645bea의 checked GEMM 상태로 복원했다. 새 GEMM 대 GEMM 비교로만 남는 DGER 실험 검사도 제거했으며 기존 c58 검사/MKL 적용/TLS 정책은 유지한다. 검증된 DGER 원문은 parent dger-verified-dense_blas_internal.cpp/dger-verified-dense_blas_internal_test.cpp, 실험 commit/manifest/micro/review/native8 실패·진단·native0 행동 자료와 함께 보존한다. 복원 후 전체검사/micro를 반복하지 않았다. 실제 복원 file hash는 parent dger-gemm-restored-source.json에 기록한다. 다음 변경은 프로파일 근거의 Constant provenance 및 정확한 true-trial 재사용이며100초 목표는 계속 미달이다.
|
||||
|
||||
## Constant provenance 및 immutable zero Hessian 후보
|
||||
|
||||
DGER 미채택/GEMM 복원8bfe97dbf82b37a264109fe03028300600b63d1b 이후 nonlinear_mitc4_shell.cpp만 수정했다. 고정 production SHA DABB5423A43A8AA439C50272C4CED40607FC189C67E03A9BC498559BA94F64DC, parent constant-source.json SHA0FDFE9A18ED5BECF3E1DA7A4F1420BADD9B22340EAC9A159550ABC96D5778E37. Direct derivative 쓰기와 수명 근거는 constant-write-audit.md, 조건부 이론 검토는 constant-specialization-proof.md, 현재 source-only/current Jet caller 독립 PASS는 source-numerical-review-constant.md에 보존한다. 결과를 전체 모델/성능 PASS로 확대하지 않는다.
|
||||
|
||||
Anonymous Jet의 derivative-zero provenance는 기본false이며 Constant만true로 시작하고 Variable은 seed 쓰기 전에false로 만든다. 연산 결과에서는 원래 식과 실제 finite 계수로 증명될 때만 전파한다. Null Hessian은 Variable도 가지므로 상수 판정으로 사용하지 않는다. 별도 IsImplicitZero는 immutable zero storage의 사실만 나타낸다. +/−의 양 implicit H 및 finite scalar×implicit H에는 독립 H=0 lemma를 사용하며 first/directional/mixed 식은 그대로 계산한다. ScalarInf/NaN은 원래 H576 경로로 보내0 곱의 기존 실패를 유지한다.
|
||||
|
||||
Jet 곱의 known-zero outer는 finite lhs/rhs/result value와 상대 gradient 전체 finite를 확인한 proven Constant 경로에서만 생략한다. 일반 비영24outer는 기존 checked MKL GEMM이다. 필요한 H 항은 원래 left association을 유지하며 양쪽 implicit H일 때만 H576 전체를 생략한다. Compose는 실제 first/second/third 및 input/result value finite를 모두 요구한다. Atan2는 actual Cartesian 계수와 양 provenance로 H영을 증명하지만 std::atan2 value/first/bounded ratio/Reciprocal/Compose/directional/mixed 원래 식과 실패 경로는 계속 계산한다. radius_fourthInf 자체를 새 gate로 사용하지 않는다.
|
||||
|
||||
입력 또는 기존 allocated alias를 결과로 반환하지 않고 fresh Jet를 만든다. Allocated H의 기존 shared copy/첫 mutable write alias는 유지한다. 알려진 영 결과는 immutable zero를 읽는 readonly copy로 사용할 수 있으며 현재 생산 consumer는 그 결과에 raw derivative를 나중에 쓰는 경로가 없다. 모든 직접 Jet derivative 생산자는 기본false fresh 결과 또는 Variable seed에서 시작하며 true 전파는 쓰기 완료 후 증명한다. 값·분기·finite/진단·공개 결과에 영향이 없는 현재 raw H의 numeric zero 범위만 다루고 pair/canonical-zero 기준과 전역 flags/thread policy는 변경하지 않는다.
|
||||
|
||||
실제 corrected-prefix Debug 정식5edges build0, Ninja dependency 양수/private math header 확인, /Od /Ob0 /RTC1 /MDd /W4 /WX production TU oracle compile0, frozen33-case oracle native0를 확인했다. Value/first/directional/mixed 영 부호와 비영 bits는 strict, H의 양쪽 numeric zero만 부호 차이를 기록하며 NaN은 같은 failure 분류와 owner IsFinite 거부를 검증했다. Constant/seed/default-false unknown, finite·Inf·NaN scalar, Compose first/second/third 각각Inf/NaN, Sqrt0, Atan2 branch/singular/extreme scale, mixed-third, nonfinite gradient/H, allocated alias와 readonly zero-result copy chain을 반증했다. 33사례의 기록된 H zero-sign 차이는 모두0이며 provenance/alias 조건도 통과했다.
|
||||
|
||||
관련 shell residual/tangent/objectivity/patch, hidden graph/finite/initial Newton/기존serial-TBB-repeat 결정론 필터는 **actual53/53 PASS(native0/71.98초)**이다. 기존 serial/TBB fixture57.46초도 별도 기록했지만 이는 전체 모델 성능 기준이 아니다. 실행 source/컴파일 환경/argv/thread/native 및 모든 hash는 parent constant-debug-native.json/constant-debug-built-hashes.json/constant-debug-delivery.json에 보존한다. Debug library SHA25632077F5A27A0216E4EB8E9F785F88D70B5FF37FAE02127430DE3D40C18814, probe exeBA299678CF250BBEEF78A7E095C503315277A354938B67B0BAA80BA455D0EC0E, unit exe23DAFC468C20211D9B1CDD60365F448B76E33BDC5EE3478A80CF4DCEE27D090D.
|
||||
|
||||
현재 후보의 Release 비용·전체 shell 실행·현재 mixed-time·최종 전체Debug/C08/reference는 미실행이다. 과거 packed-mixed의 actual CTest61.25초/native61.4626626초 자료는 별도로 보존하며 이전60.69 표기를 이 source의 실행 시간으로 재사용하지 않는다. 시간 수치를 맞추기 위한 반복도 하지 않았다. 다음 단계의 원본 shell150초 안전 제한 개발 실행도 partial 진행을 시간 개선 비율이나100초 합격으로 바꾸지 않는다.
|
||||
|
||||
## Constant 고정 source의150초 안전 제한 개발 실행
|
||||
|
||||
Source commit c397a147b0e885384da8dee81ef645b9d0b17adb에서 corrected-prefix cl Release fesa_cli 정식4edges build native0/3.9286466초를 확인했다. 기존 T3 probe와 현재 scripts/performance/measure.py의 run_once/timeout/cleanup/precheck 계약을 재사용했으며 새 측정 framework를 만들지 않았다. parent PATH를 원시 파일 constant-shell-parent-path.txt에 저장하고 uv launcher의 일시 PATH와 분리했다. Target은 원시 parent PATH와 외부 MKL/OMP8threads, dynamic FALSE를 상속했다.
|
||||
|
||||
원본 byte-identical scratch input에서0warmup/1회 개발 전체 실행을 수행했고150초 안전 제한으로 중단됐다. Actual target elapsed150.09139460000006초, execution_state=timed-out/native1/execution_valid=false다. Wrapper의 metadata 수집을 포함한 외부 경과156.3597352초는 target elapsed와 구분한다. 마지막 accepted increment2/time0.2/iteration3이며 이 부분 진행을 시간 개선 비율/전체 모델 완료/100초 합격으로 사용하지 않는다. 입력 원본과 scratch hash는 동일하고 source/header/exe/DLL/build/thread/power/runtime identity 전후 unchanged=true다. 관련 fesa/VTune/cl process0 확인 후 CPU 토큰을 반환했다.
|
||||
|
||||
Release exe SHA7d3c48351a8b76dbc5274468fc9f205386d28521cde79633dcd970a861321143. Build/native/parent PATH, environment/identity 전후 및 timer facts는 parent constant-shell-native.json/development-constant-shell-before.json/development-constant-shell-after.json/development-constant-shell.json과 해당 run-1/native.json/run.json/stdout/solver log에 보존한다. 최종 HDF5가 없어서 reader/precheck와 blocking U comparator 및 UR warning 비교는 모두 미실행이다. 729node/101frame/schema2 또는 required reference PASS로 표시하지 않는다. 기존 원본이나 최종 H5를 수정하지 않고 현재 partial 파일과 timeout 자료를 보존했다. 추가 micro/profile/whole-run 반복은 하지 않았다.
|
||||
|
||||
다음 우선 후보는 profile에서 큰 EvaluateAssembly/EvaluateConstraintOperators 중복을 줄이는 exact true-trial internal constraint subset 재사용이다. False 위치/root 경로 및 external force/rate/acceleration primitive는 유지한다. 구체 context/q/v/direction/request/gate/lifetime 계획과 최소 private friend 범위를 먼저 검토한다. Node-local support6 AD는 support/비용 근거가 충분해진 경우의 비교 후보이며 현재 구현 범위를 확대하지 않는다.
|
||||
|
||||
## 완성된 true trial의 내부 constraint 자료 재사용
|
||||
|
||||
이 후보는 기존 SW profile의 Assembly/ConstraintOperators 중복 경로를 근거로 한다.
|
||||
완성된 true assembly가 이미 계산한 constraint value4, gradient4×24, Hessian24×24
|
||||
4개와 방향3차 gradient24 4개만 trial-owned optional에 보관한다. 기존 internal,
|
||||
inertia, ordered external/recovery/finite/CSR/hidden-gradient gate가 모두 성공한
|
||||
마지막 위치에서 기존 자료를 move한다. False와 initial frame은 저장하지 않는다.
|
||||
Accepted frame, reduced history, HDF5에는 이 자료가 붙지 않아 증분마다 누적되는
|
||||
구조가 아니다. 기존 Matrix/Vector deep-copy와 move 수명을 사용한다.
|
||||
|
||||
소비자는 기존 inventory/null/transverse/node-row gate 뒤의 원래 internal 평가
|
||||
자리에서만 재사용을 확인한다. 구성64개 값과 source identity, element/scatter,
|
||||
node IDs, q/v, time/frame/increment/iteration 및 directional 요청이 일치해야 한다.
|
||||
현재/저장 q/v·구성·time은 finite 확인 뒤 representation 비교하여 ±0도 구별한다.
|
||||
Worker 평가 전후와 소비 thread의 masked FP control 및 기존 scope 내부 BLAS1,
|
||||
dynamic0이 안정적인 현재 Intel-thread 빌드에 한정한다. Private metadata getter는
|
||||
전역 policy를 바꾸지 않고 기존 caller TLS를 원복한다. 불일치/비유한/불명확 key,
|
||||
shape/payload 오류는 그 자리의 원래 full 평가와 Status로 돌아간다. 외부 force,
|
||||
rate/acceleration primitive, 누적 순서, physics/gates/diagnostic은 그대로 수행한다.
|
||||
|
||||
Private element configuration header와 public header의 forward/private friend만
|
||||
추가했다. Element가 analysis에 의존하지 않고 vendor 타입을 public에 노출하지 않는다.
|
||||
Density는 내부 네 자료의 함수/energy 입력이 아니고 inertia는 매번 평가하므로 키에서
|
||||
제외한다. 약13.59MiB는676 shell의 payload 일부 산술 추정이며 객체/allocator/source
|
||||
문자열/추가 metadata 및 실제 peak 메모리 실측을 포함하는 상한이 아니다.
|
||||
|
||||
독립 source 검토는 최초 bit-only key가 동일 NaN/Inf current+saved key를 수용해
|
||||
원래 실패를 생략할 수 있음을 발견했다(needs-fix). 해당 자료와 manifest를 보존한 뒤
|
||||
finite key miss를 추가하여 재검토 PASS를 받았다. Source-derived 반례의 native RED는
|
||||
미실행이며 실제 RED 관측이라고 기록하지 않는다. 최초 Debug build는 새 raw 자료
|
||||
fixture의 Vector3 read-only component 대입 오류로 cmake native2/외부 PowerShell1,
|
||||
13.2472474초에 실패했다. 원래 세 좌표를 생성자로 대입하는 test-only 수정으로
|
||||
production hash를 유지했고 실패 로그/native/source 자료도 보존했다.
|
||||
|
||||
수정 source manifest C4EBD4169D44918E56DECDB0AB1D4AAFABDBA866612874C788DD883CF460C266에서
|
||||
정식 Debug 재빌드7 edges native0/6.30초, 새 cache/getter6/6 PASS(native0,
|
||||
CTest11.04초/native11.08초), 기존 reduced/initial Newton27/27 PASS(native0,
|
||||
CTest6.40초/native6.43초)를 확인했다. 실제 CTest 합33개이며 기존 Constant의33-case
|
||||
oracle와 다른 수다. Jet 수식/저장/provenance와 기존 element scope body는 바뀌지
|
||||
않아 그 oracle는 이번 슬롯에서 반복하지 않았다. Raw 네 자료/forced-fresh의 strict
|
||||
bits, deep copy/move, actual FP/TLS/dynamic miss, serial/TBB, 외부 rates, 동일
|
||||
NaN/±Inf q/v key의 실패 진단 전필드와 비유한 time의 fresh 성공을 검사했다.
|
||||
|
||||
Corrected-prefix 실제 Ninja deps는 assembly41/reduced operators42/shell26이며
|
||||
모두 새 private configuration header를 포함한다. Library SHA
|
||||
5108045D88A2439E57934B8D66317DE1B545AFE122BFCF082D60DDB732D20DFE,
|
||||
unit SHA CF6D180565FCFDF5AD19EEA26EF627A38C5C8603AE331607031411828700F8BD다.
|
||||
Parent artifact의 true-trial-source-vector3.json/patch,
|
||||
true-trial-vector3-debug-native.json/built-hashes.json 및 단계별 로그에 실제
|
||||
source/compiler/argv/cwd/native/deps/thread/hook을 보존했다. Source10 hash 일치와
|
||||
관련 프로세스0 확인 후 CPU를 반환했다.
|
||||
|
||||
현재 cache 후보의 Release/원본 shell 실행/실제 call 감소/비용 및 전체 Debug,
|
||||
reference/C08/최종100초 합격은 미실행이다. 부분 실행 자료나 이전 source의 PASS를
|
||||
이 후보의 전체 성능·물리 검증 완료로 바꾸지 않는다. 다음 bounded 개발 실행은
|
||||
0warmup/1회만 수행하고 결과에 따라 다음 최소 후보를 검토한다.
|
||||
|
||||
## 재사용 source0e5의 단일 bounded 개발 실행
|
||||
|
||||
0e5b3e05ddc89d9af18a34ca31e8c9de10d43723에서 corrected-prefix cl Release CLI
|
||||
21 edges build native0/22.0809183초를 확인했다. 원본 shell byte-identical scratch를
|
||||
워밍업 없이1회 실행했으며150초 안전 제한에서 중단됐다. Target 경과는
|
||||
150.20568999999523초, timed-out/native1/execution_valid=false이고 wrapper의 환경
|
||||
수집 포함156.7173998초와 구별한다. 마지막 accepted increment2/time0.2/iteration3,
|
||||
최종 HDF5 없음으로 reader/precheck 및 blocking U/UR 비교는 미실행이다.
|
||||
|
||||
원본/scratch SHA B8922243CA8DDFE20B1DD39F3123207F789A1A75F6B10DBB6B0BC0B5A40DFFF5,
|
||||
exe SHA113f700303c70c9f1a0be6da0bfd38df640a06a112fa02acf394b55c8bff07b2다.
|
||||
Source/header/exe/DLL/cache/thread/power identity 전후 unchanged=true이고 raw parent
|
||||
PATH를 uv의 일시 PATH와 분리했다. 실제 native/명령/환경/identity 및 부분 stdout/log는
|
||||
parent true-trial-shell-native.json, development-true-trial-shell-before/after.json,
|
||||
development-true-trial-shell.json과 해당 run-1 자료에 보존했다. 관련 프로세스0 확인
|
||||
뒤 CPU를 반환했다. 재실행하거나 부분 진행에서 개선 비율을 계산하지 않았다.
|
||||
|
||||
이 실행은0e5 source이며 이후 root 공통 header/AVX 통합 consumer 검증을 대신하지
|
||||
않는다. Cache 실제 lookup/hit/miss를 계측하지 않아 unit marker PASS 또는 accepted
|
||||
진행만으로 원본에서 실제 hit/call 감소가 발생했다고 주장하지 않는다. Source 추적상
|
||||
true assembly부터 소비까지 owner/q/v/frame key가 체계적으로 변하는 경로는 없지만
|
||||
worker/consumer FP·policy 일치는 실제 출력이 없다. 별도 diagnostic-only 최소 probe
|
||||
계획은 parent true-trial-production-hit-trace.md에 기록했다. 명시적인 local Constant0
|
||||
builder seed 후보는 explicit-zero-seed-read-plan.md의 읽기 계획이며 아직 구현하거나
|
||||
실행하지 않았다. 전체 shell100초 목표는 미달이며 최종 전체/reference 검증도 남아 있다.
|
||||
|
||||
## 명시적인 local 영 seed의 provenance 보존
|
||||
|
||||
Identity의6 offdiagonal, Skew의3 diagonal과 Matrix×Matrix/Matrix×Vector Multiply의
|
||||
9/3 ordered accumulator만 Constant(0.0)으로 초기화했다. 세 matrix builder는 private
|
||||
ConstantZeroMatrix를 공유하고 vector는 세 fresh Constant0을 사용한다. 기존 product/
|
||||
add 순서와 호출, Default Jet/Variable false, ExpSkew increment identity, 다른 seed/
|
||||
direct derivative write, ordinary MKL, API/precision/physics/gates/진단은 유지한다.
|
||||
수정은 nonlinear_mitc4_shell.cpp의12삽입4삭제다.
|
||||
|
||||
이 seed는 실제 정의된 numeric +0/영 도함수/null H에만 true provenance를 부여한다.
|
||||
기존 Constant guard가 finite value/coeff/gradient와 implicit/allocated H를 구별하므로
|
||||
Inf/NaN×0 또는 singular Compose/Atan2 실패를 지우지 않는다. 입력 allocated alias는
|
||||
유지하고 fresh zero가 입력 alias를 반환하지 않는다. 후속 allocated-zero가 implicit
|
||||
zero가 될 수 있어 arbitrary private Jet copy/write의 alias 동등성까지 주장하지 않는다.
|
||||
현재 readonly derivative 소비자와 승인된 H numeric0 부호 의미에 한정한다.
|
||||
|
||||
독립 actual source 검토 PASS를 받은 고정 manifest
|
||||
700068D3C55DD5633BE51D3D0DD15562763E1788C9A4CADA667BD4ACA822E484에서
|
||||
corrected-prefix Debug3 edges build native0/2.90초, 실제 shell header deps26을 확인했다.
|
||||
Actual production TU의 builder15+기존 frozen Jet33 oracle가 native0/0.08초로 통과했고
|
||||
H 영 부호 차이0이었다. Frozen0e5 전체 TU와 current 전체 TU의7 실제 응답·실패·재실행
|
||||
probe도 각각 native0(0.40/0.39초)이며20,126개 record의 identity/비영/diagnostic과
|
||||
H numeric0 부호까지 동일했다. Raw 출력 두 SHA는
|
||||
04153B2088E5C87FDBF043659028DBD17114C72775BEA59B984EEBB554163D5F다.
|
||||
|
||||
이 비교는 frozen TU를 별도 fresh compile하고 동일한 변경 없는 header/common library
|
||||
의존성에 연결한 callback oracle다. Frozen object를 복사하거나 전체 solver의 혼합
|
||||
source PASS로 사용하지 않는다. Frozen TU SHA8794F4D6D5C8F6988064F4651BABF0680525B86EDB5AC2120BFB4F94B4F2EF44,
|
||||
current TU SHA74BC4079C9FFDB4083F9A63CAE56493A8D1F207BE2984919B04815C981AA7A03과
|
||||
실제 compiler/argv/native/library/driver/binary/output hash를 parent
|
||||
zero-seed-source.json/zero-seed-debug-native.json/zero-seed-debug-built-hashes.json에
|
||||
보존했다. Related CTest57/57도 native0(CTest24.06초/native24.10초)이다.
|
||||
|
||||
마지막 wrapper hash 수집은 잘못 복제한 jet-zero-seed-debug.exe 이름 때문에 외부
|
||||
PowerShell1로 끝났다. 실제 native 명령10개는 모두0이었고 실제 파일 zero-seed-debug.exe
|
||||
및 frozen/current probe hash만 다시 수집했다(metadata-only native0, 검사 재실행 없음).
|
||||
오류 기록과 원래 wrapper는 별도로 보존했다. Production1/dependency9/oracle8 hash
|
||||
일치와 관련 프로세스0을 확인하고 CPU를 반환했다.
|
||||
|
||||
Library SHA E6B0B4DD96093F1568A4A783E004EC7C205C33550413CD1262B7EA59A49926B2,
|
||||
unit SHA5725E2E82B4A0AF530F68D9D9BF3ADF685C27CADF6A0F2B106A35A48147360C4다.
|
||||
이번 source의 Release/whole-model/profile/절약률/전체 Debug/reference/C08는 미실행이며
|
||||
전체 shell100초 목표를 통과한 것으로 표시하지 않는다. 다음 계측은 원본에서 cache
|
||||
실제 경로와 새 병목을 함께 확인하는 최소 SW VTune 계획으로 별도 결정한다.
|
||||
|
||||
## 명시 영 seed 이후 실제 SW60 수집
|
||||
|
||||
고정727c3566 source에서 corrected-prefix Release CLI build가 native0/4.0366496초로
|
||||
완료됐다. Exe SHA92EC5020E264740734A15DD8C2D4FED678145C597BFD183C1DF5811574CE1C2E와
|
||||
production/dependency/header/runtime/input/실제 parent PATH를 parent artifact에 고정했다.
|
||||
Counter patch 없이 원본 입력의 byte-identical scratch를 SW sampling60초로 한 번 수집했다.
|
||||
Collector native4/외부 wrapper1, target native null(미관측)을 구분한다. Finalization 포함
|
||||
경과72.9034519초이며150초 watchdog은 발동하지 않았다. 마지막 accepted increment1/
|
||||
time0.1/iteration3으로 부분 진행이며 cleanup과 export 뒤 관련 프로세스0을 확인했다.
|
||||
세 export는 모두 native0이다. 완주·최종 HDF5 comparator·시간 합격은 미실행이다.
|
||||
|
||||
Summary 계측 elapsed59.857초/sampled CPU233.409초 중 shell Jet×Jet32.415138초,
|
||||
shell Jet+13.549840초, inertia Jet×Jet17.184278초, malloc13.295605초,
|
||||
MKL dgemm10.277124초/errchk3.929545초가 관측됐다. IOMP 첫 self42.912887초의
|
||||
대부분은 spin41.472550초였다. Jet 산술·할당과 작은 MKL 호출은 계속 비용 후보이나
|
||||
상수 allocation/576 커널의 정확한 비중은 분리하지 못했다. 이전150초 구간과 비교해
|
||||
개선 비율을 만들거나 spin에 근거해 전역 thread 정책을 변경하지 않는다.
|
||||
|
||||
양수 leaf와 뒤따르는0 ancestor를 결합한 inclusive 경로는 Assembly128.386089초,
|
||||
Internal103.971607초, Operators20.179492초, Embedding84.706977초다. 서로 중첩되므로
|
||||
더하거나 벽시계로 쓰지 않는다. Operators→Internal17.013092초가 전부 embedding에
|
||||
속했고 embedding 밖 Operators1.407365초에서는 Internal 샘플0이었다. 이는 원래
|
||||
false position_operators의 fresh 평가와 부합하고 true 자리의 중복 Internal 샘플이
|
||||
없다는 제한적 정황이다. Lookup/context/getter 이름도 샘플0이므로 정확한 cache hit/
|
||||
miss와 호출 수·절약량을 확인하지 못했다. 샘플 부재를 production hit 보장으로 해석하지 않는다.
|
||||
|
||||
원시 native/summary/functions/callstacks와 inclusive 분류는 parent
|
||||
zero-seed-shell-sw-60s에, 해석·한계는 zero-seed-sw60-findings.md에 보존했다.
|
||||
CPU를 반환했으며 새 전체 실행이나 counter probe는 수행하지 않았다. 이번727c 자료를
|
||||
root 최신 통합 source의 검증으로 소급하지 않는다. 전체 shell100초 목표는 미완료다.
|
||||
|
||||
## 절점 outer 축소 후보의 검증과 보류
|
||||
|
||||
Private shell TU의 unknown/empty/node0..3 tag와 기존 MKL6×6 outer/full24 scatter 후보를
|
||||
검토했다. 고정 manifest01E8FC704A76E6C57A299F84ED6E0A33F6912678A7649F4FBACDE2B75BFFC339,
|
||||
candidate TU SHA C5FDFB11C6BB47F571C09F189C03B550FE32226105BD5C40F8BA7DB3F382A5DE에서
|
||||
독립 actual source-only PASS를 받았다. 기존 scaled24·finite/outside-zero 검사와
|
||||
H576·방향/mixed 계산·storage·할당·수식·gate는 유지했다.
|
||||
|
||||
Corrected-prefix Debug3 edges build native0/3.20초와 actual header deps를 확인했다.
|
||||
기존48 oracle 및 신규 nodal102 사례는 native0이며, frozen727c/current7 response의
|
||||
20,126개 record가 strict comparator에서 같았다. 실제 관련 CTest57/57도 PASS
|
||||
(CTest26.38초/native26.41초)였다. Debug wrapper의10 native와 외부 종료 코드는 모두0이다.
|
||||
신규 nodal oracle의 H numeric-zero 부호 차이306은 직접 outer/H 비교의 합계이며 개별
|
||||
사례별 기여는 출력하지 않았다. Value/first/mixed/directional은 strict bits로 통과했고
|
||||
실제7 response의 raw H 부호 차이는0이었다. 현재 선형 H 조합/finite/!=0 filtering/
|
||||
ordered assembly의 의미에 한정한 독립 검토이며 일반 H bit나 임의 mutable alias의
|
||||
동등성은 주장하지 않는다.
|
||||
|
||||
같은 source의 Release configure/build/probe compile/micro도 모두 native0이다.
|
||||
Scoped1/dynamic0/nearest/FTZ·DAZ off에서 각 variant0 warmup/1 batch/100만 회를 측정했다.
|
||||
원래24 outer wrapper는0.1926542초, 현재6×6와 전체24 검증·576 fill/scatter는0.1898764초였다.
|
||||
약1.44%의 단일 cross-node fixture 차이는 추가 CompletedSupport 검사·unknown 경로 비용·
|
||||
생산 호출 빈도를 포함하지 않아 채택 근거로 부족하다. Hessian576 연산과 allocation도
|
||||
남으므로 전체 shell100초 목표를 달성하는 근거가 아니다. 시간을 맞추기 위한 반복은 하지 않았다.
|
||||
|
||||
Root 결정에 따라 이 후보를 보류하고 병합하지 않았다. Production diff와 raw 후보 TU,
|
||||
oracle/manifest/actual/native/hash/review를 parent ignored artifact에 보존한 후 본인 변경
|
||||
1TU만 HEAD6ad의 source로 복원했다. 복원 SHA74BC4079C9FFDB4083F9A63CAE56493A8D1F207BE2984919B04815C981AA7A03을
|
||||
확인했고 다른 source/CMake/math/public header/reference는 변경하지 않았다. 후보 patch SHA는
|
||||
8B15B222AE0862A958A334DD6BC0C2D852F2CEC8F68AA182C8E10AB1465FE2E7이다.
|
||||
판단·실제 범위는 nodal-outer-actual-results.md와 nodal-outer-held-restoration.json에 보존했다.
|
||||
CPU 반환 직전 T4 검사 프로세스0과 반환 후 T3 실행의 전역 snapshot을 구분하고 T3 프로세스는
|
||||
종료하지 않았다. 보류 후보의 PASS를 복원 source나 최신 root 전체 검증으로 소급하지 않는다.
|
||||
@@ -1,230 +0,0 @@
|
||||
# 계산 성능 기준 측정과 도구 검증
|
||||
|
||||
T1은 production 계산 코드를 변경하지 않고 Release 설정, 외부 측정기와
|
||||
기준 실행·VTune 자료를 준비한다. 최종 전체 Debug 회귀는 T5 책임이다.
|
||||
기준 실행은 승인된 계산 소스 `eaa5cbeb21b231862ed80f89386412232b0571c9`와
|
||||
동일한 production 파일로 수행한다. 시간 목표 초과는 기준자료의 미달로 기록한다.
|
||||
|
||||
## 재현 명령과 소유권
|
||||
|
||||
MSVC x64 Developer PowerShell에서 기존 로컬 GoogleTest/MKL/TBB/HDF5 설정을
|
||||
사용한다. 공용 source에는 개인 경로나 자동 다운로드를 추가하지 않는다.
|
||||
|
||||
```powershell
|
||||
cmake --preset windows-msvc-ninja-release
|
||||
cmake --build --preset windows-msvc-ninja-release --target fesa_cli --parallel 8
|
||||
python scripts/performance/measure.py --exe .harness/build-ninja-msvc-release/src/fesa/fesa.exe --output-dir <새 artifact 디렉터리>
|
||||
```
|
||||
|
||||
Release는 `/O2 /Ob2 /DNDEBUG /Zi`, link는 `/DEBUG /OPT:REF /OPT:ICF`다.
|
||||
기존 Debug preset과 개인 config를 유지한다. 측정기만 단조 증가 시계와 native
|
||||
프로세스·raw 실행 기록을 소유한다. 각 입력을 독립 디렉터리에 byte-copy하고
|
||||
프로세스 시작 직전부터 종료 확인 직후까지 측정한다. 복사와 hash, HDF5 inventory,
|
||||
외부 비교는 타이머 밖이다. timeout은 공식 CLI에서 설정하지 않는다.
|
||||
|
||||
2026-10-14 사용자 승인 PERF-ADR-004에 따라 워밍업 없이 모델별 1회만 측정한다.
|
||||
각 새 결과의 identity·전체 frame·finite precheck를
|
||||
기존 comparator의 reader로 검사한다. Hex8은 기존 schema/row 검사를, shell은
|
||||
729 nodes/101 frames와 schema v2 및 실제 scratch 경로를 검사한다.
|
||||
이 검사는 외부 reference 수치 비교의 통과를 의미하지 않는다.
|
||||
실행 실패·중단·환경/source/binary 변경은 합격을 차단하고 완료된 raw 기록을 남긴다.
|
||||
|
||||
각 run의 `native.json`·`run.json`·로그·새 HDF5를 보존한다.
|
||||
`measurements.json`은 각 행이 완료된 뒤 atomic replace하며 중단된 case나 미시작 case를
|
||||
완료 표본으로 채우지 않는다. 성공한 느린 실행도 제외하지 않는다.
|
||||
측정기 exit 0은 정상 전체 실행·기록 완료, exit 1은 실행/기록 실패,
|
||||
exit 2는 잘못된 CLI다. exit 0은 시간 목표나 외부 비교의 합격이 아니다.
|
||||
|
||||
비교는 각 실제 scratch/result/native로 별도 실행하며 `comparison.json`을 run
|
||||
디렉터리에 둔다. Hex8 명령은 다음 형태다.
|
||||
|
||||
```powershell
|
||||
python scripts/verification/compare_hex8.py --case <case> --input <scratch.inp> --results <new_results.h5> --references reference/hexa --execution-record <native.json> --report <run/comparison.json>
|
||||
python scripts/verification/compare_hht_dynamic.py --input <shell-scratch.inp> --results <new_results.h5> --reference "reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine displacements.csv" --report <run/comparison.json>
|
||||
python scripts/performance/measure.py --output-dir <artifact/measurements> --link-comparisons
|
||||
```
|
||||
|
||||
연결 단계는 input/result/native SHA-256과 raw 경과 시간을 확인한다.
|
||||
Hex8 합격에는 비교기가 검증한 동일 native record hash가 필요하다.
|
||||
Shell의 U blocking/UR warning 정책은 기존 비교기를 그대로 따른다.
|
||||
연결 단계는 raw 시간과 native 기록을 변경하지 않는다. 비교 전 상태는 `pending`이다.
|
||||
|
||||
## 행동 검사
|
||||
|
||||
`uv run --offline --with pytest --with numpy --with h5py python -B -m pytest -q tests/test_performance_measure.py`
|
||||
|
||||
측정기 구현 전 같은 명령 exit 1(`measure.py` 부재)을 확인했다.
|
||||
실제 subprocess와 독립 관측으로 타이머 경계·copy byte 보존·실행 분리·기존
|
||||
출력 충돌·native nonzero/출력 존재·launch failure·입력 mutation·중단/timeout 기록,
|
||||
native 0의 missing/invalid HDF5, 느린 표본 보존과 source/binary 변경 차단을 검사한다.
|
||||
비교 연결은 raw 시간 보존 및 다른 result hash 거부도 검사한다.
|
||||
단일 측정 변경과 독립 검토 수정 전에는 6 FAIL/11 PASS, exit 1을 확인했다.
|
||||
현재 관련 검사는 19 PASS, exit 0이다. 실제 Hex8 HDF5의 NaN/Inf 및 0이 아닌
|
||||
동적 초기 변위를 기존 `check_result_values`로 거부한다. native 종료 뒤 HDF5
|
||||
검사 중 `KeyboardInterrupt`는 native `completed`/exit 0/경과 시간/hash를 보존하고
|
||||
`result_validation_state=interrupted`, `execution_valid=false` 행을 공개한 뒤 exit 1로
|
||||
종료한다. 이전 case의 완료 행도 남는다.
|
||||
native 행 반환 뒤 환경 재검사 중단/실패도 별도로 2 FAIL, exit 1로 재현했다.
|
||||
환경 재검사 전에 현재 행을 먼저 공개하고, `environment_validation_state`가
|
||||
`interrupted|failed`인 행의 실제 native/elapsed/hash를 유지해 exit 1로 종료한다.
|
||||
|
||||
## 현재 기준 자료
|
||||
|
||||
새 공식 단일 기준 자료 위치는 repository root의
|
||||
`.harness/performance/baseline/t1-single-20261014-122548/`다.
|
||||
MSVC 19.51.36252 x64, MKL 2026.1.0, TBB 2023.1, HDF5 2.1.1,
|
||||
VTune 2026.2.0 build 632324를 사용한다. 전원·CPU/OS·실제 cache/flags,
|
||||
dependency DLL hash/version, source commit/dirty, thread 요청은 JSON에 기록한다.
|
||||
MKL/OMP thread 요청은 8, dynamic FALSE다. TBB는 runtime default이며
|
||||
`TBB_NUM_THREADS`를 실제 적용된 cap으로 주장하지 않는다.
|
||||
|
||||
설치된 VTune help를 보존했으며 software sampling은 10ms fixed다.
|
||||
`-collect hotspots -knob sampling-mode=sw -knob enable-stack-collection=true
|
||||
-knob enable-characterization-insights=false -result-dir <profile> -- <exe> <scratch.inp>`를
|
||||
사용한다. characterization 하드웨어 카운터는 끄고 제품 PDB와 동일 Release binary로
|
||||
수집한다. 정적은 full, 두 dynamic은 `-duration 30`의 partial 수집이다.
|
||||
부분 수집은 전체 시간 합격 표본이 아니며 collection 종료의 native/tool 상태를
|
||||
full 실행과 구분한다. raw 결과와 function/callstack CSV를 보존한다.
|
||||
|
||||
VTune raw/function/callstack 자료는 같은 Release binary의 재부팅 전 자료
|
||||
`.harness/performance/baseline/t1-20261014-0845/profiles/`에 보존한다.
|
||||
주요 product 함수와 source는 식별됐다. 일부 vendor 함수는 주소로만 식별되며
|
||||
해당 vendor의 private symbol은 확보하지 않았다. 이 한계와 partial 수집을 구분한다.
|
||||
|
||||
## 이전 프로토콜과 재부팅 이력
|
||||
|
||||
사용자는 장시간 작업 중 PC 중단을 알리고 단일 측정으로 변경했다. 원인은 입증되지
|
||||
않았다. 실제 OS `LastBootUpTime`은 `2026-10-14T09:33:20.5000000+09:00`다.
|
||||
복구 시 fesa/VTune/build/측정 프로세스 조회는 비어 있었다.
|
||||
Win32 전원 조회는 AC line 1, battery flag 128이었다.
|
||||
|
||||
과거 `.harness/performance/baseline/t1-20261014-0845/measurements/measurements.json`은
|
||||
static 워밍업+측정 5개, dynamic 워밍업+측정 4개 완료 행을 보존한다.
|
||||
dynamic 측정 5의 native 종료·경과 시간은 관측되지 않았으며 native record와
|
||||
최종 HDF5가 없다. Shell은 시작하지 않았다. 해당 run의 scratch와 기존 raw 기록을
|
||||
보존하며 부재·현재 hash·재부팅·프로세스 조회를 `recovery-20261014.json`에 기록했다.
|
||||
과거 결과는 공식 단일 판정에 사용하지 않는다.
|
||||
|
||||
과거 frozen reader는 Hex8 schema/identity/frame을 검사했으나 독립 검토에서
|
||||
별도 `check_result_values` 누락과 HDF5 검사 중 중단 행 누락이 발견됐다.
|
||||
두 문제는 위 행동 검사로 재현·수정했다. 과거 elapsed/native 기록을 수정하지 않았고
|
||||
frozen script SHA-256 `34772002e774efe566b5331641285a5dadb2194b10e2c365f90a561ba521ef04`도
|
||||
`build/measure-frozen-baseline.py`로 보존했다. 새 공식 결과는 수정된 검사와 전체
|
||||
기존 comparator를 적용한다.
|
||||
|
||||
## 공식 단일 기준 실행 상태
|
||||
|
||||
독립 conformance 재검토 통과 뒤 준비 commit
|
||||
`bf512d137c8eda8b2bc02ab1330ceba0b8ba678a`에서 모델별 1회만 실행했다.
|
||||
워밍업과 별도 캐시 초기화를 수행하지 않았다. 측정 중 code/doc/gitstatus,
|
||||
binary/DLL/thread/power 환경을 고정했다. 측정기 exit 0이며 각 solver도 실제 exit 0이다.
|
||||
source/schema/frame/finite/초기 상태 및 환경 재검사를 통과했고, 기존 전체 comparator를
|
||||
타이머 밖에서 실행했다. 비교 연결 exit 0이며 raw elapsed/native 기록을 수정하지 않았다.
|
||||
|
||||
| 모델 | 목표 초 | 전체 wall 초 | native | 외부 비교 | 시간 판정 |
|
||||
| --- | ---: | ---: | ---: | --- | --- |
|
||||
| hexa_nonlinearstatic | 2 | 10.914924 | 0 | 전체 U/constrained RF/point S 통과 | 미달 |
|
||||
| hexa_dynnonlinear | 100 | 402.069447 | 0 | 101 frames 전체 U 통과 | 미달 |
|
||||
| shellNL-dyn-meshfine | 100 | 6372.325621 | 0 | 729 nodes/101 frames 확인; 9 nodes U blocking 통과, UR warning 200 entries | 미달 |
|
||||
|
||||
세 comparator의 실제 exit는 각각 0이며 reference/결과의 identity와 finite 검사 뒤
|
||||
기존 row 상대 허용 0.05, relative RMS 0.01, near-zero ratio 0.01을 적용했다.
|
||||
최대 blocking relative RMS는 정적 `9.338900e-6`, 동적 `2.155586e-6`, shell U
|
||||
`0.0022824245`다. UR warning은 기존 정책의 경고이며 회전 정확성 통과로 표시하지 않는다.
|
||||
기준 자료 확보와 수치 비교는 완료됐으나 시간 목표는 세 모델 모두 실패다.
|
||||
baseline 시간 목표는 T1의 진행 차단 조건이 아니며 최적화/최종 전체 검증은 후속 작업이다.
|
||||
|
||||
실제 판정과 run/input/binary/result/native/comparison hash는
|
||||
[공식 measurements.json](../../.harness/performance/baseline/t1-single-20261014-122548/measurements/measurements.json)에
|
||||
연결됐다. `execution_complete`, `comparisons_complete`, `all_comparisons_passed`는 모두 true이고
|
||||
각 `all_measured_runs_within_target`은 false다. `run.json`/`native.json`은 실행 당시 raw 기록,
|
||||
외부 비교의 현재 연결 상태는 최종 aggregate의 각 행이 소유한다.
|
||||
|
||||
- [정적 전체 비교](../../.harness/performance/baseline/t1-single-20261014-122548/measurements/hexa_nonlinearstatic/run-1/comparison.json)
|
||||
- [동적 전체 비교](../../.harness/performance/baseline/t1-single-20261014-122548/measurements/hexa_dynnonlinear/run-1/comparison.json)
|
||||
- [Shell 전체 비교](../../.harness/performance/baseline/t1-single-20261014-122548/measurements/shellNL-dyn-meshfine/run-1/comparison.json)
|
||||
- [실제 comparator 명령·종료·hash](../../.harness/performance/baseline/t1-single-20261014-122548/comparisons-execution.json)
|
||||
|
||||
## VTune 비용과 후속 owner에 넘길 범위
|
||||
|
||||
재부팅 전 같은 binary의 정적 full profile은 `TwoSum` 1.648 CPU 초,
|
||||
`Multiply` 1.055 CPU 초, `LowestBitExponent` 0.615 CPU 초를 관측했다.
|
||||
동적 Hex8 30초 partial은 각각 37.424, 17.042, 22.038 CPU 초와 `ldexp` 19.263 CPU 초를
|
||||
관측했다. high+low/정밀도 의미를 변경할 근거로 사용하지 않는다.
|
||||
|
||||
- [Hex8 정적 함수](../../.harness/performance/baseline/t1-20261014-0845/profiles/hexa_nonlinearstatic-functions.csv) / [호출 stack](../../.harness/performance/baseline/t1-20261014-0845/profiles/hexa_nonlinearstatic-callstacks.csv)
|
||||
- [Hex8 동적 partial 함수](../../.harness/performance/baseline/t1-20261014-0845/profiles/hexa_dynnonlinear-partial-functions.csv) / [호출 stack](../../.harness/performance/baseline/t1-20261014-0845/profiles/hexa_dynnonlinear-partial-callstacks.csv)
|
||||
- [최초 Shell partial 함수](../../.harness/performance/baseline/t1-20261014-0845/profiles/shellNL-dyn-meshfine-partial-functions.csv) / [호출 stack](../../.harness/performance/baseline/t1-20261014-0845/profiles/shellNL-dyn-meshfine-partial-callstacks.csv)
|
||||
- [재부팅 전 collector 상태](../../.harness/performance/baseline/t1-20261014-0845/profiles/collection-execution.json)
|
||||
|
||||
최초 shell 30초 로그는 initial increment 0만 포함했다. 공식 시간 측정과 3개 비교 종료 뒤
|
||||
동일 binary/source/thread 설정에서 sw 150초 partial을 1회 추가했다. 실제 accepted
|
||||
increment 2/time 0.2까지 포함하며 수집 종료 후 target/collector 프로세스가 없었다.
|
||||
VTune collector의 실제 native exit는 4, 함수/stack report의 실제 exit는 각각 0이다.
|
||||
target 자체의 종료 코드는 별도로 관측하지 않아 null이며 정상 전체 해석 표본이 아니다.
|
||||
|
||||
| 150초 partial의 함수/모듈 | sampled CPU 초 | 전체 sampled CPU 비중 |
|
||||
| --- | ---: | ---: |
|
||||
| shell Jet operator* | 133.466 | 27.6% |
|
||||
| libiomp5md 주소 함수 | 70.081 | 14.5% |
|
||||
| malloc_base | 30.289 | 6.3% |
|
||||
| MKL PARDISO blkl_omp_mic_vbsr_real | 27.669 | 5.7% |
|
||||
| inertia Jet operator* | 26.257 | 5.4% |
|
||||
|
||||
T2 math/linear owner에는 `CheckGraphRegularity` → `CheckSelectorTransversality` →
|
||||
`MklPardisoTangentSolver::FactorizeFresh/SolveCorrection` → `pardiso` 경로를 넘긴다.
|
||||
leaf call-path의 양수 CPU weight를 caller별 한 번 합산한 보조 분석은 graph regularity
|
||||
2.434118 CPU 초, nested selector 1.600014 CPU 초, PARDISO 42.725655 CPU 초다.
|
||||
flat 함수별 CPU와 call-path weight의 합계가 일치한다. 이는 중첩 inclusive attribution이며
|
||||
서로 합산하거나 wall time으로 바꾸지 않는다. 현재 표본에서 graph/selector가 주된
|
||||
병목이라고 단정할 근거는 없다.
|
||||
|
||||
T4 element/assembly owner에는 shell/inertia Jet 곱셈·할당과
|
||||
`EvaluateInternalResidualAndTangent`/`EvaluateAssembly`의 TBB 경로, allocator 및 MKL/OMP
|
||||
소비 자료를 넘긴다. `EvaluateAssembly` caller의 보조 inclusive CPU는 257.862958 초다.
|
||||
아직 수치 구현을 변경하거나 향후 개선 배수를 추정하지 않았다.
|
||||
|
||||
- [150초 raw 결과](../../.harness/performance/baseline/t1-single-20261014-122548/profiles/shellNL-dyn-meshfine-repeat-150s)
|
||||
- [함수 CSV](../../.harness/performance/baseline/t1-single-20261014-122548/profiles/shellNL-dyn-meshfine-repeat-150s-functions.csv) / [전체 stack CSV](../../.harness/performance/baseline/t1-single-20261014-122548/profiles/shellNL-dyn-meshfine-repeat-150s-callstacks.csv)
|
||||
- [호출 경로별 보조 합계·방법](../../.harness/performance/baseline/t1-single-20261014-122548/profiles/callpath-attribution.json)
|
||||
- [실제 partial 명령·exit 4·child 부재](../../.harness/performance/baseline/t1-single-20261014-122548/profiles/collection-execution.json)
|
||||
|
||||
## 보존과 검증 범위
|
||||
|
||||
실행 binary SHA-256은 `fdb77bc39cc518d509e6bcf679d91f75d67a8c0bbde6b505fe555030274eccfb`,
|
||||
공식 측정기 hash는 `4ae3dfcee43cd9aa25ce11a1a1c6d87646f745b881fac9ad6c79a52e1bc5b082`다.
|
||||
실제 exe/PDB/DLL은 parent artifact의 `build/binary/`에 복사했고 공식 환경의 모든 runtime
|
||||
DLL hash와 비교해 일치를 확인했다. 살아 있던 공식 Shell의 실제 DLL module 경로도
|
||||
모두 Release exe 옆 staged DLL이었다. source numerical diff는 승인 baseline 대비 비어 있다.
|
||||
|
||||
- [Binary/PDB/DLL archive manifest](../../.harness/performance/baseline/t1-single-20261014-122548/build/binary-manifest.json)
|
||||
- [빌드 명령 로그](../../.harness/performance/baseline/t1-single-20261014-122548/build/build-release.txt) / [configure 로그](../../.harness/performance/baseline/t1-single-20261014-122548/build/configure-release.txt)
|
||||
- [최종 관련 Python 19 PASS](../../.harness/performance/baseline/t1-single-20261014-122548/build/pytest-single-green.txt) / [단일·finite·검증중단 RED](../../.harness/performance/baseline/t1-single-20261014-122548/build/pytest-single-red.txt) / [환경중단 RED](../../.harness/performance/baseline/t1-single-20261014-122548/build/pytest-environment-red.txt)
|
||||
- [재부팅·전원·source/flags/version 환경](../../.harness/performance/baseline/t1-single-20261014-122548/build/environment-ready.json)
|
||||
- [실제 DLL/보조 resource/프로세스 부재 관측](../../.harness/performance/baseline/t1-single-20261014-122548/build/live-observations.json)
|
||||
- [과거 중단 복구 기록](../../.harness/performance/baseline/t1-20261014-0845/recovery-20261014.json)
|
||||
|
||||
Release build 범위는 `fesa_cli`다. Release CTest discovery exit 0의 3개 항목은 모두
|
||||
`*_NOT_BUILT` placeholder이며 검사 통과가 아니다. 전체 MSVC x64 Debug build/CTest는
|
||||
T1에서 실행하지 않았으며 후속 T5의 필수 검증으로 남는다. 원본 reference, 물리·질량·
|
||||
high+low·수치 tolerance와 결과 schema를 변경하지 않았다.
|
||||
|
||||
## 통합 source의 영향범위 Debug 검사
|
||||
|
||||
`81757022806746addbb71ba101e0393a32ff48fd`에서 Hex8 pair packet/guard와
|
||||
셸 MKL·완성 trial 재사용을 함께 빌드해 consumer 상호 작용을 확인했다.
|
||||
MSVC x64 Debug configure/native0, unit·integration·CLI consumer 115 build edges/native0,
|
||||
Hex8 actual Ninja dependencies16/native0을 확인했다. Hook SHA는
|
||||
`00B39E0F778301785BC9F8DC9C8FA2A834C2E7D6FC9421D9EB0928BCA78FCC8F`다.
|
||||
관련 Hex8·산술·reduced shell·초기 Newton·private policy 검사 111개가 모두
|
||||
통과했다(native0, CTest27.62초). 별도 discovery도 native0/111개다.
|
||||
|
||||
이 검사는 기존 corrected-prefix tree의 재빌드이며 최종 fresh/full Debug 검사가 아니다.
|
||||
장시간 mixed-time 검사와 선택하지 않은 C08·다른 suite의 판정을 제공하지 않는다.
|
||||
최종 reference/시간 목표와 독립 물리 검증도 대체하지 않는다. CPU 작업은 직렬로
|
||||
실행하고 완료 후 관련 프로세스0을 확인했다. 준비 중 discovery 삽입과 delivery
|
||||
메타데이터의 PowerShell 오류는 별도 기록으로 보존했고 실제 명령 결과와 구분했다.
|
||||
|
||||
- [실제 configure/build/deps/CTest 명령과 native](../../.harness/performance/integrated-boundaries/after-native.json)
|
||||
- [검사 로그](../../.harness/performance/integrated-boundaries/after-checks.txt), [별도 discovery native](../../.harness/performance/integrated-boundaries/discovery-native.json)
|
||||
- [source·binary·scope 기록](../../.harness/performance/integrated-boundaries/delivery.json), [준비 오류 기록](../../.harness/performance/integrated-boundaries/preparation-error.md)
|
||||
Reference in New Issue
Block a user