[glibc] x86: Lower non-temporal copy threshold for Hygon

Adhemerval Zanella via Glibc-cvs <[email protected]> Wed, 20 May 2026 20:23:04 +0000 (GMT)
Newsgroups gmane.comp.lib.glibc.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=213ffdfbbae6d4cb4e8dd4a9e3e57c69127620c4

commit 213ffdfbbae6d4cb4e8dd4a9e3e57c69127620c4
Author: xiejiamei <[email protected]>
Date:   Sat May 9 07:56:28 2026 +0000

    x86: Lower non-temporal copy threshold for Hygon
    
    Benchmarks on Hygon processors show that the default non-temporal
    threshold is higher than ideal for large copy workloads.  As a result,
    memcpy and memmove may continue to use the temporal copy path for
    longer than is beneficial, increasing cache pollution and reducing
    throughput for large copies.
    
    Lower the copy non-temporal threshold to 3/8 of the shared cache size
    per thread on Hygon.  This allows the non-temporal copy path to be
    selected earlier while leaving the memset non-temporal threshold
    unchanged.
    
    Signed-off-by: xiejiamei <[email protected]>
    Reviewed-by: H.J. Lu <[email protected]>

Diff:
---
 sysdeps/x86/dl-cacheinfo.h | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/sysdeps/x86/dl-cacheinfo.h b/sysdeps/x86/dl-cacheinfo.h
index 84817a84fd..d18326f404 100644
--- a/sysdeps/x86/dl-cacheinfo.h
+++ b/sysdeps/x86/dl-cacheinfo.h
@@ -1255,6 +1255,14 @@ dl_init_cacheinfo (struct cpu_features *cpu_features)
   if (tunable_size > minimum_non_temporal_threshold
       && tunable_size <= maximum_non_temporal_threshold)
     non_temporal_threshold = tunable_size;
+  else if (cpu_features->basic.kind == arch_kind_hygon)
+    {
+      /* Hygon benefits from entering the non-temporal copy path earlier.
+         Use 3/8 of the shared cache size per thread for memcpy and
+         memmove.  The memset threshold has already been initialized
+         above and is intentionally left unchanged.  */
+      non_temporal_threshold = shared_per_thread * 3 / 8;
+    }
 
   tunable_size = TUNABLE_GET (x86_memset_non_temporal_threshold, long int, NULL);
   if (tunable_size > minimum_non_temporal_threshold