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