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..a755d389338 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,24 @@ void run_cpuid(uint32_t eax, uint32_t ecx, uint32_t * abcd) #endif } +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]; +} + +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; +} + bool __daal_internal_is_intel_cpu() { const uint32_t genu = 0x756e6547, inei = 0x49656e69, ntel = 0x6c65746e; @@ -87,6 +105,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); @@ -191,11 +214,6 @@ static int check_sse42_features() return 1; } -DAAL_EXPORT bool __daal_serv_cpu_extensions_available() -{ - return daal_check_is_intel_cpu(); -} - DAAL_EXPORT int __daal_serv_cpu_detect(int enable) { #if defined(__APPLE__) @@ -226,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()) @@ -250,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 954dfbecc9f..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_check_is_intel_cpu()) +#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);