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..a94133d6964 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,10 @@ 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 +210,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")