Skip to content

Commit

Permalink
Add proper CPUID eax checking (#3026)
Browse files Browse the repository at this point in the history
* Add proper CPUID eax checking

This makes it possible to use the sse42, avx2 code paths on AMD
processors

* remove __daal_serv_cpu_extensions_available and add comments

* revert DAAL_CHECK_CPU_ENVIRONMENT changes
  • Loading branch information
isuruf authored Feb 28, 2025
1 parent 4d929e1 commit 7884821
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 23 deletions.
38 changes: 23 additions & 15 deletions cpp/daal/src/services/compiler/generic/env_detect_features.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
Expand Down Expand Up @@ -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__)
Expand Down Expand Up @@ -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())
Expand All @@ -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;
Expand Down
1 change: 0 additions & 1 deletion cpp/daal/src/services/service_defines.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
#include <stdint.h>
#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);
Expand Down
10 changes: 3 additions & 7 deletions cpp/oneapi/dal/detail/cpu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 7884821

Please sign in to comment.