]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
x86: Lower non-temporal copy threshold for Hygon
authorxiejiamei <xiejiamei@hygon.cn>
Sat, 9 May 2026 07:56:28 +0000 (07:56 +0000)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Wed, 20 May 2026 20:22:12 +0000 (17:22 -0300)
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 <xiejiamei@hygon.cn>
Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
sysdeps/x86/dl-cacheinfo.h

index 84817a84fd2247acdd83ec0e3363bf9727014155..d18326f404dbf5af91f7c8c524c67bd2f6dce96f 100644 (file)
@@ -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