]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
x86: Optimizing memcpy for AMD Zen architecture.
authorSajan Karumanchi <sajan.karumanchi@amd.com>
Wed, 28 Oct 2020 07:35:33 +0000 (13:05 +0530)
committerFlorian Weimer <fweimer@redhat.com>
Fri, 30 Oct 2020 12:04:09 +0000 (13:04 +0100)
Modifying the shareable cache '__x86_shared_cache_size', which is a
factor in computing the non-temporal threshold parameter
'__x86_shared_non_temporal_threshold' to optimize memcpy for AMD Zen
architectures.
In the existing implementation, the shareable cache is computed as 'L3
per thread, L2 per core'. Recomputing this shareable cache as 'L3 per
CCX(Core-Complex)' has brought in performance gains.
As per the large bench variant results, this patch also addresses the
regression problem on AMD Zen architectures.

Backport of commit 59803e81f96b479c17f583b31eac44b57591a1bf upstream,
with the fix from cb3a749a22a55645dc6a52659eea765300623f98 ("x86:
Restore processing of cache size tunables in init_cacheinfo") applied.

Reviewed-by: Premachandra Mallappa <premachandra.mallappa@amd.com>
Co-Authored-by: Florian Weimer <fweimer@redhat.com>
sysdeps/x86/cacheinfo.c

index 43f2e7445ce476a52dddc0f86cff7aa03e6bad24..39c13b7195c77a69e2f3bab9c718aafdaad453a6 100644 (file)
@@ -722,7 +722,7 @@ intel_bug_no_cache_info:
              threads = 1 << ((ecx >> 12) & 0x0f);
            }
 
-         if (threads == 0)
+         if (threads == 0 || cpu_features->basic.family >= 0x17)
            {
              /* If APIC ID width is not available, use logical
                 processor count.  */
@@ -737,8 +737,22 @@ intel_bug_no_cache_info:
          if (threads > 0)
            shared /= threads;
 
-         /* Account for exclusive L2 and L3 caches.  */
-         shared += core;
+         /* Get shared cache per ccx for Zen architectures.  */
+         if (cpu_features->basic.family >= 0x17)
+           {
+             unsigned int eax;
+
+             /* Get number of threads share the L3 cache in CCX.  */
+             __cpuid_count (0x8000001D, 0x3, eax, ebx, ecx, edx);
+
+             unsigned int threads_per_ccx = ((eax >> 14) & 0xfff) + 1;
+             shared *= threads_per_ccx;
+           }
+         else
+           {
+             /* Account for exclusive L2 and L3 caches.  */
+             shared += core;
+            }
        }
 
 #ifndef DISABLE_PREFETCHW