From 3ecb8655a292b6da4f17719756eac7cf1634fa8b Mon Sep 17 00:00:00 2001 From: "KOKO\\Mimi" Date: Tue, 20 Oct 2026 22:30:47 +0900 Subject: [PATCH 1/3] build: switch oneMKL threading layer to TBB --- CMakeLists.txt | 2 +- cmake/FesaDependencies.cmake | 9 +++++++++ msvc/Fesa.Common.props | 6 ++++-- msvc/Fesa.Runtime.targets | 9 +++++---- src/fesa/CMakeLists.txt | 12 ++++-------- tests/CMakeLists.txt | 12 ++++-------- 6 files changed, 27 insertions(+), 23 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1dbc94b..05d9010 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,7 @@ set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>DLL") # Pin the original backend ABI/link/thread choices rather than package defaults. set(MKL_INTERFACE ilp64) set(MKL_LINK dynamic) -set(MKL_THREADING intel_thread) +set(MKL_THREADING tbb_thread) include(cmake/FesaDependencies.cmake) find_package(Doxygen QUIET) if(Doxygen_FOUND) diff --git a/cmake/FesaDependencies.cmake b/cmake/FesaDependencies.cmake index 0e025e3..474a23a 100644 --- a/cmake/FesaDependencies.cmake +++ b/cmake/FesaDependencies.cmake @@ -44,6 +44,15 @@ if(NOT TARGET TBB::tbb) message(FATAL_ERROR "The oneTBB CONFIG package did not define TBB::tbb") endif() +if(WIN32) + set(FESA_MKL_THREAD_TARGET MKL::mkl_tbb_thread) + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(FESA_MKL_THREAD_TARGET MKL::mkl_tbb_threadd) + endif() + # HDF5 requires the Intel math runtime independently of MKL threading. + set(FESA_INTEL_MATH_RUNTIME "$ENV{FESA_OMP_ROOT}/bin/libmmd.dll") +endif() + # Prefer the packaged shared C runtime when both variants exist. The Windows # static archive may carry compiler-runtime requirements that are not part of # the HDF5 imported target's transitive link interface. diff --git a/msvc/Fesa.Common.props b/msvc/Fesa.Common.props index f8a2f99..e397a49 100644 --- a/msvc/Fesa.Common.props +++ b/msvc/Fesa.Common.props @@ -14,6 +14,8 @@ $(FesaBuildRoot)obj\$(MSBuildProjectName)\ fesa _debug + mkl_tbb_thread + mkl_tbb_threadd /external:I"$(FESA_MKL_ROOT)\include" /external:I"$(FESA_TBB_ROOT)\include" /external:I"$(FESA_HDF5_ROOT)\include" /external:W0 @@ -56,8 +58,8 @@ true true true - $(FESA_MKL_ROOT)\lib;$(FESA_OMP_ROOT)\lib;$(FESA_TBB_ROOT)\lib;$(FESA_HDF5_ROOT)\lib;%(AdditionalLibraryDirectories) - mkl_intel_ilp64_dll.lib;mkl_intel_thread_dll.lib;mkl_core_dll.lib;libiomp5md.lib;tbb12$(TbbSuffix).lib;hdf5.lib;shlwapi.lib;%(AdditionalDependencies) + $(FESA_MKL_ROOT)\lib;$(FESA_TBB_ROOT)\lib;$(FESA_HDF5_ROOT)\lib;%(AdditionalLibraryDirectories) + mkl_intel_ilp64_dll.lib;$(FesaMklThreadName)_dll.lib;mkl_core_dll.lib;tbb12$(TbbSuffix).lib;hdf5.lib;shlwapi.lib;%(AdditionalDependencies) diff --git a/msvc/Fesa.Runtime.targets b/msvc/Fesa.Runtime.targets index f4b18f1..14d9ba7 100644 --- a/msvc/Fesa.Runtime.targets +++ b/msvc/Fesa.Runtime.targets @@ -4,18 +4,19 @@ + - + - + - + - + diff --git a/src/fesa/CMakeLists.txt b/src/fesa/CMakeLists.txt index 7f70e0b..123a10c 100644 --- a/src/fesa/CMakeLists.txt +++ b/src/fesa/CMakeLists.txt @@ -159,11 +159,10 @@ target_link_options(fesa_cli PRIVATE unset(_fesa_target) if(WIN32) - if(NOT TARGET MKL::mkl_intel_thread OR NOT TARGET MKL::mkl_core OR - NOT OMP_DLL_DIR OR NOT OMP_DLLNAME) + if(NOT TARGET ${FESA_MKL_THREAD_TARGET} OR NOT TARGET MKL::mkl_core) message(FATAL_ERROR "The oneMKL runtime files required by fesa.exe were not resolved") endif() - if(NOT EXISTS "${OMP_DLL_DIR}/libmmd.dll") + if(NOT EXISTS "${FESA_INTEL_MATH_RUNTIME}") message(FATAL_ERROR "The Intel runtime required by the selected HDF5 DLL was not resolved") endif() @@ -182,16 +181,13 @@ if(WIN32) "$" "$" COMMAND "${CMAKE_COMMAND}" -E copy_if_different - "$" + "$" "$" COMMAND "${CMAKE_COMMAND}" -E copy_if_different "$" "$" COMMAND "${CMAKE_COMMAND}" -E copy_if_different - "${OMP_DLL_DIR}/${OMP_DLLNAME}" - "$" - COMMAND "${CMAKE_COMMAND}" -E copy_if_different - "${OMP_DLL_DIR}/libmmd.dll" + "${FESA_INTEL_MATH_RUNTIME}" "$" COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${_fesa_cli_mkl_dispatch_dll}" diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 1c81290..af52699 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -180,11 +180,10 @@ target_compile_definitions( ) if(WIN32) - if(NOT TARGET MKL::mkl_intel_thread OR NOT TARGET MKL::mkl_core OR - NOT OMP_DLL_DIR OR NOT OMP_DLLNAME) + if(NOT TARGET ${FESA_MKL_THREAD_TARGET} OR NOT TARGET MKL::mkl_core) message(FATAL_ERROR "The oneMKL runtime files required by tests were not resolved") endif() - if(NOT EXISTS "${OMP_DLL_DIR}/libmmd.dll") + if(NOT EXISTS "${FESA_INTEL_MATH_RUNTIME}") message(FATAL_ERROR "The Intel runtime required by the selected HDF5 DLL was not resolved") endif() @@ -205,16 +204,13 @@ if(WIN32) "$" "$" COMMAND "${CMAKE_COMMAND}" -E copy_if_different - "$" + "$" "$" COMMAND "${CMAKE_COMMAND}" -E copy_if_different "$" "$" COMMAND "${CMAKE_COMMAND}" -E copy_if_different - "${OMP_DLL_DIR}/${OMP_DLLNAME}" - "$" - COMMAND "${CMAKE_COMMAND}" -E copy_if_different - "${OMP_DLL_DIR}/libmmd.dll" + "${FESA_INTEL_MATH_RUNTIME}" "$" COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${_fesa_mkl_dispatch_dll}" From 89ac4f27a2c5f377654814348d0fe343338858a5 Mon Sep 17 00:00:00 2001 From: "KOKO\\Mimi" Date: Tue, 20 Oct 2026 22:52:57 +0900 Subject: [PATCH 2/3] build: record MKL TBB compile and static dependency evidence No-file-diff T2 evidence for source 3ecb8655a292b6da4f17719756eac7cf1634fa8b. Native and CMake x64 Debug/Release compile/link: all four exit 0. CLI plus three test EXEs per configuration; dumpbin 64/64 exit 0. 48 adjacent runtime files match installed source SHA256; static closure issues 0. Debug mkl_tbb_threadd.3.dll -> tbb12_debug.dll; Release mkl_tbb_thread.3.dll -> tbb12.dll. Evidence: .build/mkl-tbb-20261020-01/{build-results,dependency-summary,runtime-manifest,link-evidence,evidence-verification,scope-audit}.json Raw: build logs/binlogs, pe-dependencies/*.dependents.raw.txt, dumpbin-commands.json. No tests/discovery/models/reference comparison/runtime loading/numerical/performance validation. Initial static helper guard failed on PowerShell 5 array wrapping; preserved attempt1 logs; final capture exit 0. From d1c0e3656608b867ffafe42eb6fee3596d181969 Mon Sep 17 00:00:00 2001 From: "KOKO\\Mimi" Date: Tue, 20 Oct 2026 22:53:55 +0900 Subject: [PATCH 3/3] docs: record MKL TBB build configuration and verification scope --- docs/calculation-performance/README.md | 13 +++++++++++++ docs/operations.md | 12 +++++++++--- docs/solver-core/README.md | 4 +++- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/docs/calculation-performance/README.md b/docs/calculation-performance/README.md index c0b6f28..746ba4e 100644 --- a/docs/calculation-performance/README.md +++ b/docs/calculation-performance/README.md @@ -2,6 +2,19 @@ Hex8와 reduced-coordinate shell HHT의 실제 병목을 VTune으로 조사하고, 승인된 물리·입력·정밀도·결과 의미를 유지하며 실행 시간을 줄이는 작업이다. 새 요소·하중·적분법·공용 cache framework 추가는 범위 밖이다. 요구사항 `FEM-REQ-PERF-001..009`의 시간 목표와 검증은 별개이며 현재 최종 완료 상태는 아니다. +## 현재 MKL 연결과 확인 범위 + +2026-10-20 MKL threading layer를 TBB로 변경했다. 직접 MSBuild와 CMake의 x64 +Debug·Release 네 빌드는 모두 종료0이며 CLI와 세 테스트 실행 파일 총16개의 링크 및 +인접 DLL48개의 일반·지연 PE 의존성과 설치 원본 해시를 정적으로 확인했다. +Debug는 `mkl_tbb_threadd`·`tbb12_debug`, Release는 `mkl_tbb_thread`·`tbb12`를 사용하고 +HDF5의 `libmmd.dll`을 유지한다. 근거는 `.build/mkl-tbb-20261020-01/`에 보관했다. + +사용자 지시로 이번 설정 변경에서는 테스트·모델·수치 비교·성능 측정·VTune을 실행하지 +않았다. 실제 DLL loading, 수치 정확성, 속도 향상과 OpenMP 대기 제거는 미검증이다. +기존 OpenMP 전용 local-thread/TLS helper와 HHT cache 진단 코드는 유지했으며 TBB에서의 +동등성도 확인하지 않았다. 아래 과거 시간·검증 기록을 새 TBB 구성의 결과로 승계하지 않는다. + ## 채택한 계산 경로와 수명 [Matrix::Multiply](../../src/fesa/math/matrix.cpp)는 dense GEMV/GEMM, [SparseMatrix::Multiply](../../src/fesa/math/sparse_matrix.cpp)는 CSR validate·finite/RHS/checked MKL_INT 확인 후 `mkl_sparse_d_create_csr → mkl_sparse_d_mv → destroy`를 사용한다. Const 호출마다 변환 배열·values 복사·handle을 소유하므로 copy/move·동시 호출에 backend pointer를 공유하지 않는다. Empty shape도 입력 검증 뒤 zero vector를 반환한다. 지속 symbolic cache나 scalar fallback은 없다. 호출마다 CSR 배열 복사 비용이 있으므로 MKL 연결만으로 전체 성능 향상을 주장하지 않는다. diff --git a/docs/operations.md b/docs/operations.md index 7ba5f24..f5e4327 100644 --- a/docs/operations.md +++ b/docs/operations.md @@ -3,7 +3,7 @@ ## 준비 순서 저장소 root에서 VS x64 개발 환경을 사용한다. 직접 프로젝트는 v145 toolset과 Windows SDK를 -요구한다. 필요한 로컬 설치는 MKL·TBB·HDF5·OpenMP/Intel runtime과 승인된 GoogleTest +요구한다. 필요한 로컬 설치는 MKL·TBB·HDF5·Intel 수학 runtime과 승인된 GoogleTest source checkout이다. CMake 경로에는 추가로 CMake 3.25 이상과 Ninja가 필요하다. Dependency 설치·다운로드·외부 source 수정은 아래 명령에 포함되지 않는다. @@ -15,7 +15,7 @@ Dependency 설치·다운로드·외부 source 수정은 아래 명령에 포함 | `FESA_MKL_ROOT` | MKL의 include·lib·runtime을 포함한 설치 root | | `FESA_TBB_ROOT` | TBB 설치 root; Debug와 Release runtime을 구분한다. | | `FESA_HDF5_ROOT` | HDF5 C library의 include·lib·runtime 설치 root | -| `FESA_OMP_ROOT` | Intel OpenMP library와 runtime 설치 root | +| `FESA_OMP_ROOT` | HDF5가 요구하는 `bin/libmmd.dll`의 Intel compiler runtime 설치 root; 기존 변수명을 유지한다. | | `MKL_DIR`·`TBB_DIR`·`HDF5_DIR` | CMake에서만 사용하는 각 CONFIG package 디렉터리; 설치 root와 혼동하지 않는다. | VS x64 Developer PowerShell에서 다음을 확인한다. 누락되면 해당 로컬 설치 경로를 설정한 @@ -33,7 +33,13 @@ foreach ($root_name in $required_roots) { ``` 위 확인은 환경변수 방식의 준비 절차다. `Fesa.Local.props`를 사용하는 경우에는 그 파일의 -동일 MSBuild property 값을 확인한다. CMake는 `Fesa.Local.props`를 읽지 않는다. +동일 MSBuild property 값을 확인한다. CMake는 `Fesa.Local.props`를 읽지 않으며, +HDF5용 `libmmd.dll`을 찾을 때 `FESA_OMP_ROOT` 환경변수를 사용한다. + +MKL은 ILP64·dynamic·TBB threading으로 연결한다. Debug는 `mkl_tbb_threadd`와 +`tbb12_debug.dll`, Release는 `mkl_tbb_thread`와 `tbb12.dll`을 사용한다. CLI와 세 +테스트 실행 파일 곁에 같은 구성의 DLL을 준비한다. MKL용 `mkl_intel_thread`와 +`libiomp5md.dll`은 연결·복사하지 않으며 HDF5의 `libmmd.dll`은 별도로 유지한다. ## 주 개발 빌드와 직접 검사 diff --git a/docs/solver-core/README.md b/docs/solver-core/README.md index f0b9db6..1eb1719 100644 --- a/docs/solver-core/README.md +++ b/docs/solver-core/README.md @@ -51,9 +51,11 @@ Configure/build/test의 compiler·구성·build tree를 함께 맞추고 discove 직접 관리하는 [FESA.sln](../../FESA.sln)과 [msvc 지침](../../msvc/AGENTS.md)이 주 개발 빌드다. VS x64 개발 환경에서 저장소 root를 작업 디렉터리로 사용한다. v145 toolset과 로컬 -GoogleTest source checkout, MKL ILP64/dynamic/Intel threading·TBB·HDF5·OpenMP가 필요하다. +GoogleTest source checkout, MKL ILP64/dynamic/TBB threading·oneTBB·HDF5와 +HDF5용 Intel 수학 runtime(`libmmd.dll`)이 필요하다. `FESA_GTEST_SOURCE_DIR`, `FESA_MKL_ROOT`, `FESA_TBB_ROOT`, `FESA_HDF5_ROOT`, `FESA_OMP_ROOT`에 설치 root를 지정하거나 ignored `msvc/Fesa.Local.props`로 주입한다. +`FESA_OMP_ROOT`는 기존 변수명을 유지하며 현재 HDF5의 `libmmd.dll` 준비에 사용한다. 개인 설치 경로를 추적 파일에 고정하거나 dependency를 자동 다운로드하지 않는다. ```bat