33fa5a
From a45cebf11522b3112fba3d682224a232ae5e2e98 Mon Sep 17 00:00:00 2001
33fa5a
From: Andreas Arnez <arnez@linux.ibm.com>
33fa5a
Date: Wed, 12 Dec 2018 19:44:32 +0100
33fa5a
Subject: [PATCH 4/8] Read L1 data cache size from sysconf if possible
33fa5a
33fa5a
The probing of the L1 data cache size is sometimes not reliable.  This can
33fa5a
cause the tuning to yield varying, sub-obtimal results.  But on Linux the
33fa5a
L1 data cache size can usually be retrieved with sysconf instead, which is
33fa5a
faster and more reliable.  Do this whenever possible.
33fa5a
---
33fa5a
 tune/sysinfo/L1CacheSize.c | 12 +++++++++++-
33fa5a
 1 file changed, 11 insertions(+), 1 deletion(-)
33fa5a
33fa5a
diff --git a/tune/sysinfo/L1CacheSize.c b/tune/sysinfo/L1CacheSize.c
33fa5a
index e62a273..dffa76e 100644
33fa5a
--- a/tune/sysinfo/L1CacheSize.c
33fa5a
+++ b/tune/sysinfo/L1CacheSize.c
33fa5a
@@ -30,6 +30,7 @@
33fa5a
 
33fa5a
 #include <stdio.h>
33fa5a
 #include <stdlib.h>
33fa5a
+#include <unistd.h>
33fa5a
 
33fa5a
 #define REPS 4096
33fa5a
 
33fa5a
@@ -276,7 +277,16 @@ int main(int nargs, char *args[])
33fa5a
       exit(-1);
33fa5a
    }
33fa5a
    if (nargs > 1) MaxSize = atoi(args[1]);
33fa5a
-   L1Size = GetL1Size(MaxSize, 1.08);
33fa5a
+
33fa5a
+#ifdef _SC_LEVEL1_DCACHE_SIZE
33fa5a
+   {
33fa5a
+      long res = sysconf(_SC_LEVEL1_DCACHE_SIZE);
33fa5a
+      L1Size = res > 0 ? (int) (res / 1024) : 0;
33fa5a
+   }
33fa5a
+#endif
33fa5a
+
33fa5a
+   if (!L1Size)
33fa5a
+      L1Size = GetL1Size(MaxSize, 1.08);
33fa5a
    if (!L1Size)
33fa5a
       L1Size = GetL1Size(MaxSize, 1.08);
33fa5a
    if (!L1Size)
33fa5a
-- 
33fa5a
2.23.0
33fa5a