From f53853f6fffe6ad6b079fc0b589e7004edf1340f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Lema=C5=84czyk?= Date: Sun, 21 Sep 2025 04:27:51 +0200 Subject: [PATCH] Micro optimization to take ref to orders once and re-use it, until it changes for the last block. --- PerfectNumbers.Core/Gpu/MersenneNumberResidueGpuTester.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/PerfectNumbers.Core/Gpu/MersenneNumberResidueGpuTester.cs b/PerfectNumbers.Core/Gpu/MersenneNumberResidueGpuTester.cs index a3dc886..93e1b77 100644 --- a/PerfectNumbers.Core/Gpu/MersenneNumberResidueGpuTester.cs +++ b/PerfectNumbers.Core/Gpu/MersenneNumberResidueGpuTester.cs @@ -44,6 +44,7 @@ public class MersenneNumberResidueGpuTester(bool useGpuOrder) int i; UInt128 batchSize128 = (UInt128)batchSize, q; Span orders = orderArray.AsSpan(0, batchSize); + ref var ordersRef = ref MemoryMarshal.GetReference(orders); try { while (kStart < maxK && Volatile.Read(ref isPrime)) @@ -57,6 +58,7 @@ public class MersenneNumberResidueGpuTester(bool useGpuOrder) { currentSize = (int)remaining; orders = orderArray.AsSpan(0, currentSize); + ordersRef = ref MemoryMarshal.GetReference(orders); } q = twoP * kStart + UInt128.One; @@ -68,7 +70,7 @@ public class MersenneNumberResidueGpuTester(bool useGpuOrder) // ra, orderBuffer.View, smallCyclesView, primeViews.LastOne, primeViews.LastSeven, primeViews.LastOnePow2, primeViews.LastSevenPow2); accelerator.Synchronize(); - orderBuffer.View.CopyToCPU(ref MemoryMarshal.GetReference(orders), currentSize); + orderBuffer.View.CopyToCPU(ref ordersRef, currentSize); if (!Volatile.Read(ref isPrime)) { break;