260 lines
17 KiB
Markdown
260 lines
17 KiB
Markdown
# 외부 수렴 정책 실험 결과 — T2 기준과 T6 후보 보존
|
||
|
||
기록일: 2026-10-19. **정상 strict 기준은 확보했으나 전체 실험·물리 검증은 미완료**다.
|
||
T6 후보는 별도 1증분 개발 진단과 계측 OFF Release 실행물 보존까지 수행했다.
|
||
공식 100증분 후보 실행·reference 비교·성능 비교는 미성립이며 가속률이나 채택 가능성을 주장하지 않는다.
|
||
|
||
## 기준과 원시 증거
|
||
|
||
측정 source는 `78cb33920742a91b4801788fbcc953d3306b0884`다.
|
||
`d7f6d0c`와 제품 source·두 빌드 설정의 diff는 exit 0이다. 원래 조사 기준
|
||
`43867d0`와 달리 사용자 승인 local kernel인 polar 1회, ExpSkew/Jacobian 3차,
|
||
질량 gate와 관련 테스트 오차 `1e-3`을 사용했다. 외부 Newton은 잔차와
|
||
q/v/a/A 보정 `1e-10`, 최대 100회인 기존 strict 경로다.
|
||
|
||
원시 자료는 **부모 작업공간**의 다음 ignored 위치에 보존했다. T2 worktree의
|
||
`.build`를 정리해도 아래 자료는 별도로 남는다.
|
||
|
||
```text
|
||
.build/tolerance-experiment/go-20261018/baseline/
|
||
source/strict-source-78cb339.zip, source-hashes.json, revision.txt
|
||
runtime/ # 공식 EXE·DLL·PDB
|
||
runtime/tests/ # 같은 Release 검사 EXE·DLL·PDB
|
||
build/ # 실제 명령·전체 로그·각 exit·선택 CMake compile 명령
|
||
run/ # 새 INP·CSV 복사본·로그·새 HDF5
|
||
execution.json, runtime-hashes.json, test-runtime-hashes.json
|
||
input-hashes-before.json, input-hashes-after.json, environment-before.json
|
||
reference-comparison.json, official-log-summary.json
|
||
development-one-increment/ # 최초 ON 진단, 보완 전
|
||
development-off-control/ # 보존된 공식 OFF EXE의 1증분 대조
|
||
development-final/ # 보완 후 최종 ON 진단·카운터 관계 검증
|
||
```
|
||
|
||
| 보존 대상 | SHA256 |
|
||
| --- | --- |
|
||
| strict source ZIP | `0B655E0257720AD9CEF31274931578FE17C4456B9988C158A61DF88D93792BED` |
|
||
| 공식 fesa.exe | `3CDB5D9D35F6AD95781044BD311ECB35C9FB121780EF81FC535434BF3515172C` |
|
||
| 정식 INP 및 공식 작업 복사 | `B8922243CA8DDFE20B1DD39F3123207F789A1A75F6B10DBB6B0BC0B5A40DFFF5` |
|
||
| 정식 변위 CSV 및 복사 | `422ECF17609E14FD119D60A3D5AF7A0D1BC4A95E0F556608A7D791E2718C56C5` |
|
||
| 새 공식 HDF5 | `55EF1FFAAE061311F3C1AE705824658B668A818D5F1F7D27BB538CA66EE4792C` |
|
||
|
||
원본 reference는 실행·수정하지 않았고 전후 hash가 같다. 기존 결과를 재사용하지 않았다.
|
||
|
||
## 계측 없는 공식 실행
|
||
|
||
`MSBuild FESA.sln /m:2 /p:Configuration=Release /p:Platform=x64`는 native exit 0이다.
|
||
VS 18.11/MSVC 14.51 x64, `/O2 /Ob2 /fp:precise /MD`, staged MKL 2026.1,
|
||
TBB 2023.1, HDF5 2.1.1, Intel runtime 2026.1을 사용했다.
|
||
기존 Hex8 검사 source의 C4334 경고 1개가 있었고 오류는 없었다.
|
||
|
||
호스트는 KOKO, Ryzen 7 5800H(8코어/16논리), 전원은 고성능이다.
|
||
관련 thread 환경변수와 PATH를 `environment-before.json`에 기록했고 변경하지 않았다.
|
||
실제 worker 수를 고정·계측한 결과는 아니다. 후보 공식 측정도 같은 환경을 사용해야 한다.
|
||
측정 중 다른 build/test/solver를 실행하지 않았다. 워밍업 없이 정확히 1회 실행했다.
|
||
|
||
| 항목 | 실제 결과 |
|
||
| --- | --- |
|
||
| 명령 | 보존된 `runtime/fesa.exe run/shellNL-dyn-meshfine.inp` |
|
||
| 입력 | dt=.1, T=10, 100증분, 729 nodes, 676 elements |
|
||
| 시작/종료 UTC | 2026-10-18 15:01:20.6895159 / 16:47:11.4199462 |
|
||
| native / wrapper exit | 0 / 0 |
|
||
| 공식 elapsed | **6350.7895521초** |
|
||
| 프로세스 CPU | 18021.3125초; elapsed와 다른 값 |
|
||
| 새 HDF5 | 126254676 bytes, schema2, 729 nodes / 101 frames |
|
||
| peak working set | 종료 후 API가 null을 반환하여 미확보 |
|
||
| 정식 비교 | comparator exit 0, 사전검사 통과, U blocking 실패 0, UR 경고 200 |
|
||
| U 최대 family relative RMS | 0.002282424502275574 |
|
||
|
||
정식 비교는 기존 9-node U blocking/UR warning 정책 그대로 수행했다.
|
||
전체 441774 변위 scalar의 identity/finite 확인 후 202 families를 평가했고
|
||
near-zero 1%, 일반 상대 5%, RMS 1%, zero-scale exact-zero를 유지했다.
|
||
Python의 로컬 uv cache를 child `PYTHONPATH`로 읽어 numpy 2.4.6/h5py 3.16.0을 사용했다.
|
||
설치·다운로드·캐시 쓰기를 하지 않았다. 실제 argv와 exit는 원시 로그에 있다.
|
||
|
||
공식 hht-log-v1에서 양의 accepted 100건, 평가 204건이며 accepted iteration 합은
|
||
**outer applied correction 204회**다. 96증분은 2회, 4증분은 3회다.
|
||
잔차가 통과했지만 보정이 실패한 평가는 27건이다. 보정 채널별 실패 평가 건수는
|
||
u의 q/v/a/A가 102/103/104/104, 회전은 100/100/102/102다.
|
||
이는 중복을 허용한 로그 채널 진단이며 배타적 실행시간이나 후보의 절약 가능 회수가 아니다.
|
||
|
||
## 별도 1증분 개발 계측
|
||
|
||
기존 4개 물리·미분 검사 실패가 남은 상태에서 동일 100증분을 장시간 반복하지 않았다.
|
||
승인된 별도 개발 입력 복사에서 T만 `.1`로 줄였고 dt=.1과 local kernel·strict 종료는 유지했다.
|
||
이 입력 SHA256은 `79D1C09FC5AFB792312F1908E13D71ABC228D98D10B438B91412A9BFA4C95A50`다.
|
||
|
||
계측은 기본 컴파일 OFF다. Native는 `/p:FesaHhtDevelopmentProbe=true`, CMake는
|
||
`-DFESA_HHT_DEVELOPMENT_PROBE=ON`으로 켜고, ON 실행에서만
|
||
`FESA_HHT_PROBE_OUTPUT=<새 sidecar 경로>`를 설정한다. 정상 OFF 객체에는 해당 환경 키가 없다.
|
||
추가 요소 평가·수치 보정·판정 완화 없이 기존 호출 앞의 계수와 serial scope의 정수 ns 타이머만 쓴다.
|
||
단일 procedure 개발 실행용이며 동시 다중 procedure 계측을 지원한다는 주장은 없다.
|
||
병렬 요소 callback은 atomic 계수만 쓰고 타이머/단계 배열은 serial thread만 수정한다.
|
||
|
||
최종 개발 실행 native exit 0, 개발 elapsed 77.5268139초다. 이는 공식 시간이 아니다.
|
||
최초 ON, OFF 대조, 보완 후 최종 ON은 모두 별도 파일로 보존했다.
|
||
|
||
| 최종 sidecar 계수 | 값과 범위 |
|
||
| --- | --- |
|
||
| outer_applied_correction / inner_applied_correction | 3 / 1; 실제 좌표 갱신만 포함 |
|
||
| assembly_calls | 14 |
|
||
| assembly_internal_evaluation | 9464 = 14×676 |
|
||
| assembly_internal_failure | 3; 대체 시작 trial 평가의 실패이며 최종 해석 실패가 아님 |
|
||
| assembly_inertia_evaluation | 9461 = 9464−3; internal 실패 뒤 생략된 관성 호출 제외 |
|
||
| constraint_internal_evaluation | 6760; cache miss의 실제 추가 EvaluateTrial만 포함 |
|
||
| logical_factor_call / logical_solve_call / logical_rhs | 1274 / 7516 / 7516 |
|
||
|
||
Solver 수는 HHT 경계 forwarding wrapper의 논리 호출이다. 실패 시도도 세며 vendor의
|
||
phase11/22/33 전체 호출수로 해석하지 않는다. inner correction도 stagnation 때문에
|
||
계산만 하고 적용하지 않은 solve는 제외하지만 logical solve에는 포함한다.
|
||
계수 관계와 공식 첫 증분의 outer 3회 일치는 `counter-check.json`에서 assert했다.
|
||
|
||
| 중복 없는 최종 단계 시간 | 초 |
|
||
| --- | ---: |
|
||
| procedure_other | 30.6919325 |
|
||
| inner_graph | 26.6134860 |
|
||
| assembly | 13.8891082 |
|
||
| outer_linear | 0.1445448 |
|
||
| physical_rates | 0.2650750 |
|
||
| factor | 5.0312963 |
|
||
| solve | 0.5715257 |
|
||
| 합계 = procedure inclusive | 77.2069685 |
|
||
|
||
각 `_exclusive_ns`는 자식 시간을 뺀 값이고 합계가 `procedure_inclusive_ns`와 정확히 같음을
|
||
assert했다. ExecuteReducedHht 경계이므로 CLI 입력·최종 HDF5 finalize·sidecar I/O를 제외한다.
|
||
요소 kernel 시간은 병렬 wall-time을 포함한 assembly 범위이며 각 요소 CPU 시간의 합이 아니다.
|
||
전체 100증분의 inner/요소/factor/solve 비용과 후반 채널 분포는 **계측하지 않았다**.
|
||
첫 증분 계수·시간을 100배하거나 후보 전체 비용으로 외삽하지 않는다.
|
||
|
||
## 정확 byte parity와 검증 한계
|
||
|
||
공식 frame0/1과 개발 결과의 40개 numeric dataset을 identity/shape/type/finite 확인 후 비교했다.
|
||
ON 최초·ON 최종·보존된 공식 OFF EXE의 짧은 입력 대조 모두 22개 dataset이 byte 일치하고
|
||
frame1의 18개 dataset은 불일치했다. **정확 byte parity는 미통과**다.
|
||
최종 ON의 q/v/physical a 최대 절대차는 각각 6.776263578034403e-21,
|
||
2.168404344971009e-19, 6.938893903907228e-18이고 energy는 8.881784197001252e-16이다.
|
||
거의 영인 값의 scalar 상대오차가 클 수 있으므로 최대 절대차만으로 통과 판정하지 않는다.
|
||
|
||
동일 보존 OFF EXE의 대조에서도 q/v/a 최대 절대차는 1.3552527156068805e-20,
|
||
3.552713678800501e-15, 5.684341886080802e-14였다. T 단축·반복 실행·기본 thread 조건·
|
||
컴파일/계측 영향을 완전히 분리하지 못했으며 원인을 하나로 단정하지 않는다.
|
||
새 parity tolerance나 floor를 도입하지 않았다. dataset별 차이 수·최대 절대/상대차·첫 위치와
|
||
원본/실제 bytes는 각 `parity-details.json`에 보존했다. NaN을 동일 처리하지 않고 finite를 요구했다.
|
||
독립 source 검토에서 산술·평가·진단 순서 변경이 없다고 확인한 사실은 실행 parity 통과와 별개다.
|
||
|
||
계측 검사는 no-op에서 2FAIL/native1을 확인한 뒤 카운트·중첩 배타 시간·solver forwarding/
|
||
실패 보존·실제 inner 1회/0회 갱신의 4개 검사를 native0으로 통과했다.
|
||
실제 inner 계수 검사는 CMake OFF operators 객체를 연결하면 1FAIL/native1, ON이면 4PASS/native0다.
|
||
Standalone 준비 중 link/include/MKL runtime 오류와 짧은 clock tick assertion 실패도 별도 보존했다.
|
||
짧은 tick은 0ns를 허용하고 scope 진입 수와 시간 분할의 exact equality를 검사한다.
|
||
Standalone에 필요한 기존 설치의 sequential DLL은 테스트 전용이며 공식 runtime에 추가하지 않았다.
|
||
|
||
Native ON CLI 최종 빌드는 exit0(경고0), CMake Release 기본 OFF의 변경 production 3개와
|
||
새 검사 객체 compile은 exit0, ON 새 검사 객체 compile도 exit0이다. source 등록을 양쪽에 맞췄다.
|
||
OFF에서는 새 검사 identity가 없고 ON에서는 4개다. 전체 CMake link/CTest나 전체 Debug 검사는
|
||
이번 T2에서 실행하지 않았고 후속 전체 회귀를 대신하지 않는다.
|
||
기존 local-kernel의 4FAIL은 [기록](local-kernel-experiment.md)을 유지하며 재실행/해결한 것으로 보고하지 않는다.
|
||
U 통과는 V/a/energy의 외부 검증이나 기존 물리 실패의 해결을 뜻하지 않는다.
|
||
|
||
T2 판정은 **기준 보존 완료·개발 진단 한정 확보·전체 검증 미완료**다.
|
||
후보 측정, 전체 100증분 개발 비용, 정확 parity 원인 분리와 필수 전체 물리/회귀 검증은 남았다.
|
||
|
||
## T6 후보 실행물과 공식 측정 미실행
|
||
|
||
T6 source는 `0c88cb24c84abc4b3561a1e7975df7a4125134f1`, branch는
|
||
`dryforge/tolerance-t6`다. 제품 source와 probe·판정 기준은 수정하지 않았다.
|
||
T4 최종 parent `dd54b0a`와 src/include/msvc 및 CMake 설정의 Git identity가 같고,
|
||
T4 manifest의 제품 source 5개와 cached probe ON CLI SHA256
|
||
`6C9264282B117A35A46C3550CAE215B096F60B46F0105B929BA9A1979EBF547F`가 일치한다.
|
||
T5는 검사와 문서만 변경했다. Source ZIP, 파일 hash, 실행물과 DLL, 실제 명령,
|
||
환경·전원 및 raw 자료는 부모 작업공간의 다음 위치에 별도 보존했다.
|
||
|
||
```text
|
||
.build/tolerance-experiment/go-20261018/
|
||
candidate/source/ # pinned source ZIP·SHA256
|
||
candidate/development-runtime/ # cached probe ON EXE·7 DLL·PDB
|
||
candidate/development-one-increment/ # 새 짧은 입력·native exit·로그·HDF5·probe
|
||
candidate/runtime/ # 새 full Native Release probe OFF 실행물
|
||
candidate/build/ # ON/OFF compile 기록·OFF 명령·raw·exit
|
||
candidate/official-input/ # 정식 INP·CSV의 새 hash 확인 복사, 미실행
|
||
T6/ # preflight·진단 script·metadata·검토 기록
|
||
```
|
||
|
||
[T5 물리 검증](physics-validation.md)의 Release153 결과는 144PASS/8FAIL/1SKIP,
|
||
native exit1이다. 독립 D3 두 검사, drilling gradient, C08 pointwise 및 strict algebra
|
||
시간 controller 네 실패와 후보 비선형 시간 정확도 R8 미충족이 남는다.
|
||
보존 strict C08 대조도 5FAIL이며 이를 후보 정확도 통과로 해석하지 않는다.
|
||
계획의 명시된 실패 분기에 따라 같은 긴 실행을 근거 없이 반복하지 않았고,
|
||
**공식 dt=.1/T=10/100증분 후보 실행은 시작하지 않았다.**
|
||
따라서 후보 공식 elapsed, strict 대비 Δ·speedup, 729 nodes/101 frames 완결 결과와
|
||
정식 9-node U blocking/UR warning reference 판정은 모두 **not-established**다.
|
||
T2 strict 공식 6350.7895521초와 아래 개발 시간을 비교하지 않는다.
|
||
|
||
## T6 초기화와 1증분 개발 진단
|
||
|
||
T2 `baseline/development-final`의 T=.1/dt=.1 입력을 새 경로에 복사했고 SHA256
|
||
`79D1C09FC5AFB792312F1908E13D71ABC228D98D10B438B91412A9BFA4C95A50`가 같다.
|
||
공식 100증분 입력과 별개다. KOKO/Ryzen 7 5800H, 고성능 전원, 기존 thread 환경과
|
||
동일 local polar1/inertia3/mass gate1e-3 및 cached MSVC Release probe ON을 사용했다.
|
||
짧은 고유 TMP/TEMP `C:/ft6d`와 새 `FESA_HHT_PROBE_OUTPUT=.../probe.txt`를 설정했다.
|
||
상속 GoogleTest 선택 환경은 제거했다. 실행 전 guard는 오래된 MSBuild PID5112를
|
||
발견해 native launch 전에 중단했다. CPU2.640625초 불변·cl/link/solver/test 부재와
|
||
T4/T5 종료 확인 후 idle worker만 제외했고 프로세스는 종료하지 않았다.
|
||
두 preflight와 근거를 T6에 보존했으며 guard 대기는 elapsed에 포함하지 않는다.
|
||
|
||
실제 native 실행은 1회다. UTC `2026-10-18T18:07:36.7511886Z`부터
|
||
`18:08:41.2302276Z`까지 **64.4754692초**, native exit0이며 새 HDF5는
|
||
2851989 bytes, frame0/1 두 frame이다. 이는 계측 ON 초기화+1증분 개발 시간이고
|
||
공식 시간·전체 비용·후반 증분 비용으로 외삽하지 않는다.
|
||
|
||
| 동일 계수 정의의 1증분 진단 | T2 strict ON | T6 candidate ON |
|
||
| --- | ---: | ---: |
|
||
| outer / inner applied correction | 3 / 1 | 2 / 1 |
|
||
| assembly calls | 14 | 12 |
|
||
| internal evaluation / failure | 9464 / 3 | 8112 / 3 |
|
||
| inertia evaluation | 9461 | 8109 |
|
||
| constraint internal evaluation | 6760 | 5408 |
|
||
| logical factor | 1274 | 1271 |
|
||
| logical solve / RHS | 7516 / 7516 | 7513 / 7513 |
|
||
|
||
실제 호출 경계와 forwarding 의미는 T2와 같다. Internal=assembly×676,
|
||
inertia=internal−failure, solve=RHS와 exclusive ns 합=procedure inclusive를
|
||
`counter-comparison.json`에서 확인했다. 내부 실패3은 대체 시작 trial의 실패이며
|
||
최종 해석 실패가 아니다. 카운터 감소를 공식 가속률로 변환하지 않는다.
|
||
|
||
같은 짧은 입력의 strict ON과 후보 ON HDF5 frame0/1의 40개 numeric dataset을
|
||
shape/type/finite 및 inventory 확인 후 비교했다. 22개는 정확 byte 일치하고
|
||
frame1의18개는 달라 **정확 byte parity는 미통과**다. nodal q/v/physical a/A의
|
||
최대 절대차는 각각 `2.0328790734103208e-20`, `3.552713678800501e-15`,
|
||
`5.684341886080802e-14`, `5.684341886080802e-14`이며 energy는
|
||
`8.171241461241152e-14`다. Angular velocity/acceleration·triad·director와
|
||
force/reaction/residual·element 결과도 전체 dataset별 차이를
|
||
`state-differences.json`에 보존했다. 이는 정책 차이의 진단 숫자이며 외부 truth,
|
||
정확도 승인 또는 새 parity tolerance가 아니다. T2 ON/OFF의 기존 ULP 차이도 미해결이다.
|
||
|
||
## T6 계측 OFF Release 보존과 정적 확인
|
||
|
||
개발 진단 종료 후 VS18.11.0/MSVC14.51.36231 x64에서 전체
|
||
`MSBuild FESA.sln /m:2 /p:Configuration=Release /p:Platform=x64 /p:FesaHhtDevelopmentProbe=false`
|
||
를 실행했다. 실제 명령에는 `/verbosity:minimal`만 추가했고 native exit0이다.
|
||
기존 Hex8 검사 C4334 경고1개를 보존했으며 검사 실행을 빌드 통과로 세지 않는다.
|
||
새 OFF CLI의 SHA256은
|
||
`449196EB79EFAB3C62B8DAC4B73C3C76E97EC76F6A77F9D80CE1EE5C8C1F0CFA`,
|
||
pinned source ZIP은
|
||
`BF2D12688F778A8F9010C3FE086AA9D5E226209AAF1893AE84EBE841BF0F9C9B`다.
|
||
EXE/PDB/7개 DLL을 `candidate/runtime`에 보존했으며 DLL SHA는 T2 strict와 모두 같다.
|
||
ON/OFF solver·CLI compile tlog를 각각 보존했다. OFF solver compile에 probe define이
|
||
없고 `/O2 /Ob2 /MD /fp:precise`를 확인했으며 102개 solver 객체에
|
||
`FESA_HHT_PROBE_OUTPUT` 문자열이 없음을 검사했다.
|
||
|
||
OFF unit discovery native exit0,883개이며 ON887개에서 probe4개가 빠진 목록이다.
|
||
Field21개와 T4 후보 종료/물리 후속 gate 및 T5 강체 oracle identity가 존재한다.
|
||
이는 discovery 확인이며 unit 실행 통과가 아니다. `T6/verification.json`,
|
||
`verify-artifacts.raw.txt`, `commands.txt`에 실제 범위·exit·미실행 상태를 남겼다.
|
||
정식 INP/CSV 새 복사 hash는 각각 기존 T2의 `B8922243...DFFF5`,
|
||
`422ECF17...8C56C5`와 같고 원본 전후 hash도 같다. 공식 복사본은 실행하지 않았다.
|
||
문서 diff/링크/기록 숫자를 정적으로 검토했으며 tracked 변경은 이 문서뿐이다.
|
||
|
||
T6은 공식 장시간 성능과 reference 통과를 확정하지 못한 **DONE_WITH_CONCERNS**다.
|
||
수치 부적합 해결·기준 완화는 수행하지 않았다. T7의 전체 Native Debug·CMake CTest·
|
||
별도 Python·필수 reference 검증은 후속 범위이며 이 한정 진단이 대체하지 않는다.
|