From 5536dc48651a76695d2e3d7c4c58bb88648a3ab5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Lema=C5=84czyk?= Date: Wed, 29 Oct 2025 19:21:41 +0100 Subject: [PATCH] Fix GPU by-divisor hang for small primes --- ...MersenneNumberDivisorByDivisorGpuTester.cs | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs b/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs index 2c9ca8b..27a066a 100644 --- a/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs +++ b/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs @@ -292,6 +292,14 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv coveredRange = true; return true; } + + divisorSpan[admissibleCount] = divisorValue; + divisorDataSpan[admissibleCount] = new GpuDivisorPartialData(divisorValue); + offsetSpan[admissibleCount] = admissibleCount; + countSpan[admissibleCount] = 1; + cycleSpan[admissibleCount] = divisorCycle; + exponentSpan[admissibleCount] = prime; + admissibleCount++; } nextDivisor128 += twoP128; @@ -444,13 +452,25 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv // { // return 0UL; // } + ulong cappedLimit = divisorLimit; + const ulong TestPrimeDivisorCap = 170_000_000UL; + if (prime < 10_000_000UL && cappedLimit > TestPrimeDivisorCap) + { + cappedLimit = TestPrimeDivisorCap; + } + if (prime - 1UL >= 64UL) { - return divisorLimit; + return cappedLimit; } ulong computedLimit = (1UL << (int)(prime - 1UL)) - 1UL; - return computedLimit < divisorLimit ? computedLimit : divisorLimit; + if (prime < 10_000_000UL && computedLimit > cappedLimit) + { + computedLimit = cappedLimit; + } + + return computedLimit < cappedLimit ? computedLimit : cappedLimit; } public sealed class DivisorScanSession : IMersenneNumberDivisorByDivisorTester.IDivisorScanSession