From 2d618d1713ff1d088c5a1acbba846a2da01a15d0 Mon Sep 17 00:00:00 2001 From: Isuru Fernando Date: Tue, 17 Dec 2024 14:15:53 +0000 Subject: [PATCH 1/3] Add proper CPUID eax checking This makes it possible to use the sse42, avx2 code paths on AMD processors --- .../compiler/generic/env_detect_features.cpp | 20 ++++++++++++++++++- cpp/daal/src/services/service_defines.h | 2 +- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/cpp/daal/src/services/compiler/generic/env_detect_features.cpp b/cpp/daal/src/services/compiler/generic/env_detect_features.cpp index 689dbe2bda0..83d0754bb38 100644 --- a/cpp/daal/src/services/compiler/generic/env_detect_features.cpp +++ b/cpp/daal/src/services/compiler/generic/env_detect_features.cpp @@ -71,6 +71,19 @@ void run_cpuid(uint32_t eax, uint32_t ecx, uint32_t * abcd) #endif } +uint32_t __daal_internal_get_max_extension_support() +{ + uint32_t abcd[4]; + run_cpuid(0x80000000, 0, abcd); + return abcd[0]; +} + +uint32_t daal_get_max_extension_support() +{ + static const uint32_t result = __daal_internal_get_max_extension_support(); + return result; +} + bool __daal_internal_is_intel_cpu() { const uint32_t genu = 0x756e6547, inei = 0x49656e69, ntel = 0x6c65746e; @@ -87,6 +100,11 @@ DAAL_EXPORT bool daal_check_is_intel_cpu() static int check_cpuid(uint32_t eax, uint32_t ecx, int abcd_index, uint32_t mask) { + if (daal_get_max_extension_support() < eax) + { + // need to check that the eax we run here is supported. + return 0; + } uint32_t abcd[4]; run_cpuid(eax, ecx, abcd); @@ -193,7 +211,7 @@ static int check_sse42_features() DAAL_EXPORT bool __daal_serv_cpu_extensions_available() { - return daal_check_is_intel_cpu(); + return 1; } DAAL_EXPORT int __daal_serv_cpu_detect(int enable) diff --git a/cpp/daal/src/services/service_defines.h b/cpp/daal/src/services/service_defines.h index 954dfbecc9f..73686666d3d 100644 --- a/cpp/daal/src/services/service_defines.h +++ b/cpp/daal/src/services/service_defines.h @@ -42,7 +42,7 @@ DAAL_EXPORT bool daal_check_is_intel_cpu(); #define DAAL_BASE_CPU daal::rv64 #endif -#define DAAL_CHECK_CPU_ENVIRONMENT (daal_check_is_intel_cpu()) +#define DAAL_CHECK_CPU_ENVIRONMENT (__daal_serv_cpu_extensions_available()) #if defined(__INTEL_COMPILER) #define PRAGMA_IVDEP _Pragma("ivdep") From 5c970229ff68a88a25a45df4f0bbc9bdde51bb7a Mon Sep 17 00:00:00 2001 From: Isuru Fernando Date: Thu, 19 Dec 2024 14:46:51 +0530 Subject: [PATCH 2/3] remove __daal_serv_cpu_extensions_available and add comments --- .../compiler/generic/env_detect_features.cpp | 20 +++++-------------- cpp/daal/src/services/service_defines.h | 7 +++++-- cpp/oneapi/dal/detail/cpu.cpp | 10 +++------- 3 files changed, 13 insertions(+), 24 deletions(-) diff --git a/cpp/daal/src/services/compiler/generic/env_detect_features.cpp b/cpp/daal/src/services/compiler/generic/env_detect_features.cpp index 83d0754bb38..a755d389338 100644 --- a/cpp/daal/src/services/compiler/generic/env_detect_features.cpp +++ b/cpp/daal/src/services/compiler/generic/env_detect_features.cpp @@ -73,6 +73,10 @@ void run_cpuid(uint32_t eax, uint32_t ecx, uint32_t * abcd) uint32_t __daal_internal_get_max_extension_support() { + // Running cpuid with a value other than eax=0 and 0x8000000 is an extension + // To check that a particular eax value is supported we need to check + // maximum extension that is supported by checking the value returned by + // cpuid when eax=0x80000000 is given. uint32_t abcd[4]; run_cpuid(0x80000000, 0, abcd); return abcd[0]; @@ -80,6 +84,7 @@ uint32_t __daal_internal_get_max_extension_support() uint32_t daal_get_max_extension_support() { + // We cache the result in a static variable here. static const uint32_t result = __daal_internal_get_max_extension_support(); return result; } @@ -209,11 +214,6 @@ static int check_sse42_features() return 1; } -DAAL_EXPORT bool __daal_serv_cpu_extensions_available() -{ - return 1; -} - DAAL_EXPORT int __daal_serv_cpu_detect(int enable) { #if defined(__APPLE__) @@ -244,11 +244,6 @@ static bool check_sve_features() return (hwcap & HWCAP_SVE) != 0; } -DAAL_EXPORT bool __daal_serv_cpu_extensions_available() -{ - return 0; -} - DAAL_EXPORT int __daal_serv_cpu_detect(int enable) { if (check_sve_features()) @@ -268,11 +263,6 @@ bool daal_check_is_intel_cpu() return false; } #elif defined(TARGET_RISCV64) -DAAL_EXPORT bool __daal_serv_cpu_extensions_available() -{ - return 0; -} - DAAL_EXPORT int __daal_serv_cpu_detect(int enable) { return daal::rv64; diff --git a/cpp/daal/src/services/service_defines.h b/cpp/daal/src/services/service_defines.h index 73686666d3d..3ef6d3024be 100644 --- a/cpp/daal/src/services/service_defines.h +++ b/cpp/daal/src/services/service_defines.h @@ -28,7 +28,6 @@ #include #include "services/env_detect.h" -DAAL_EXPORT bool __daal_serv_cpu_extensions_available(); DAAL_EXPORT int __daal_serv_cpu_detect(int); void run_cpuid(uint32_t eax, uint32_t ecx, uint32_t * abcd); @@ -42,7 +41,11 @@ DAAL_EXPORT bool daal_check_is_intel_cpu(); #define DAAL_BASE_CPU daal::rv64 #endif -#define DAAL_CHECK_CPU_ENVIRONMENT (__daal_serv_cpu_extensions_available()) +#if defined(TARGET_X86_64) + #define DAAL_CHECK_CPU_ENVIRONMENT 1 +#else + #define DAAL_CHECK_CPU_ENVIRONMENT 0 +#endif #if defined(__INTEL_COMPILER) #define PRAGMA_IVDEP _Pragma("ivdep") diff --git a/cpp/oneapi/dal/detail/cpu.cpp b/cpp/oneapi/dal/detail/cpu.cpp index 1369da2d231..943ba6bd8b3 100644 --- a/cpp/oneapi/dal/detail/cpu.cpp +++ b/cpp/oneapi/dal/detail/cpu.cpp @@ -38,15 +38,11 @@ cpu_extension from_daal_cpu_type(int cpu_type) { } cpu_extension detect_top_cpu_extension() { - if (!__daal_serv_cpu_extensions_available()) { -#if defined(TARGET_X86_64) - return detail::cpu_extension::sse2; -#elif defined(TARGET_ARM) - return detail::cpu_extension::sve; +#if defined(TARGET_ARM) + return detail::cpu_extension::sve; #elif defined(TARGET_RISCV64) - return detail::cpu_extension::rv64; + return detail::cpu_extension::rv64; #endif - } const auto daal_cpu = __daal_serv_cpu_detect(0); return from_daal_cpu_type(daal_cpu); From eb1c2e9c31034a85ae7c5ad0f581f1c4cc37baf3 Mon Sep 17 00:00:00 2001 From: Isuru Fernando Date: Wed, 26 Feb 2025 12:24:22 -0600 Subject: [PATCH 3/3] revert DAAL_CHECK_CPU_ENVIRONMENT changes --- cpp/daal/src/services/service_defines.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/cpp/daal/src/services/service_defines.h b/cpp/daal/src/services/service_defines.h index 3ef6d3024be..105e356d35b 100644 --- a/cpp/daal/src/services/service_defines.h +++ b/cpp/daal/src/services/service_defines.h @@ -41,11 +41,7 @@ DAAL_EXPORT bool daal_check_is_intel_cpu(); #define DAAL_BASE_CPU daal::rv64 #endif -#if defined(TARGET_X86_64) - #define DAAL_CHECK_CPU_ENVIRONMENT 1 -#else - #define DAAL_CHECK_CPU_ENVIRONMENT 0 -#endif +#define DAAL_CHECK_CPU_ENVIRONMENT (daal_check_is_intel_cpu()) #if defined(__INTEL_COMPILER) #define PRAGMA_IVDEP _Pragma("ivdep")