From e2f68cedf2c2defe22458f184ffb7f8e6d04140b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Lema=C5=84czyk?= Date: Sun, 26 Oct 2025 22:42:27 +0100 Subject: [PATCH] Short-circuit small prime sieve kernel loops --- .../Gpu/Kernels/PrimeTesterKernels.cs | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/PerfectNumbers.Core/Gpu/Kernels/PrimeTesterKernels.cs b/PerfectNumbers.Core/Gpu/Kernels/PrimeTesterKernels.cs index 9ad7ee7..52a1770 100644 --- a/PerfectNumbers.Core/Gpu/Kernels/PrimeTesterKernels.cs +++ b/PerfectNumbers.Core/Gpu/Kernels/PrimeTesterKernels.cs @@ -15,35 +15,32 @@ internal static class PrimeTesterKernels ArrayView results) { ulong n = numbers[index]; + byte result = 1; // EvenPerfectBitScanner filters candidates so production GPU launches only see: // - n >= 31 (the scanner starts at 136,279,841 and test mode seeds 31) // - n odd (candidate generators and ModResidueTracker eliminate even exponents) // - n not divisible by 5 (residue prefiltering and AddPrimes transform cover these composites) // Tests should honor the same constraints so the host wrapper can remain branchless. - ulong log2Estimate = 63UL - (ulong)XMath.LeadingZeroCount(n | 1UL); - ulong gcd = BinaryGcdGpu(n, log2Estimate); - bool heuristicActive = n.Mod10() == 1UL; - bool gcdReject = heuristicActive & (gcd != 1UL); - - bool composite = gcdReject; - bool continueLoop = !gcdReject; long length = smallPrimes.Length; for (int i = 0; i < length; i++) { ulong prime = smallPrimes[i]; ulong primeSquare = smallPrimeSquares[i]; - bool withinRange = primeSquare <= n; - ulong remainder = n % prime; - bool divides = remainder == 0UL; + if (primeSquare > n) + { + break; + } - bool markComposite = continueLoop & withinRange & divides; - composite |= markComposite; - continueLoop &= withinRange & !divides; + if (n % prime == 0UL) + { + result = 0; + break; + } } - results[index] = composite ? (byte)0 : (byte)1; + results[index] = result; } public static void HeuristicTrialDivisionKernel(Index1D index, ArrayView divisors, ulong n, ArrayView results)