diff options
author | Zhang Xianyi <traits.zhang@gmail.com> | 2014-11-10 17:15:34 +0800 |
---|---|---|
committer | Zhang Xianyi <traits.zhang@gmail.com> | 2014-11-10 17:15:34 +0800 |
commit | 2987bc7b40e0538f38b130a5035a210fc4a89199 (patch) | |
tree | e82e0d13035ae24ec45c226192083f4fb27a94fd /cpuid_x86.c | |
parent | 695e0fa649cd76b894069990cdbfd5590f16c401 (diff) | |
download | openblas-2987bc7b40e0538f38b130a5035a210fc4a89199.tar.gz openblas-2987bc7b40e0538f38b130a5035a210fc4a89199.tar.bz2 openblas-2987bc7b40e0538f38b130a5035a210fc4a89199.zip |
refs #464. Fixed the bug of detecting L2 associative on x86.
Diffstat (limited to 'cpuid_x86.c')
-rw-r--r-- | cpuid_x86.c | 41 |
1 files changed, 33 insertions, 8 deletions
diff --git a/cpuid_x86.c b/cpuid_x86.c index f9df7221b..44446e582 100644 --- a/cpuid_x86.c +++ b/cpuid_x86.c @@ -853,11 +853,24 @@ int get_cacheinfo(int type, cache_info_t *cacheinfo){ if (get_vendor() == VENDOR_INTEL) { cpuid(0x80000000, &cpuid_level, &ebx, &ecx, &edx); if (cpuid_level >= 0x80000006) { - cpuid(0x80000006, &eax, &ebx, &ecx, &edx); + if(L2.size<=0){ + //If we didn't detect L2 correctly before, + cpuid(0x80000006, &eax, &ebx, &ecx, &edx); + + L2.size = BITMASK(ecx, 16, 0xffff); + L2.associative = BITMASK(ecx, 12, 0x0f); + + switch (L2.associative){ + case 0x06: + L2.associative = 8; + break; + case 0x08: + L2.associative = 16; + break; + } - L2.size = BITMASK(ecx, 16, 0xffff); - L2.associative = BITMASK(ecx, 12, 0x0f); - L2.linesize = BITMASK(ecx, 0, 0xff); + L2.linesize = BITMASK(ecx, 0, 0xff); + } } } @@ -916,10 +929,22 @@ int get_cacheinfo(int type, cache_info_t *cacheinfo){ if (L2ITB.associative == 0xff) L2ITB.associative = 0; L2ITB.linesize = BITMASK(ebx, 0, 0xff); - L2.size = BITMASK(ecx, 16, 0xffff); - L2.associative = BITMASK(ecx, 12, 0xf); - if (L2.associative == 0xff) L2.associative = 0; - L2.linesize = BITMASK(ecx, 0, 0xff); + if(L2.size <= 0){ + //If we didn't detect L2 correctly before, + L2.size = BITMASK(ecx, 16, 0xffff); + L2.associative = BITMASK(ecx, 12, 0xf); + switch (L2.associative){ + case 0x06: + L2.associative = 8; + break; + case 0x08: + L2.associative = 16; + break; + } + + if (L2.associative == 0xff) L2.associative = 0; + L2.linesize = BITMASK(ecx, 0, 0xff); + } L3.size = BITMASK(edx, 18, 0x3fff) * 512; L3.associative = BITMASK(edx, 12, 0xf); |