]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
x86: Lower non-temporal copy threshold for Hygon
authorxiejiamei <xiejiamei@hygon.cn>
Sat, 9 May 2026 06:23:09 +0000 (14:23 +0800)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Mon, 18 May 2026 16:31:00 +0000 (13:31 -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>
sysdeps/x86/dl-cacheinfo.h

index b6e17b0e32103f65c0f701e65d89c02414125b87..84817a84fd2247acdd83ec0e3363bf9727014155 100644 (file)
@@ -1244,6 +1244,13 @@ dl_init_cacheinfo (struct cpu_features *cpu_features)
   if (!CPU_FEATURES_ARCH_P (cpu_features, Avoid_Non_Temporal_Memset))
     memset_non_temporal_threshold = non_temporal_threshold;
 
+  /* Hygon benefits from entering the non-temporal copy path earlier.
+     Use 3/8 of the shared cache size per thread to reduce cache
+     pollution and improve throughput for large copies. Keep the memset
+     non-temporal threshold unchanged.  */
+  if (cpu_features->basic.kind == arch_kind_hygon)
+    non_temporal_threshold = shared_per_thread * 3 / 8;
+
   tunable_size = TUNABLE_GET (x86_non_temporal_threshold, long int, NULL);
   if (tunable_size > minimum_non_temporal_threshold
       && tunable_size <= maximum_non_temporal_threshold)