summaryrefslogtreecommitdiff
path: root/cpuid_x86.c
diff options
context:
space:
mode:
authorZhang Xianyi <traits.zhang@gmail.com>2014-11-10 17:15:34 +0800
committerZhang Xianyi <traits.zhang@gmail.com>2014-11-10 17:15:34 +0800
commit2987bc7b40e0538f38b130a5035a210fc4a89199 (patch)
treee82e0d13035ae24ec45c226192083f4fb27a94fd /cpuid_x86.c
parent695e0fa649cd76b894069990cdbfd5590f16c401 (diff)
downloadopenblas-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.c41
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);