From 685f5e6a826c7bb66b9cef90e086ef4b2685252d Mon Sep 17 00:00:00 2001 From: "KOKO\\Mimi" Date: Wed, 21 Oct 2026 08:42:06 +0900 Subject: [PATCH] Reduce MITC4 Jet product scratch stack storage --- src/fesa/elements/nonlinear_mitc4_shell.cpp | 11 +++++------ .../elements/nonlinear_mitc4_shell_jet_baseline.md | 12 +++++++++++- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/fesa/elements/nonlinear_mitc4_shell.cpp b/src/fesa/elements/nonlinear_mitc4_shell.cpp index 4d8eb0e..158d59e 100644 --- a/src/fesa/elements/nonlinear_mitc4_shell.cpp +++ b/src/fesa/elements/nonlinear_mitc4_shell.cpp @@ -594,17 +594,17 @@ Jet operator*(const Jet& left, const Jet& right) { const bool masked_exceptions = (_mm_getcsr() & _MM_MASK_MASK) == _MM_MASK_MASK; const bool outer_accepted = Outer(left.first, right.first, result_second); + std::array scratch; if (masked_exceptions && outer_accepted) { // Retain earlier upper entries for later lower entries before overwriting // them. Reuse the MKL k=1 transpose while preserving the original row-major // arithmetic order as well as each entry's four-term association. - std::array upper; std::size_t saved = 0U; for (std::size_t row = 0U; row < kGlobalDofCount; ++row) { for (std::size_t column = 0U; column < row; ++column) { const std::size_t index = row * kGlobalDofCount + column; result_second[index] = left_second[index] * right.value + - result_second[index] + upper[saved++] + + result_second[index] + scratch[saved++] + left.value * right_second[index]; } const std::size_t diagonal = row * kGlobalDofCount + row; @@ -616,7 +616,7 @@ Jet operator*(const Jet& left, const Jet& right) { const std::size_t transpose = column * kGlobalDofCount + row; const double forward = result_second[index]; const double reverse = result_second[transpose]; - upper[column * (column - 1U) / 2U + row] = forward; + scratch[column * (column - 1U) / 2U + row] = forward; result_second[index] = left_second[index] * right.value + forward + reverse + left.value * right_second[index]; } @@ -624,13 +624,12 @@ Jet operator*(const Jet& left, const Jet& right) { return result; } // Preserve the reverse input-validation order after a rejected first outer. - std::array reverse; - Outer(right.first, left.first, reverse.data()); + Outer(right.first, left.first, scratch.data()); for (std::size_t row = 0U; row < kGlobalDofCount; ++row) { for (std::size_t column = 0U; column < kGlobalDofCount; ++column) { const std::size_t index = row * kGlobalDofCount + column; result_second[index] = left_second[index] * right.value + - result_second[index] + reverse[index] + + result_second[index] + scratch[index] + left.value * right_second[index]; } } diff --git a/tests/unit/elements/nonlinear_mitc4_shell_jet_baseline.md b/tests/unit/elements/nonlinear_mitc4_shell_jet_baseline.md index 0398788..5dfa0ba 100644 --- a/tests/unit/elements/nonlinear_mitc4_shell_jet_baseline.md +++ b/tests/unit/elements/nonlinear_mitc4_shell_jet_baseline.md @@ -63,9 +63,19 @@ SEH/process 관측이나 생성 코드 근거가 필요하며, source의 row-maj T2의 무가드 단일 외적 후보는 unmasked 최초 INVALID/OVERFLOW 순서가 달라 비채택했다. 채택한 guarded 경로는 MXCSR의 여섯 예외가 모두 masked이고 첫 외적이 성공한 경우에만 전치 성분과 276개 상삼각 scratch를 재사용한다. Unmasked 환경과 외적 거부는 기존 두 호출, -576개 reverse 배열과 row-major 결합을 유지한다. Masked snapshot과 별도 원본/후보 SEH +576개 reverse 외적과 row-major 결합을 유지한다. Masked snapshot과 별도 원본/후보 SEH 관측을 함께 확인하며, 정상 경로의 임시 쓰기 감소를 전체 stack 예약 감소로 보고하지 않는다. +T5는 서로 배타적인 276개 상삼각 보관과 576개 reverse 외적에 같은 local +`std::array` scratch를 사용한다. 입력·공유 Hessian의 저장소와 수명은 +바꾸지 않는다. 두 분기에서 쓰기 전 읽기가 없는지 검토하고 위 3구성 비교 및 별도 +6개 unmasked 최초 trap을 확인한다. Stack 예약량은 실제 Release production object의 +frame과 `__chkstk`를 확인하며, heap 할당 감소나 전체 모델 속도 향상으로 해석하지 않는다. +별도 복사 source의 Values 생성·소멸 계측은 생존 시작량을 포함한 peak payload와 +증가량을 구분한다. 동시 호출 peak는 스케줄에 따라 달라지고, 계측 시간은 정상 Release +측정에서 제외한다. Hessian 복사 연산 횟수는 implicit/null 복사도 포함하며 strong-ref +증가 횟수나 CPU 비용을 뜻하지 않는다. Global pool이나 trial 간 cache는 도입하지 않는다. + T3 누적 검사는 기존 T1/T2 snapshot을 확장하지 않고 별도 파일을 쓴다. 원본 source와 보존 archive의 출처를 확인한 실행물에서만 새 경로에 생성한다. 실제 CMake 경로는 원본 source staging을 CMake로 configure/build한 실행물과 구분해 연결한다.