From e2869ab8a2bd51582da226eeae6d03283edc9881 Mon Sep 17 00:00:00 2001 From: Vineeth Chelur Date: Tue, 5 May 2026 09:47:57 -0700 Subject: [PATCH 1/5] Fix QNN ETW logging, GQA seqlens_k underflow, and ep_weight_sharing_ctx_gen build - Downgrade QNN ETW profiling mismatch logs from ERROR to VERBOSE to prevent excessive telemetry events (~1 billion/week across Windows devices) - Add bounds checking in GQA attention to prevent size_t underflow when seqlens_k contains invalid data (fixes github.com/microsoft/onnxruntime/issues/27170) - Build ep_weight_sharing_ctx_gen for TensorRT, OpenVINO, and VitisAI in addition to QNN Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- cmake/onnxruntime_unittests.cmake | 4 ++-- .../cpu/bert/group_query_attention.cc | 19 ++++++++++++++----- .../qnn/builder/qnn_backend_manager.cc | 4 ++-- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/cmake/onnxruntime_unittests.cmake b/cmake/onnxruntime_unittests.cmake index 23eccb22476df..c32aa7f4ae75a 100644 --- a/cmake/onnxruntime_unittests.cmake +++ b/cmake/onnxruntime_unittests.cmake @@ -1609,8 +1609,8 @@ if (NOT onnxruntime_ENABLE_TRAINING_TORCH_INTEROP) endif() - - if(onnxruntime_USE_QNN) + # Build ep_weight_sharing_ctx_gen for all supported EPs (QNN, TensorRT, OpenVINO, VitisAI) + if(onnxruntime_USE_QNN OR onnxruntime_USE_TENSORRT OR onnxruntime_USE_OPENVINO OR onnxruntime_USE_VITISAI) #qnn ctx generator set(ep_weight_sharing_ctx_gen_src_dir ${TEST_SRC_DIR}/ep_weight_sharing_ctx_gen) set(ep_weight_sharing_ctx_gen_src_patterns diff --git a/onnxruntime/contrib_ops/cpu/bert/group_query_attention.cc b/onnxruntime/contrib_ops/cpu/bert/group_query_attention.cc index 61ae474703213..216e33fe2f2ae 100644 --- a/onnxruntime/contrib_ops/cpu/bert/group_query_attention.cc +++ b/onnxruntime/contrib_ops/cpu/bert/group_query_attention.cc @@ -239,11 +239,20 @@ Status GroupQueryAttention::Compute(OpKernelContext* context) const { for (int b = 0; b < batch_size; b++) { const int total_seqlen = seqlens_k->Data()[b] + 1; const int past_seqlen = total_seqlen - sequence_length; - for (int s = 0; s < sequence_length; s++) { - if (past_seqlen + s < total_seqlen) { - default_pos_ids[b * sequence_length + s] = static_cast(past_seqlen) + s; - } else { - default_pos_ids[b * sequence_length + s] = static_cast(1); + + // Handle inconsistent random data in seqlens_k, when past_seqlen becomes negative + if (past_seqlen < 0) { + // Fallback: generate consecutive position IDs starting from 0 + for (int s = 0; s < sequence_length; s++) { + default_pos_ids[b * sequence_length + s] = static_cast(s); + } + } else { + for (int s = 0; s < sequence_length; s++) { + if (past_seqlen + s < total_seqlen) { + default_pos_ids[b * sequence_length + s] = static_cast(past_seqlen) + s; + } else { + default_pos_ids[b * sequence_length + s] = static_cast(1); + } } } } diff --git a/onnxruntime/core/providers/qnn/builder/qnn_backend_manager.cc b/onnxruntime/core/providers/qnn/builder/qnn_backend_manager.cc index 5758ff3ad2847..e89803ec3c4c2 100644 --- a/onnxruntime/core/providers/qnn/builder/qnn_backend_manager.cc +++ b/onnxruntime/core/providers/qnn/builder/qnn_backend_manager.cc @@ -1871,13 +1871,13 @@ Status QnnBackendManager::ExtractBackendProfilingInfo(qnn::profile::ProfilingInf // ETW disabled previously, but enabled now if (ProfilingLevel::INVALID == profiling_level_etw_ && tracelogging_provider_ep_enabled) { - LOGS(*logger_, ERROR) << "ETW disabled previously, but enabled now. Can't do the switch! Won't output any profiling."; + LOGS(*logger_, VERBOSE) << "ETW disabled previously, but enabled now. Can't do the switch! Won't output any profiling."; return Status::OK(); } // ETW enabled previously, but disabled now if (ProfilingLevel::INVALID != profiling_level_etw_ && !tracelogging_provider_ep_enabled) { - LOGS(*logger_, ERROR) << "ETW enabled previously, but disabled now. Can't do the switch! Won't output any profiling."; + LOGS(*logger_, VERBOSE) << "ETW enabled previously, but disabled now. Can't do the switch! Won't output any profiling."; return Status::OK(); } From 6db7444740cf1926e6119c10e5f8653fa7faa054 Mon Sep 17 00:00:00 2001 From: Vineeth Chelur Date: Tue, 5 May 2026 09:48:29 -0700 Subject: [PATCH 2/5] Bump cpuinfo to include cpuinfo_deinitialize() and add ORT integration Bump pytorch/cpuinfo to crvineeth97/cpuinfo@df8c6a8 which implements cpuinfo_deinitialize() to properly free heap-allocated globals. This prevents memory leak reports from App Verifier, Valgrind, and sanitizers when ORT is dynamically loaded/unloaded. ORT integration: - Add CPUIDInfo::ShutDown() which calls cpuinfo_deinitialize() - Call ShutdownCpuInfo() from DllMain on DLL_PROCESS_DETACH - In memleak-check builds, also call shutdown during process termination The cpuinfo bump also includes upstream fixes that make three ORT patches redundant (removed): - patch_vcpkg_arm64ec_support.patch (pytorch/cpuinfo#324) - win_arm_fp16_detection_fallback.patch (pytorch/cpuinfo#348) - 0001-Add-implementation-for-cpuinfo_deinitialize.patch The patch_cpuinfo_h_for_arm64ec.patch is retained as it is not yet upstream in cpuinfo. Related: pytorch/cpuinfo#150, pytorch/cpuinfo#387 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- cmake/deps.txt | 2 +- .../external/onnxruntime_external_deps.cmake | 6 +- .../cpuinfo/patch_vcpkg_arm64ec_support.patch | 91 ------------------- .../win_arm_fp16_detection_fallback.patch | 19 ---- .../cpuinfo/patch_vcpkg_arm64ec_support.patch | 91 ------------------- cmake/vcpkg-ports/cpuinfo/portfile.cmake | 10 +- .../win_arm_fp16_detection_fallback.patch | 19 ---- onnxruntime/core/common/cpuid_info.cc | 11 +++ onnxruntime/core/common/cpuid_info.h | 23 ++++- onnxruntime/core/dll/dllmain.cc | 5 +- 10 files changed, 42 insertions(+), 235 deletions(-) delete mode 100644 cmake/patches/cpuinfo/patch_vcpkg_arm64ec_support.patch delete mode 100644 cmake/patches/cpuinfo/win_arm_fp16_detection_fallback.patch delete mode 100644 cmake/vcpkg-ports/cpuinfo/patch_vcpkg_arm64ec_support.patch delete mode 100644 cmake/vcpkg-ports/cpuinfo/win_arm_fp16_detection_fallback.patch diff --git a/cmake/deps.txt b/cmake/deps.txt index d8cd7713bfe65..b251573fd794e 100644 --- a/cmake/deps.txt +++ b/cmake/deps.txt @@ -47,7 +47,7 @@ protoc_mac_universal;https://github.com/protocolbuffers/protobuf/releases/downlo psimd;https://github.com/Maratyszcza/psimd/archive/072586a71b55b7f8c584153d223e95687148a900.zip;1f5454b01f06f9656b77e4a5e2e31d7422487013 pthreadpool;https://github.com/google/pthreadpool/archive/dcc9f28589066af0dbd4555579281230abbf74dd.zip;533a77943203ef15ca608bcd9dbe2c94da7451d2 pybind11;https://github.com/pybind/pybind11/archive/refs/tags/v3.0.2.zip;a064e663b4d7a337ac291d1bef7337ef4e60a1ae -pytorch_cpuinfo;https://github.com/pytorch/cpuinfo/archive/403d652dca4c1046e8145950b1c0997a9f748b57.zip;30b2a07fe4bae8574f89176e56274cacdd6d135b +pytorch_cpuinfo;https://github.com/crvineeth97/cpuinfo/archive/df8c6a8ce5cf12baabe5e7c9213aaeeffb18bd82.zip;34999b2434e49f1a66d50fb62f28663fb8c96881 re2;https://github.com/google/re2/archive/refs/tags/2024-07-02.zip;646e1728269cde7fcef990bf4a8e87b047882e88 safeint;https://github.com/dcleblanc/SafeInt/archive/refs/tags/3.0.28.zip;23f252040ff6cb9f1fd18575b32fa8fb5928daac tensorboard;https://github.com/tensorflow/tensorboard/archive/373eb09e4c5d2b3cc2493f0949dc4be6b6a45e81.zip;67b833913605a4f3f499894ab11528a702c2b381 diff --git a/cmake/external/onnxruntime_external_deps.cmake b/cmake/external/onnxruntime_external_deps.cmake index f523fefdd153a..400d581021cbf 100644 --- a/cmake/external/onnxruntime_external_deps.cmake +++ b/cmake/external/onnxruntime_external_deps.cmake @@ -369,11 +369,7 @@ if (CPUINFO_SUPPORTED) URL_HASH SHA1=${DEP_SHA1_pytorch_cpuinfo} EXCLUDE_FROM_ALL PATCH_COMMAND - ${Patch_EXECUTABLE} -p1 < ${PROJECT_SOURCE_DIR}/patches/cpuinfo/patch_cpuinfo_h_for_arm64ec.patch && - # https://github.com/pytorch/cpuinfo/pull/324 - ${Patch_EXECUTABLE} -p1 < ${PROJECT_SOURCE_DIR}/patches/cpuinfo/patch_vcpkg_arm64ec_support.patch && - # https://github.com/pytorch/cpuinfo/pull/348 - ${Patch_EXECUTABLE} -p1 < ${PROJECT_SOURCE_DIR}/patches/cpuinfo/win_arm_fp16_detection_fallback.patch + ${Patch_EXECUTABLE} -p1 < ${PROJECT_SOURCE_DIR}/patches/cpuinfo/patch_cpuinfo_h_for_arm64ec.patch FIND_PACKAGE_ARGS NAMES cpuinfo ) elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") diff --git a/cmake/patches/cpuinfo/patch_vcpkg_arm64ec_support.patch b/cmake/patches/cpuinfo/patch_vcpkg_arm64ec_support.patch deleted file mode 100644 index af0f039b6c2a3..0000000000000 --- a/cmake/patches/cpuinfo/patch_vcpkg_arm64ec_support.patch +++ /dev/null @@ -1,91 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index aedc983..dab589e 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -72,6 +72,17 @@ IF(CMAKE_SYSTEM_NAME MATCHES "FreeBSD" AND CPUINFO_TARGET_PROCESSOR STREQUAL "am - ENDIF() - IF(IS_APPLE_OS AND CMAKE_OSX_ARCHITECTURES MATCHES "^(x86_64|arm64.*)$") - SET(CPUINFO_TARGET_PROCESSOR "${CMAKE_OSX_ARCHITECTURES}") -+ELSEIF(MSVC AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.10") -+ # Use CMAKE_C_COMPILER_ARCHITECTURE_ID. MSVC values are documented as available since CMake 3.10. -+ IF(CMAKE_C_COMPILER_ARCHITECTURE_ID STREQUAL "X86") -+ SET(CPUINFO_TARGET_PROCESSOR "x86") -+ ELSEIF(CMAKE_C_COMPILER_ARCHITECTURE_ID STREQUAL "x64") -+ SET(CPUINFO_TARGET_PROCESSOR "x86_64") -+ ELSEIF(CMAKE_C_COMPILER_ARCHITECTURE_ID MATCHES "^(ARM64|ARM64EC)$") -+ SET(CPUINFO_TARGET_PROCESSOR "arm64") -+ ELSE() -+ MESSAGE(FATAL_ERROR "Unsupported MSVC compiler architecture ID \"${CMAKE_C_COMPILER_ARCHITECTURE_ID}\"") -+ ENDIF() - ELSEIF(CMAKE_GENERATOR MATCHES "^Visual Studio " AND CMAKE_VS_PLATFORM_NAME) - IF(CMAKE_VS_PLATFORM_NAME STREQUAL "Win32") - SET(CPUINFO_TARGET_PROCESSOR "x86") -@@ -88,7 +99,7 @@ ENDIF() - - # ---[ Build flags - SET(CPUINFO_SUPPORTED_PLATFORM TRUE) --IF(NOT CMAKE_SYSTEM_PROCESSOR) -+IF(NOT CPUINFO_TARGET_PROCESSOR) - IF(NOT IOS) - MESSAGE(WARNING - "Target processor architecture is not specified. " -@@ -201,12 +212,12 @@ IF(CPUINFO_SUPPORTED_PLATFORM) - src/arm/linux/chipset.c - src/arm/linux/midr.c - src/arm/linux/hwcap.c) -- IF(CMAKE_SYSTEM_PROCESSOR MATCHES "^armv[5-8]") -+ IF(CPUINFO_TARGET_PROCESSOR MATCHES "^armv[5-8]") - LIST(APPEND CPUINFO_SRCS src/arm/linux/aarch32-isa.c) - IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND ANDROID_ABI STREQUAL "armeabi") - SET_SOURCE_FILES_PROPERTIES(src/arm/linux/aarch32-isa.c PROPERTIES COMPILE_FLAGS -marm) - ENDIF() -- ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64)$") -+ ELSEIF(CPUINFO_TARGET_PROCESSOR MATCHES "^(aarch64|arm64)$") - LIST(APPEND CPUINFO_SRCS src/arm/linux/aarch64-isa.c) - ENDIF() - ELSEIF(IS_APPLE_OS AND CPUINFO_TARGET_PROCESSOR MATCHES "arm64.*") -@@ -395,7 +406,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_MOCK_TESTS) - TARGET_COMPILE_DEFINITIONS(cpuinfo_mock PRIVATE _GNU_SOURCE=1) - ENDIF() - -- IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv5te|armv7-a)$") -+ IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CPUINFO_TARGET_PROCESSOR MATCHES "^(armv5te|armv7-a)$") - ADD_EXECUTABLE(atm7029b-tablet-test test/mock/atm7029b-tablet.cc) - TARGET_INCLUDE_DIRECTORIES(atm7029b-tablet-test BEFORE PRIVATE test/mock) - TARGET_LINK_LIBRARIES(atm7029b-tablet-test PRIVATE cpuinfo_mock gtest) -@@ -577,7 +588,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_MOCK_TESTS) - ADD_TEST(NAME xperia-sl-test COMMAND xperia-sl-test) - ENDIF() - -- IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv5te|armv7-a|aarch64)$") -+ IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CPUINFO_TARGET_PROCESSOR MATCHES "^(armv5te|armv7-a|aarch64)$") - ADD_EXECUTABLE(alcatel-revvl-test test/mock/alcatel-revvl.cc) - TARGET_INCLUDE_DIRECTORIES(alcatel-revvl-test BEFORE PRIVATE test/mock) - TARGET_LINK_LIBRARIES(alcatel-revvl-test PRIVATE cpuinfo_mock gtest) -@@ -774,7 +785,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_MOCK_TESTS) - ADD_TEST(NAME xperia-c4-dual-test COMMAND xperia-c4-dual-test) - ENDIF() - -- IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(i686|x86_64)$") -+ IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CPUINFO_TARGET_PROCESSOR MATCHES "^(i686|x86_64)$") - ADD_EXECUTABLE(alldocube-iwork8-test test/mock/alldocube-iwork8.cc) - TARGET_INCLUDE_DIRECTORIES(alldocube-iwork8-test BEFORE PRIVATE test/mock) - TARGET_LINK_LIBRARIES(alldocube-iwork8-test PRIVATE cpuinfo_mock gtest) -@@ -831,7 +842,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_UNIT_TESTS) - ADD_TEST(NAME brand-string-test COMMAND brand-string-test) - ENDIF() - -- IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv[5-8].*|aarch64)$") -+ IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CPUINFO_TARGET_PROCESSOR MATCHES "^(armv[5-8].*|aarch64)$") - ADD_LIBRARY(android_properties_interface STATIC test/name/android-properties-interface.c) - CPUINFO_TARGET_ENABLE_C99(android_properties_interface) - CPUINFO_TARGET_RUNTIME_LIBRARY(android_properties_interface) -@@ -879,7 +890,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_TOOLS) - TARGET_LINK_LIBRARIES(cache-info PRIVATE cpuinfo) - INSTALL(TARGETS cache-info RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) - -- IF(CMAKE_SYSTEM_NAME MATCHES "^(Android|Linux)$" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv[5-8].*|aarch64)$") -+ IF(CMAKE_SYSTEM_NAME MATCHES "^(Android|Linux)$" AND CPUINFO_TARGET_PROCESSOR MATCHES "^(armv[5-8].*|aarch64)$") - ADD_EXECUTABLE(auxv-dump tools/auxv-dump.c) - CPUINFO_TARGET_ENABLE_C99(auxv-dump) - CPUINFO_TARGET_RUNTIME_LIBRARY(auxv-dump) diff --git a/cmake/patches/cpuinfo/win_arm_fp16_detection_fallback.patch b/cmake/patches/cpuinfo/win_arm_fp16_detection_fallback.patch deleted file mode 100644 index 44ac0f13f5466..0000000000000 --- a/cmake/patches/cpuinfo/win_arm_fp16_detection_fallback.patch +++ /dev/null @@ -1,19 +0,0 @@ -diff --git a/src/arm/windows/init.c b/src/arm/windows/init.c -index 5c0a5f3..a07fbe4 100644 ---- a/src/arm/windows/init.c -+++ b/src/arm/windows/init.c -@@ -249,6 +249,14 @@ static void set_cpuinfo_isa_fields(void) { - // guarantee that, but it holds in practice. - cpuinfo_isa.rdm = dotprod; - -+ // PF_ARM_V82_FP16_INSTRUCTIONS_AVAILABLE may not be available in older -+ // Windows versions. If fp16arith was not detected with -+ // IsProcessorFeaturePresent(PF_ARM_V82_FP16_INSTRUCTIONS_AVAILABLE), fall -+ // back to using the value of dotprod. -+ if (!cpuinfo_isa.fp16arith) { -+ cpuinfo_isa.fp16arith = dotprod; -+ } -+ - /* Windows API reports all or nothing for cryptographic instructions. */ - const bool crypto = IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE) != 0; - cpuinfo_isa.aes = crypto; diff --git a/cmake/vcpkg-ports/cpuinfo/patch_vcpkg_arm64ec_support.patch b/cmake/vcpkg-ports/cpuinfo/patch_vcpkg_arm64ec_support.patch deleted file mode 100644 index af0f039b6c2a3..0000000000000 --- a/cmake/vcpkg-ports/cpuinfo/patch_vcpkg_arm64ec_support.patch +++ /dev/null @@ -1,91 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index aedc983..dab589e 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -72,6 +72,17 @@ IF(CMAKE_SYSTEM_NAME MATCHES "FreeBSD" AND CPUINFO_TARGET_PROCESSOR STREQUAL "am - ENDIF() - IF(IS_APPLE_OS AND CMAKE_OSX_ARCHITECTURES MATCHES "^(x86_64|arm64.*)$") - SET(CPUINFO_TARGET_PROCESSOR "${CMAKE_OSX_ARCHITECTURES}") -+ELSEIF(MSVC AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.10") -+ # Use CMAKE_C_COMPILER_ARCHITECTURE_ID. MSVC values are documented as available since CMake 3.10. -+ IF(CMAKE_C_COMPILER_ARCHITECTURE_ID STREQUAL "X86") -+ SET(CPUINFO_TARGET_PROCESSOR "x86") -+ ELSEIF(CMAKE_C_COMPILER_ARCHITECTURE_ID STREQUAL "x64") -+ SET(CPUINFO_TARGET_PROCESSOR "x86_64") -+ ELSEIF(CMAKE_C_COMPILER_ARCHITECTURE_ID MATCHES "^(ARM64|ARM64EC)$") -+ SET(CPUINFO_TARGET_PROCESSOR "arm64") -+ ELSE() -+ MESSAGE(FATAL_ERROR "Unsupported MSVC compiler architecture ID \"${CMAKE_C_COMPILER_ARCHITECTURE_ID}\"") -+ ENDIF() - ELSEIF(CMAKE_GENERATOR MATCHES "^Visual Studio " AND CMAKE_VS_PLATFORM_NAME) - IF(CMAKE_VS_PLATFORM_NAME STREQUAL "Win32") - SET(CPUINFO_TARGET_PROCESSOR "x86") -@@ -88,7 +99,7 @@ ENDIF() - - # ---[ Build flags - SET(CPUINFO_SUPPORTED_PLATFORM TRUE) --IF(NOT CMAKE_SYSTEM_PROCESSOR) -+IF(NOT CPUINFO_TARGET_PROCESSOR) - IF(NOT IOS) - MESSAGE(WARNING - "Target processor architecture is not specified. " -@@ -201,12 +212,12 @@ IF(CPUINFO_SUPPORTED_PLATFORM) - src/arm/linux/chipset.c - src/arm/linux/midr.c - src/arm/linux/hwcap.c) -- IF(CMAKE_SYSTEM_PROCESSOR MATCHES "^armv[5-8]") -+ IF(CPUINFO_TARGET_PROCESSOR MATCHES "^armv[5-8]") - LIST(APPEND CPUINFO_SRCS src/arm/linux/aarch32-isa.c) - IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND ANDROID_ABI STREQUAL "armeabi") - SET_SOURCE_FILES_PROPERTIES(src/arm/linux/aarch32-isa.c PROPERTIES COMPILE_FLAGS -marm) - ENDIF() -- ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64)$") -+ ELSEIF(CPUINFO_TARGET_PROCESSOR MATCHES "^(aarch64|arm64)$") - LIST(APPEND CPUINFO_SRCS src/arm/linux/aarch64-isa.c) - ENDIF() - ELSEIF(IS_APPLE_OS AND CPUINFO_TARGET_PROCESSOR MATCHES "arm64.*") -@@ -395,7 +406,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_MOCK_TESTS) - TARGET_COMPILE_DEFINITIONS(cpuinfo_mock PRIVATE _GNU_SOURCE=1) - ENDIF() - -- IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv5te|armv7-a)$") -+ IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CPUINFO_TARGET_PROCESSOR MATCHES "^(armv5te|armv7-a)$") - ADD_EXECUTABLE(atm7029b-tablet-test test/mock/atm7029b-tablet.cc) - TARGET_INCLUDE_DIRECTORIES(atm7029b-tablet-test BEFORE PRIVATE test/mock) - TARGET_LINK_LIBRARIES(atm7029b-tablet-test PRIVATE cpuinfo_mock gtest) -@@ -577,7 +588,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_MOCK_TESTS) - ADD_TEST(NAME xperia-sl-test COMMAND xperia-sl-test) - ENDIF() - -- IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv5te|armv7-a|aarch64)$") -+ IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CPUINFO_TARGET_PROCESSOR MATCHES "^(armv5te|armv7-a|aarch64)$") - ADD_EXECUTABLE(alcatel-revvl-test test/mock/alcatel-revvl.cc) - TARGET_INCLUDE_DIRECTORIES(alcatel-revvl-test BEFORE PRIVATE test/mock) - TARGET_LINK_LIBRARIES(alcatel-revvl-test PRIVATE cpuinfo_mock gtest) -@@ -774,7 +785,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_MOCK_TESTS) - ADD_TEST(NAME xperia-c4-dual-test COMMAND xperia-c4-dual-test) - ENDIF() - -- IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(i686|x86_64)$") -+ IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CPUINFO_TARGET_PROCESSOR MATCHES "^(i686|x86_64)$") - ADD_EXECUTABLE(alldocube-iwork8-test test/mock/alldocube-iwork8.cc) - TARGET_INCLUDE_DIRECTORIES(alldocube-iwork8-test BEFORE PRIVATE test/mock) - TARGET_LINK_LIBRARIES(alldocube-iwork8-test PRIVATE cpuinfo_mock gtest) -@@ -831,7 +842,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_UNIT_TESTS) - ADD_TEST(NAME brand-string-test COMMAND brand-string-test) - ENDIF() - -- IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv[5-8].*|aarch64)$") -+ IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CPUINFO_TARGET_PROCESSOR MATCHES "^(armv[5-8].*|aarch64)$") - ADD_LIBRARY(android_properties_interface STATIC test/name/android-properties-interface.c) - CPUINFO_TARGET_ENABLE_C99(android_properties_interface) - CPUINFO_TARGET_RUNTIME_LIBRARY(android_properties_interface) -@@ -879,7 +890,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_TOOLS) - TARGET_LINK_LIBRARIES(cache-info PRIVATE cpuinfo) - INSTALL(TARGETS cache-info RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) - -- IF(CMAKE_SYSTEM_NAME MATCHES "^(Android|Linux)$" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv[5-8].*|aarch64)$") -+ IF(CMAKE_SYSTEM_NAME MATCHES "^(Android|Linux)$" AND CPUINFO_TARGET_PROCESSOR MATCHES "^(armv[5-8].*|aarch64)$") - ADD_EXECUTABLE(auxv-dump tools/auxv-dump.c) - CPUINFO_TARGET_ENABLE_C99(auxv-dump) - CPUINFO_TARGET_RUNTIME_LIBRARY(auxv-dump) diff --git a/cmake/vcpkg-ports/cpuinfo/portfile.cmake b/cmake/vcpkg-ports/cpuinfo/portfile.cmake index 67bd18e61cc28..a1ede19e26ded 100644 --- a/cmake/vcpkg-ports/cpuinfo/portfile.cmake +++ b/cmake/vcpkg-ports/cpuinfo/portfile.cmake @@ -5,14 +5,12 @@ endif() vcpkg_from_github( OUT_SOURCE_PATH SOURCE_PATH - REPO pytorch/cpuinfo - REF 403d652dca4c1046e8145950b1c0997a9f748b57 - SHA512 f7cd6dc44bd1120af610cae1337ed4c0f557ba78d2de9c73fed350fa3dfe9512643a1619ae55f5a540c6316a87d641856cca27297bb8766e48f39b7b7a59da1f - HEAD_REF master + REPO crvineeth97/cpuinfo + REF df8c6a8ce5cf12baabe5e7c9213aaeeffb18bd82 + SHA512 0 # TODO: update SHA512 after PR merges to pytorch/cpuinfo + HEAD_REF vchelur/add-cpuinfo-deinitialize PATCHES patch_cpuinfo_h_for_arm64ec.patch - patch_vcpkg_arm64ec_support.patch # https://github.com/pytorch/cpuinfo/pull/324 - win_arm_fp16_detection_fallback.patch # https://github.com/pytorch/cpuinfo/pull/348 ) vcpkg_check_features(OUT_FEATURE_OPTIONS FEATURE_OPTIONS diff --git a/cmake/vcpkg-ports/cpuinfo/win_arm_fp16_detection_fallback.patch b/cmake/vcpkg-ports/cpuinfo/win_arm_fp16_detection_fallback.patch deleted file mode 100644 index 44ac0f13f5466..0000000000000 --- a/cmake/vcpkg-ports/cpuinfo/win_arm_fp16_detection_fallback.patch +++ /dev/null @@ -1,19 +0,0 @@ -diff --git a/src/arm/windows/init.c b/src/arm/windows/init.c -index 5c0a5f3..a07fbe4 100644 ---- a/src/arm/windows/init.c -+++ b/src/arm/windows/init.c -@@ -249,6 +249,14 @@ static void set_cpuinfo_isa_fields(void) { - // guarantee that, but it holds in practice. - cpuinfo_isa.rdm = dotprod; - -+ // PF_ARM_V82_FP16_INSTRUCTIONS_AVAILABLE may not be available in older -+ // Windows versions. If fp16arith was not detected with -+ // IsProcessorFeaturePresent(PF_ARM_V82_FP16_INSTRUCTIONS_AVAILABLE), fall -+ // back to using the value of dotprod. -+ if (!cpuinfo_isa.fp16arith) { -+ cpuinfo_isa.fp16arith = dotprod; -+ } -+ - /* Windows API reports all or nothing for cryptographic instructions. */ - const bool crypto = IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE) != 0; - cpuinfo_isa.aes = crypto; diff --git a/onnxruntime/core/common/cpuid_info.cc b/onnxruntime/core/common/cpuid_info.cc index ebf3cc9f50be6..e76928fc67247 100644 --- a/onnxruntime/core/common/cpuid_info.cc +++ b/onnxruntime/core/common/cpuid_info.cc @@ -405,4 +405,15 @@ CPUIDInfo::CPUIDInfo() { #endif #endif // defined(CPUIDINFO_ARCH_RISCV64) } + +void CPUIDInfo::ShutDown() { +#if defined(CPUINFO_SUPPORTED) + static bool is_shutdown = false; + if (!is_shutdown && pytorch_cpuinfo_init_) { + cpuinfo_deinitialize(); + pytorch_cpuinfo_init_ = false; + is_shutdown = true; + } +#endif +} } // namespace onnxruntime diff --git a/onnxruntime/core/common/cpuid_info.h b/onnxruntime/core/common/cpuid_info.h index bf502c645c9eb..f3c0f48f62e4c 100644 --- a/onnxruntime/core/common/cpuid_info.h +++ b/onnxruntime/core/common/cpuid_info.h @@ -3,6 +3,7 @@ #pragma once +#include #include "core/common/common.h" #include "core/common/cpuid_arch_definition.h" @@ -11,8 +12,7 @@ namespace onnxruntime { class CPUIDInfo { public: static const CPUIDInfo& GetCPUIDInfo() { - static CPUIDInfo cpuid_info; - return cpuid_info; + return Instance(); } std::string_view GetCPUVendor() const { @@ -104,6 +104,12 @@ class CPUIDInfo { return has_fp16_; } + static void ShutdownCpuInfo() { + // Don't create the singleton during DLL unload. + if (!InstanceCreated().load(std::memory_order_acquire)) return; + Instance().ShutDown(); + } + private: // Log function that uses ORT logging if available or writes to stderr. // This enables us to log even before ORT logging has been initialized. @@ -111,6 +117,19 @@ class CPUIDInfo { CPUIDInfo(); + static std::atomic& InstanceCreated() { + static std::atomic created{false}; + return created; + } + + static CPUIDInfo& Instance() { + static CPUIDInfo cpuid_info; + InstanceCreated().store(true, std::memory_order_release); + return cpuid_info; + } + + void ShutDown(); + void VendorInfoInit(); #if defined(CPUIDINFO_ARCH_X86) diff --git a/onnxruntime/core/dll/dllmain.cc b/onnxruntime/core/dll/dllmain.cc index 9e50c6e07738f..f9f9b1c0237d8 100644 --- a/onnxruntime/core/dll/dllmain.cc +++ b/onnxruntime/core/dll/dllmain.cc @@ -9,6 +9,7 @@ #else #endif #include +#include "core/common/cpuid_info.h" #ifdef __GNUC__ #pragma GCC diagnostic pop #endif @@ -31,13 +32,15 @@ BOOL APIENTRY DllMain(HMODULE /*hModule*/, g_is_shutting_down = true; // do not do cleanup if process termination scenario #if defined(ONNXRUNTIME_ENABLE_MEMLEAK_CHECK) - // In leak-check builds we still want protobuf shutdown to avoid flagged leaks. + // In leak-check builds we still want protobuf and CPUInfo shutdown to avoid flagged leaks. ::google::protobuf::ShutdownProtobufLibrary(); + onnxruntime::CPUIDInfo::ShutdownCpuInfo(); #endif } else { // Cleanup protobuf library. // NOTE: it might be too early to do so, as all function local statics and global objects are not destroyed yet. ::google::protobuf::ShutdownProtobufLibrary(); + onnxruntime::CPUIDInfo::ShutdownCpuInfo(); } break; } From 630095870be61419e0c40270a504816c2c2eab61 Mon Sep 17 00:00:00 2001 From: Vineeth Chelur Date: Thu, 11 Jun 2026 17:35:10 -0700 Subject: [PATCH 3/5] Update to official cpuinfo merged fix --- cmake/deps.txt | 2 +- .../external/onnxruntime_external_deps.cmake | 4 +- .../cpuinfo/fix_missing_sysfs_fallback.patch | 58 ++++++++++-- .../cpuinfo/patch_vcpkg_arm64ec_support.patch | 91 +++++++++++++++++++ .../cpuinfo/patch_vcpkg_arm64ec_support.patch | 91 +++++++++++++++++++ cmake/vcpkg-ports/cpuinfo/portfile.cmake | 9 +- 6 files changed, 241 insertions(+), 14 deletions(-) create mode 100644 cmake/patches/cpuinfo/patch_vcpkg_arm64ec_support.patch create mode 100644 cmake/vcpkg-ports/cpuinfo/patch_vcpkg_arm64ec_support.patch diff --git a/cmake/deps.txt b/cmake/deps.txt index b251573fd794e..666c32633d5a9 100644 --- a/cmake/deps.txt +++ b/cmake/deps.txt @@ -47,7 +47,7 @@ protoc_mac_universal;https://github.com/protocolbuffers/protobuf/releases/downlo psimd;https://github.com/Maratyszcza/psimd/archive/072586a71b55b7f8c584153d223e95687148a900.zip;1f5454b01f06f9656b77e4a5e2e31d7422487013 pthreadpool;https://github.com/google/pthreadpool/archive/dcc9f28589066af0dbd4555579281230abbf74dd.zip;533a77943203ef15ca608bcd9dbe2c94da7451d2 pybind11;https://github.com/pybind/pybind11/archive/refs/tags/v3.0.2.zip;a064e663b4d7a337ac291d1bef7337ef4e60a1ae -pytorch_cpuinfo;https://github.com/crvineeth97/cpuinfo/archive/df8c6a8ce5cf12baabe5e7c9213aaeeffb18bd82.zip;34999b2434e49f1a66d50fb62f28663fb8c96881 +pytorch_cpuinfo;https://github.com/pytorch/cpuinfo/archive/4628dc060ce4e82345dc166bbac875609db4ff69.zip;e58d4b47c16a982111c897e669ae4f1821a393d7 re2;https://github.com/google/re2/archive/refs/tags/2024-07-02.zip;646e1728269cde7fcef990bf4a8e87b047882e88 safeint;https://github.com/dcleblanc/SafeInt/archive/refs/tags/3.0.28.zip;23f252040ff6cb9f1fd18575b32fa8fb5928daac tensorboard;https://github.com/tensorflow/tensorboard/archive/373eb09e4c5d2b3cc2493f0949dc4be6b6a45e81.zip;67b833913605a4f3f499894ab11528a702c2b381 diff --git a/cmake/external/onnxruntime_external_deps.cmake b/cmake/external/onnxruntime_external_deps.cmake index 400d581021cbf..a7813d42363e5 100644 --- a/cmake/external/onnxruntime_external_deps.cmake +++ b/cmake/external/onnxruntime_external_deps.cmake @@ -369,7 +369,9 @@ if (CPUINFO_SUPPORTED) URL_HASH SHA1=${DEP_SHA1_pytorch_cpuinfo} EXCLUDE_FROM_ALL PATCH_COMMAND - ${Patch_EXECUTABLE} -p1 < ${PROJECT_SOURCE_DIR}/patches/cpuinfo/patch_cpuinfo_h_for_arm64ec.patch + ${Patch_EXECUTABLE} -p1 < ${PROJECT_SOURCE_DIR}/patches/cpuinfo/patch_cpuinfo_h_for_arm64ec.patch && + # https://github.com/pytorch/cpuinfo/pull/324 + ${Patch_EXECUTABLE} -p1 < ${PROJECT_SOURCE_DIR}/patches/cpuinfo/patch_vcpkg_arm64ec_support.patch FIND_PACKAGE_ARGS NAMES cpuinfo ) elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") diff --git a/cmake/patches/cpuinfo/fix_missing_sysfs_fallback.patch b/cmake/patches/cpuinfo/fix_missing_sysfs_fallback.patch index 005cd458fdd2b..47a1054e25107 100644 --- a/cmake/patches/cpuinfo/fix_missing_sysfs_fallback.patch +++ b/cmake/patches/cpuinfo/fix_missing_sysfs_fallback.patch @@ -1,10 +1,19 @@ diff --git a/src/linux/processors.c b/src/linux/processors.c -index 47bee76..d0c5569 100644 +index fd040a3..2ca8ec4 100644 --- a/src/linux/processors.c +++ b/src/linux/processors.c -@@ -2,0 +3 @@ +@@ -3,6 +3,7 @@ + #include + #include + #include +#include -@@ -291,0 +293,22 @@ + + #if !defined(__ANDROID__) + /* +@@ -289,6 +290,28 @@ static bool max_processor_number_parser(uint32_t processor_list_start, uint32_t + return true; + } + +static uint32_t cpuinfo_linux_get_max_processor_from_sysconf( + uint32_t max_processors_count, + const char* processor_list_name) { @@ -27,13 +36,31 @@ index 47bee76..d0c5569 100644 + return max_processor; +} + -@@ -301 +324 @@ + uint32_t cpuinfo_linux_get_max_possible_processor(uint32_t max_processors_count) { + uint32_t max_possible_processor = 0; + if (!cpuinfo_linux_parse_cpulist( +@@ -298,7 +321,7 @@ uint32_t cpuinfo_linux_get_max_possible_processor(uint32_t max_processors_count) + #else + cpuinfo_log_warning("failed to parse the list of possible processors in %s", POSSIBLE_CPULIST_FILENAME); + #endif - return UINT32_MAX; + return cpuinfo_linux_get_max_processor_from_sysconf(max_processors_count, POSSIBLE_CPULIST_FILENAME); -@@ -323 +346 @@ + } + if (max_possible_processor >= max_processors_count) { + cpuinfo_log_warning( +@@ -320,7 +343,7 @@ uint32_t cpuinfo_linux_get_max_present_processor(uint32_t max_processors_count) + #else + cpuinfo_log_warning("failed to parse the list of present processors in %s", PRESENT_CPULIST_FILENAME); + #endif - return UINT32_MAX; + return cpuinfo_linux_get_max_processor_from_sysconf(max_processors_count, PRESENT_CPULIST_FILENAME); -@@ -357,0 +381,31 @@ + } + if (max_present_processor >= max_processors_count) { + cpuinfo_log_warning( +@@ -355,6 +378,37 @@ static bool detect_processor_parser(uint32_t processor_list_start, uint32_t proc + return true; + } + +static bool cpuinfo_linux_detect_processors_from_sysconf( + uint32_t max_processors_count, + uint32_t* processor0_flags, @@ -65,7 +92,13 @@ index 47bee76..d0c5569 100644 + return true; +} + -@@ -373 +427,6 @@ + bool cpuinfo_linux_detect_possible_processors( + uint32_t max_processors_count, + uint32_t* processor0_flags, +@@ -370,7 +424,12 @@ bool cpuinfo_linux_detect_possible_processors( + return true; + } else { + cpuinfo_log_warning("failed to parse the list of possible processors in %s", POSSIBLE_CPULIST_FILENAME); - return false; + return cpuinfo_linux_detect_processors_from_sysconf( + max_processors_count, @@ -73,7 +106,13 @@ index 47bee76..d0c5569 100644 + processor_struct_size, + possible_flag, + POSSIBLE_CPULIST_FILENAME); -@@ -392 +451,6 @@ + } + } + +@@ -389,7 +448,12 @@ bool cpuinfo_linux_detect_present_processors( + return true; + } else { + cpuinfo_log_warning("failed to parse the list of present processors in %s", PRESENT_CPULIST_FILENAME); - return false; + return cpuinfo_linux_detect_processors_from_sysconf( + max_processors_count, @@ -81,3 +120,6 @@ index 47bee76..d0c5569 100644 + processor_struct_size, + present_flag, + PRESENT_CPULIST_FILENAME); + } + } + diff --git a/cmake/patches/cpuinfo/patch_vcpkg_arm64ec_support.patch b/cmake/patches/cpuinfo/patch_vcpkg_arm64ec_support.patch new file mode 100644 index 0000000000000..18ed80f7944f8 --- /dev/null +++ b/cmake/patches/cpuinfo/patch_vcpkg_arm64ec_support.patch @@ -0,0 +1,91 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 072c987..e43d6ab 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -72,6 +72,17 @@ IF(CMAKE_SYSTEM_NAME MATCHES "FreeBSD" AND CPUINFO_TARGET_PROCESSOR STREQUAL "am + ENDIF() + IF(IS_APPLE_OS AND CMAKE_OSX_ARCHITECTURES MATCHES "^(x86_64|arm64.*)$") + SET(CPUINFO_TARGET_PROCESSOR "${CMAKE_OSX_ARCHITECTURES}") ++ELSEIF(MSVC AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.10") ++ # Use CMAKE_C_COMPILER_ARCHITECTURE_ID for non-VS generators (e.g. Ninja) with MSVC. ++ IF(CMAKE_C_COMPILER_ARCHITECTURE_ID STREQUAL "X86") ++ SET(CPUINFO_TARGET_PROCESSOR "x86") ++ ELSEIF(CMAKE_C_COMPILER_ARCHITECTURE_ID STREQUAL "x64") ++ SET(CPUINFO_TARGET_PROCESSOR "x86_64") ++ ELSEIF(CMAKE_C_COMPILER_ARCHITECTURE_ID MATCHES "^(ARM64|ARM64EC)$") ++ SET(CPUINFO_TARGET_PROCESSOR "arm64") ++ ELSE() ++ MESSAGE(FATAL_ERROR "Unsupported MSVC compiler architecture ID \"${CMAKE_C_COMPILER_ARCHITECTURE_ID}\"") ++ ENDIF() + ELSEIF(CMAKE_GENERATOR MATCHES "^Visual Studio " AND CMAKE_VS_PLATFORM_NAME) + IF(CMAKE_VS_PLATFORM_NAME STREQUAL "Win32") + SET(CPUINFO_TARGET_PROCESSOR "x86") +@@ -88,7 +99,7 @@ ENDIF() + + # ---[ Build flags + SET(CPUINFO_SUPPORTED_PLATFORM TRUE) +-IF(NOT CMAKE_SYSTEM_PROCESSOR) ++IF(NOT CPUINFO_TARGET_PROCESSOR) + IF(NOT IOS) + MESSAGE(WARNING + "Target processor architecture is not specified. " +@@ -201,12 +212,12 @@ IF(CPUINFO_SUPPORTED_PLATFORM) + src/arm/linux/chipset.c + src/arm/linux/midr.c + src/arm/linux/hwcap.c) +- IF(CMAKE_SYSTEM_PROCESSOR MATCHES "^armv[5-8]") ++ IF(CPUINFO_TARGET_PROCESSOR MATCHES "^armv[5-8]") + LIST(APPEND CPUINFO_SRCS src/arm/linux/aarch32-isa.c) + IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND ANDROID_ABI STREQUAL "armeabi") + SET_SOURCE_FILES_PROPERTIES(src/arm/linux/aarch32-isa.c PROPERTIES COMPILE_FLAGS -marm) + ENDIF() +- ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64)$") ++ ELSEIF(CPUINFO_TARGET_PROCESSOR MATCHES "^(aarch64|arm64)$") + LIST(APPEND CPUINFO_SRCS src/arm/linux/aarch64-isa.c) + ENDIF() + ELSEIF(IS_APPLE_OS AND CPUINFO_TARGET_PROCESSOR MATCHES "arm64.*") +@@ -395,7 +406,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_MOCK_TESTS) + TARGET_COMPILE_DEFINITIONS(cpuinfo_mock PRIVATE _GNU_SOURCE=1) + ENDIF() + +- IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv5te|armv7-a)$") ++ IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CPUINFO_TARGET_PROCESSOR MATCHES "^(armv5te|armv7-a)$") + ADD_EXECUTABLE(atm7029b-tablet-test test/mock/atm7029b-tablet.cc) + TARGET_INCLUDE_DIRECTORIES(atm7029b-tablet-test BEFORE PRIVATE test/mock) + TARGET_LINK_LIBRARIES(atm7029b-tablet-test PRIVATE cpuinfo_mock gtest) +@@ -577,7 +588,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_MOCK_TESTS) + ADD_TEST(NAME xperia-sl-test COMMAND xperia-sl-test) + ENDIF() + +- IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv5te|armv7-a|aarch64)$") ++ IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CPUINFO_TARGET_PROCESSOR MATCHES "^(armv5te|armv7-a|aarch64)$") + ADD_EXECUTABLE(alcatel-revvl-test test/mock/alcatel-revvl.cc) + TARGET_INCLUDE_DIRECTORIES(alcatel-revvl-test BEFORE PRIVATE test/mock) + TARGET_LINK_LIBRARIES(alcatel-revvl-test PRIVATE cpuinfo_mock gtest) +@@ -774,7 +785,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_MOCK_TESTS) + ADD_TEST(NAME xperia-c4-dual-test COMMAND xperia-c4-dual-test) + ENDIF() + +- IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(i686|x86_64)$") ++ IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CPUINFO_TARGET_PROCESSOR MATCHES "^(i686|x86_64)$") + ADD_EXECUTABLE(alldocube-iwork8-test test/mock/alldocube-iwork8.cc) + TARGET_INCLUDE_DIRECTORIES(alldocube-iwork8-test BEFORE PRIVATE test/mock) + TARGET_LINK_LIBRARIES(alldocube-iwork8-test PRIVATE cpuinfo_mock gtest) +@@ -831,7 +842,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_UNIT_TESTS) + ADD_TEST(NAME brand-string-test COMMAND brand-string-test) + ENDIF() + +- IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv[5-8].*|aarch64)$") ++ IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CPUINFO_TARGET_PROCESSOR MATCHES "^(armv[5-8].*|aarch64)$") + ADD_LIBRARY(android_properties_interface STATIC test/name/android-properties-interface.c) + CPUINFO_TARGET_ENABLE_C99(android_properties_interface) + CPUINFO_TARGET_RUNTIME_LIBRARY(android_properties_interface) +@@ -879,7 +890,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_TOOLS) + TARGET_LINK_LIBRARIES(cache-info PRIVATE cpuinfo) + INSTALL(TARGETS cache-info RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + +- IF(CMAKE_SYSTEM_NAME MATCHES "^(Android|Linux)$" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv[5-8].*|aarch64)$") ++ IF(CMAKE_SYSTEM_NAME MATCHES "^(Android|Linux)$" AND CPUINFO_TARGET_PROCESSOR MATCHES "^(armv[5-8].*|aarch64)$") + ADD_EXECUTABLE(auxv-dump tools/auxv-dump.c) + CPUINFO_TARGET_ENABLE_C99(auxv-dump) + CPUINFO_TARGET_RUNTIME_LIBRARY(auxv-dump) diff --git a/cmake/vcpkg-ports/cpuinfo/patch_vcpkg_arm64ec_support.patch b/cmake/vcpkg-ports/cpuinfo/patch_vcpkg_arm64ec_support.patch new file mode 100644 index 0000000000000..18ed80f7944f8 --- /dev/null +++ b/cmake/vcpkg-ports/cpuinfo/patch_vcpkg_arm64ec_support.patch @@ -0,0 +1,91 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 072c987..e43d6ab 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -72,6 +72,17 @@ IF(CMAKE_SYSTEM_NAME MATCHES "FreeBSD" AND CPUINFO_TARGET_PROCESSOR STREQUAL "am + ENDIF() + IF(IS_APPLE_OS AND CMAKE_OSX_ARCHITECTURES MATCHES "^(x86_64|arm64.*)$") + SET(CPUINFO_TARGET_PROCESSOR "${CMAKE_OSX_ARCHITECTURES}") ++ELSEIF(MSVC AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.10") ++ # Use CMAKE_C_COMPILER_ARCHITECTURE_ID for non-VS generators (e.g. Ninja) with MSVC. ++ IF(CMAKE_C_COMPILER_ARCHITECTURE_ID STREQUAL "X86") ++ SET(CPUINFO_TARGET_PROCESSOR "x86") ++ ELSEIF(CMAKE_C_COMPILER_ARCHITECTURE_ID STREQUAL "x64") ++ SET(CPUINFO_TARGET_PROCESSOR "x86_64") ++ ELSEIF(CMAKE_C_COMPILER_ARCHITECTURE_ID MATCHES "^(ARM64|ARM64EC)$") ++ SET(CPUINFO_TARGET_PROCESSOR "arm64") ++ ELSE() ++ MESSAGE(FATAL_ERROR "Unsupported MSVC compiler architecture ID \"${CMAKE_C_COMPILER_ARCHITECTURE_ID}\"") ++ ENDIF() + ELSEIF(CMAKE_GENERATOR MATCHES "^Visual Studio " AND CMAKE_VS_PLATFORM_NAME) + IF(CMAKE_VS_PLATFORM_NAME STREQUAL "Win32") + SET(CPUINFO_TARGET_PROCESSOR "x86") +@@ -88,7 +99,7 @@ ENDIF() + + # ---[ Build flags + SET(CPUINFO_SUPPORTED_PLATFORM TRUE) +-IF(NOT CMAKE_SYSTEM_PROCESSOR) ++IF(NOT CPUINFO_TARGET_PROCESSOR) + IF(NOT IOS) + MESSAGE(WARNING + "Target processor architecture is not specified. " +@@ -201,12 +212,12 @@ IF(CPUINFO_SUPPORTED_PLATFORM) + src/arm/linux/chipset.c + src/arm/linux/midr.c + src/arm/linux/hwcap.c) +- IF(CMAKE_SYSTEM_PROCESSOR MATCHES "^armv[5-8]") ++ IF(CPUINFO_TARGET_PROCESSOR MATCHES "^armv[5-8]") + LIST(APPEND CPUINFO_SRCS src/arm/linux/aarch32-isa.c) + IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND ANDROID_ABI STREQUAL "armeabi") + SET_SOURCE_FILES_PROPERTIES(src/arm/linux/aarch32-isa.c PROPERTIES COMPILE_FLAGS -marm) + ENDIF() +- ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64)$") ++ ELSEIF(CPUINFO_TARGET_PROCESSOR MATCHES "^(aarch64|arm64)$") + LIST(APPEND CPUINFO_SRCS src/arm/linux/aarch64-isa.c) + ENDIF() + ELSEIF(IS_APPLE_OS AND CPUINFO_TARGET_PROCESSOR MATCHES "arm64.*") +@@ -395,7 +406,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_MOCK_TESTS) + TARGET_COMPILE_DEFINITIONS(cpuinfo_mock PRIVATE _GNU_SOURCE=1) + ENDIF() + +- IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv5te|armv7-a)$") ++ IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CPUINFO_TARGET_PROCESSOR MATCHES "^(armv5te|armv7-a)$") + ADD_EXECUTABLE(atm7029b-tablet-test test/mock/atm7029b-tablet.cc) + TARGET_INCLUDE_DIRECTORIES(atm7029b-tablet-test BEFORE PRIVATE test/mock) + TARGET_LINK_LIBRARIES(atm7029b-tablet-test PRIVATE cpuinfo_mock gtest) +@@ -577,7 +588,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_MOCK_TESTS) + ADD_TEST(NAME xperia-sl-test COMMAND xperia-sl-test) + ENDIF() + +- IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv5te|armv7-a|aarch64)$") ++ IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CPUINFO_TARGET_PROCESSOR MATCHES "^(armv5te|armv7-a|aarch64)$") + ADD_EXECUTABLE(alcatel-revvl-test test/mock/alcatel-revvl.cc) + TARGET_INCLUDE_DIRECTORIES(alcatel-revvl-test BEFORE PRIVATE test/mock) + TARGET_LINK_LIBRARIES(alcatel-revvl-test PRIVATE cpuinfo_mock gtest) +@@ -774,7 +785,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_MOCK_TESTS) + ADD_TEST(NAME xperia-c4-dual-test COMMAND xperia-c4-dual-test) + ENDIF() + +- IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(i686|x86_64)$") ++ IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CPUINFO_TARGET_PROCESSOR MATCHES "^(i686|x86_64)$") + ADD_EXECUTABLE(alldocube-iwork8-test test/mock/alldocube-iwork8.cc) + TARGET_INCLUDE_DIRECTORIES(alldocube-iwork8-test BEFORE PRIVATE test/mock) + TARGET_LINK_LIBRARIES(alldocube-iwork8-test PRIVATE cpuinfo_mock gtest) +@@ -831,7 +842,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_UNIT_TESTS) + ADD_TEST(NAME brand-string-test COMMAND brand-string-test) + ENDIF() + +- IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv[5-8].*|aarch64)$") ++ IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CPUINFO_TARGET_PROCESSOR MATCHES "^(armv[5-8].*|aarch64)$") + ADD_LIBRARY(android_properties_interface STATIC test/name/android-properties-interface.c) + CPUINFO_TARGET_ENABLE_C99(android_properties_interface) + CPUINFO_TARGET_RUNTIME_LIBRARY(android_properties_interface) +@@ -879,7 +890,7 @@ IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_TOOLS) + TARGET_LINK_LIBRARIES(cache-info PRIVATE cpuinfo) + INSTALL(TARGETS cache-info RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + +- IF(CMAKE_SYSTEM_NAME MATCHES "^(Android|Linux)$" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv[5-8].*|aarch64)$") ++ IF(CMAKE_SYSTEM_NAME MATCHES "^(Android|Linux)$" AND CPUINFO_TARGET_PROCESSOR MATCHES "^(armv[5-8].*|aarch64)$") + ADD_EXECUTABLE(auxv-dump tools/auxv-dump.c) + CPUINFO_TARGET_ENABLE_C99(auxv-dump) + CPUINFO_TARGET_RUNTIME_LIBRARY(auxv-dump) diff --git a/cmake/vcpkg-ports/cpuinfo/portfile.cmake b/cmake/vcpkg-ports/cpuinfo/portfile.cmake index a1ede19e26ded..9140a233e2ccd 100644 --- a/cmake/vcpkg-ports/cpuinfo/portfile.cmake +++ b/cmake/vcpkg-ports/cpuinfo/portfile.cmake @@ -5,12 +5,13 @@ endif() vcpkg_from_github( OUT_SOURCE_PATH SOURCE_PATH - REPO crvineeth97/cpuinfo - REF df8c6a8ce5cf12baabe5e7c9213aaeeffb18bd82 - SHA512 0 # TODO: update SHA512 after PR merges to pytorch/cpuinfo - HEAD_REF vchelur/add-cpuinfo-deinitialize + REPO pytorch/cpuinfo + REF 4628dc060ce4e82345dc166bbac875609db4ff69 + SHA512 db7a93279f2f6daaf825fbd8552935d8ed671d276b65ad614e11f722b6a6848e663850d65180d33b554d67ef1a36aae842feb368699f90be8f21172a1af1924e + HEAD_REF main PATCHES patch_cpuinfo_h_for_arm64ec.patch + patch_vcpkg_arm64ec_support.patch # https://github.com/pytorch/cpuinfo/pull/324 ) vcpkg_check_features(OUT_FEATURE_OPTIONS FEATURE_OPTIONS From ec1b14ca2ebc97dd13bd3f430bf8e6a474d71c16 Mon Sep 17 00:00:00 2001 From: Vineeth Chelur Date: Thu, 18 Jun 2026 13:38:45 -0700 Subject: [PATCH 4/5] Address comments --- .../cpu/bert/group_query_attention.cc | 19 +++++-------------- onnxruntime/core/common/cpuid_info.cc | 6 ++---- onnxruntime/core/common/cpuid_info.h | 9 +++++++-- onnxruntime/core/dll/dllmain.cc | 2 +- .../qnn/builder/qnn_backend_manager.cc | 4 ++-- 5 files changed, 17 insertions(+), 23 deletions(-) diff --git a/onnxruntime/contrib_ops/cpu/bert/group_query_attention.cc b/onnxruntime/contrib_ops/cpu/bert/group_query_attention.cc index 216e33fe2f2ae..61ae474703213 100644 --- a/onnxruntime/contrib_ops/cpu/bert/group_query_attention.cc +++ b/onnxruntime/contrib_ops/cpu/bert/group_query_attention.cc @@ -239,20 +239,11 @@ Status GroupQueryAttention::Compute(OpKernelContext* context) const { for (int b = 0; b < batch_size; b++) { const int total_seqlen = seqlens_k->Data()[b] + 1; const int past_seqlen = total_seqlen - sequence_length; - - // Handle inconsistent random data in seqlens_k, when past_seqlen becomes negative - if (past_seqlen < 0) { - // Fallback: generate consecutive position IDs starting from 0 - for (int s = 0; s < sequence_length; s++) { - default_pos_ids[b * sequence_length + s] = static_cast(s); - } - } else { - for (int s = 0; s < sequence_length; s++) { - if (past_seqlen + s < total_seqlen) { - default_pos_ids[b * sequence_length + s] = static_cast(past_seqlen) + s; - } else { - default_pos_ids[b * sequence_length + s] = static_cast(1); - } + for (int s = 0; s < sequence_length; s++) { + if (past_seqlen + s < total_seqlen) { + default_pos_ids[b * sequence_length + s] = static_cast(past_seqlen) + s; + } else { + default_pos_ids[b * sequence_length + s] = static_cast(1); } } } diff --git a/onnxruntime/core/common/cpuid_info.cc b/onnxruntime/core/common/cpuid_info.cc index e76928fc67247..3e639fa38208c 100644 --- a/onnxruntime/core/common/cpuid_info.cc +++ b/onnxruntime/core/common/cpuid_info.cc @@ -406,13 +406,11 @@ CPUIDInfo::CPUIDInfo() { #endif // defined(CPUIDINFO_ARCH_RISCV64) } -void CPUIDInfo::ShutDown() { +void CPUIDInfo::Shutdown() { #if defined(CPUINFO_SUPPORTED) - static bool is_shutdown = false; - if (!is_shutdown && pytorch_cpuinfo_init_) { + if (pytorch_cpuinfo_init_) { cpuinfo_deinitialize(); pytorch_cpuinfo_init_ = false; - is_shutdown = true; } #endif } diff --git a/onnxruntime/core/common/cpuid_info.h b/onnxruntime/core/common/cpuid_info.h index f3c0f48f62e4c..5f4af4c0b7c36 100644 --- a/onnxruntime/core/common/cpuid_info.h +++ b/onnxruntime/core/common/cpuid_info.h @@ -104,10 +104,15 @@ class CPUIDInfo { return has_fp16_; } + /** + * @brief Releases resources allocated by cpuinfo. Call during DLL/process teardown only. + * After this call, GetCPUIDInfo() must not be called — behavior is undefined. + * Use this instead of GetCPUIDInfo().Shutdown() to avoid creating the singleton during unload. + */ static void ShutdownCpuInfo() { // Don't create the singleton during DLL unload. if (!InstanceCreated().load(std::memory_order_acquire)) return; - Instance().ShutDown(); + Instance().Shutdown(); } private: @@ -128,7 +133,7 @@ class CPUIDInfo { return cpuid_info; } - void ShutDown(); + void Shutdown(); void VendorInfoInit(); diff --git a/onnxruntime/core/dll/dllmain.cc b/onnxruntime/core/dll/dllmain.cc index f9f9b1c0237d8..7ad9c906641db 100644 --- a/onnxruntime/core/dll/dllmain.cc +++ b/onnxruntime/core/dll/dllmain.cc @@ -37,7 +37,7 @@ BOOL APIENTRY DllMain(HMODULE /*hModule*/, onnxruntime::CPUIDInfo::ShutdownCpuInfo(); #endif } else { - // Cleanup protobuf library. + // Cleanup protobuf library and cpuinfo. // NOTE: it might be too early to do so, as all function local statics and global objects are not destroyed yet. ::google::protobuf::ShutdownProtobufLibrary(); onnxruntime::CPUIDInfo::ShutdownCpuInfo(); diff --git a/onnxruntime/core/providers/qnn/builder/qnn_backend_manager.cc b/onnxruntime/core/providers/qnn/builder/qnn_backend_manager.cc index e89803ec3c4c2..f586fc8e117a6 100644 --- a/onnxruntime/core/providers/qnn/builder/qnn_backend_manager.cc +++ b/onnxruntime/core/providers/qnn/builder/qnn_backend_manager.cc @@ -1871,13 +1871,13 @@ Status QnnBackendManager::ExtractBackendProfilingInfo(qnn::profile::ProfilingInf // ETW disabled previously, but enabled now if (ProfilingLevel::INVALID == profiling_level_etw_ && tracelogging_provider_ep_enabled) { - LOGS(*logger_, VERBOSE) << "ETW disabled previously, but enabled now. Can't do the switch! Won't output any profiling."; + LOGS(*logger_, WARNING) << "ETW disabled previously, but enabled now. Can't do the switch! Won't output any profiling."; return Status::OK(); } // ETW enabled previously, but disabled now if (ProfilingLevel::INVALID != profiling_level_etw_ && !tracelogging_provider_ep_enabled) { - LOGS(*logger_, VERBOSE) << "ETW enabled previously, but disabled now. Can't do the switch! Won't output any profiling."; + LOGS(*logger_, WARNING) << "ETW enabled previously, but disabled now. Can't do the switch! Won't output any profiling."; return Status::OK(); } From cae9388a8726f1adf144fdb86ad95385150fd6b5 Mon Sep 17 00:00:00 2001 From: Vineeth Chelur Date: Wed, 24 Jun 2026 14:23:40 -0700 Subject: [PATCH 5/5] Use CPUIDInfo and PosixEnv desturctors to deinit CPUInfo --- onnxruntime/core/common/cpuid_info.cc | 2 +- onnxruntime/core/common/cpuid_info.h | 29 +++----------------------- onnxruntime/core/dll/dllmain.cc | 7 ++----- onnxruntime/core/platform/posix/env.cc | 5 +++++ 4 files changed, 11 insertions(+), 32 deletions(-) diff --git a/onnxruntime/core/common/cpuid_info.cc b/onnxruntime/core/common/cpuid_info.cc index 3e639fa38208c..ec5c1386e8336 100644 --- a/onnxruntime/core/common/cpuid_info.cc +++ b/onnxruntime/core/common/cpuid_info.cc @@ -406,7 +406,7 @@ CPUIDInfo::CPUIDInfo() { #endif // defined(CPUIDINFO_ARCH_RISCV64) } -void CPUIDInfo::Shutdown() { +CPUIDInfo::~CPUIDInfo() { #if defined(CPUINFO_SUPPORTED) if (pytorch_cpuinfo_init_) { cpuinfo_deinitialize(); diff --git a/onnxruntime/core/common/cpuid_info.h b/onnxruntime/core/common/cpuid_info.h index 5f4af4c0b7c36..6eed234332f46 100644 --- a/onnxruntime/core/common/cpuid_info.h +++ b/onnxruntime/core/common/cpuid_info.h @@ -3,7 +3,6 @@ #pragma once -#include #include "core/common/common.h" #include "core/common/cpuid_arch_definition.h" @@ -12,7 +11,8 @@ namespace onnxruntime { class CPUIDInfo { public: static const CPUIDInfo& GetCPUIDInfo() { - return Instance(); + static CPUIDInfo cpuid_info; + return cpuid_info; } std::string_view GetCPUVendor() const { @@ -104,36 +104,13 @@ class CPUIDInfo { return has_fp16_; } - /** - * @brief Releases resources allocated by cpuinfo. Call during DLL/process teardown only. - * After this call, GetCPUIDInfo() must not be called — behavior is undefined. - * Use this instead of GetCPUIDInfo().Shutdown() to avoid creating the singleton during unload. - */ - static void ShutdownCpuInfo() { - // Don't create the singleton during DLL unload. - if (!InstanceCreated().load(std::memory_order_acquire)) return; - Instance().Shutdown(); - } - private: // Log function that uses ORT logging if available or writes to stderr. // This enables us to log even before ORT logging has been initialized. static void LogEarlyWarning(std::string_view message); CPUIDInfo(); - - static std::atomic& InstanceCreated() { - static std::atomic created{false}; - return created; - } - - static CPUIDInfo& Instance() { - static CPUIDInfo cpuid_info; - InstanceCreated().store(true, std::memory_order_release); - return cpuid_info; - } - - void Shutdown(); + ~CPUIDInfo(); void VendorInfoInit(); diff --git a/onnxruntime/core/dll/dllmain.cc b/onnxruntime/core/dll/dllmain.cc index 7ad9c906641db..9e50c6e07738f 100644 --- a/onnxruntime/core/dll/dllmain.cc +++ b/onnxruntime/core/dll/dllmain.cc @@ -9,7 +9,6 @@ #else #endif #include -#include "core/common/cpuid_info.h" #ifdef __GNUC__ #pragma GCC diagnostic pop #endif @@ -32,15 +31,13 @@ BOOL APIENTRY DllMain(HMODULE /*hModule*/, g_is_shutting_down = true; // do not do cleanup if process termination scenario #if defined(ONNXRUNTIME_ENABLE_MEMLEAK_CHECK) - // In leak-check builds we still want protobuf and CPUInfo shutdown to avoid flagged leaks. + // In leak-check builds we still want protobuf shutdown to avoid flagged leaks. ::google::protobuf::ShutdownProtobufLibrary(); - onnxruntime::CPUIDInfo::ShutdownCpuInfo(); #endif } else { - // Cleanup protobuf library and cpuinfo. + // Cleanup protobuf library. // NOTE: it might be too early to do so, as all function local statics and global objects are not destroyed yet. ::google::protobuf::ShutdownProtobufLibrary(); - onnxruntime::CPUIDInfo::ShutdownCpuInfo(); } break; } diff --git a/onnxruntime/core/platform/posix/env.cc b/onnxruntime/core/platform/posix/env.cc index 0270bf9d4d79c..c34d8b3dbf696 100644 --- a/onnxruntime/core/platform/posix/env.cc +++ b/onnxruntime/core/platform/posix/env.cc @@ -657,6 +657,11 @@ class PosixEnv : public Env { } } } + ~PosixEnv() { + if (cpuinfo_available_) { + cpuinfo_deinitialize(); + } + } bool cpuinfo_available_{false}; #endif // ORT_USE_CPUINFO };