From e167798abae05125c1ae1c26ebb934a113e34697 Mon Sep 17 00:00:00 2001 From: Roman Dementiev Date: Mon, 8 Sep 2025 06:01:34 -0500 Subject: [PATCH 1/2] fix compilation for memoptest --- src/memoptest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/memoptest.cpp b/src/memoptest.cpp index 3c852931..f00d3302 100644 --- a/src/memoptest.cpp +++ b/src/memoptest.cpp @@ -132,7 +132,7 @@ int main(int argc, char * argv[]) cout << "Bandwidth: " << (sizeof(T) * nelements * niter) / ((after_ts - before_ts) * 1024 * 1024) << " MByte/sec\n" << std::flush; } - deleteAndNullifyArray(vector); + pcm::deleteAndNullifyArray(vector); return 0; } From bda534bbbb2af7dade67a51dc20225662de8e9ed Mon Sep 17 00:00:00 2001 From: Roman Dementiev Date: Mon, 8 Sep 2025 06:03:35 -0500 Subject: [PATCH 2/2] make cpu family/model extraction fully compliant to the spec --- src/cpucounters.cpp | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/src/cpucounters.cpp b/src/cpucounters.cpp index 5e92b78a..14d903f0 100644 --- a/src/cpucounters.cpp +++ b/src/cpucounters.cpp @@ -382,20 +382,6 @@ int32 PCM::getMaxCustomCoreEvents() return core_gen_counter_num_max; } -/* -int PCM::getCPUModelFromCPUID() -{ - static int result = -1; - if (result < 0) - { - PCM_CPUID_INFO cpuinfo; - pcm_cpuid(1, cpuinfo); - result = (((cpuinfo.array[0]) & 0xf0) >> 4) | ((cpuinfo.array[0] & 0xf0000) >> 12); - } - return result; -} -*/ - int PCM::getCPUFamilyModelFromCPUID() { static int result = -1; @@ -403,8 +389,14 @@ int PCM::getCPUFamilyModelFromCPUID() { PCM_CPUID_INFO cpuinfo; pcm_cpuid(1, cpuinfo); - const auto cpu_family_ = (((cpuinfo.array[0]) >> 8) & 0xf) | ((cpuinfo.array[0] & 0xf00000) >> 16); - const auto cpu_model_ = (((cpuinfo.array[0]) & 0xf0) >> 4) | ((cpuinfo.array[0] & 0xf0000) >> 12); + // follow https://www.felixcloutier.com/x86/cpuid#fig-3-6 + unsigned int Family_ID = (cpuinfo.array[0] >> 8) & 0xF; + unsigned int Extended_Family_ID = (cpuinfo.array[0] >> 20) & 0xFF; + unsigned int Model_ID = (cpuinfo.array[0] >> 4) & 0xF; + unsigned int Extended_Model_ID = (cpuinfo.array[0] >> 16) & 0xF; + const auto cpu_family_ = (Family_ID != 0x0F) ? Family_ID : (Extended_Family_ID + Family_ID); + const auto cpu_model_ = (Family_ID == 0x06 || Family_ID == 0x0F) ? (Model_ID + (Extended_Model_ID << 4)) : Model_ID; + result = PCM_CPU_FAMILY_MODEL(cpu_family_, cpu_model_); } return result; @@ -432,9 +424,11 @@ bool PCM::detectModel() max_cpuid = cpuinfo.array[0]; pcm_cpuid(1, cpuinfo); - cpu_family = (((cpuinfo.array[0]) >> 8) & 0xf) | ((cpuinfo.array[0] & 0xf00000) >> 16); - cpu_model_private = (((cpuinfo.array[0]) & 0xf0) >> 4) | ((cpuinfo.array[0] & 0xf0000) >> 12); - cpu_family_model = PCM_CPU_FAMILY_MODEL(cpu_family, cpu_model_private); + + DBG(2 , "cpuinfo.array[0]: 0x" , std::hex , cpuinfo.array[0] , std::dec); + cpu_family_model = getCPUFamilyModelFromCPUID(); + cpu_family = (cpu_family_model >> 8) & 0xff; + cpu_model_private = cpu_family_model & 0xff; cpu_stepping = cpuinfo.array[0] & 0x0f; if (cpuinfo.reg.ecx & (1UL << 31UL)) {