diff --git a/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs b/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs index 0be05a4..6133440 100644 --- a/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs +++ b/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs @@ -17,6 +17,7 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester private readonly object _sync = new(); private ulong _divisorLimit; private bool _isConfigured; + private ulong _lastStatusDivisor; private readonly ConcurrentDictionary, ArrayView, ArrayView, ArrayView>> _updateKernelCache = new(); private readonly ConcurrentDictionary, ArrayView, ArrayView>> _initialKernelCache = new(); @@ -39,6 +40,7 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester } _divisorLimit = ComputeDivisorLimitFromMaxPrime(maxPrime); + _lastStatusDivisor = 0UL; _isConfigured = true; } } @@ -106,13 +108,16 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester hitsBuffer.View.CopyToCPU(ref MemoryMarshal.GetReference(hitsSpan), count); bool composite = false; + ulong lastProcessed = 0UL; for (int i = 0; i < count; i++) { - if (divisorsSpan[i] > allowedMax) + ulong divisor = divisorsSpan[i]; + if (divisor > allowedMax) { break; } + lastProcessed = divisor; if (hitsSpan[i] != 0) { composite = true; @@ -120,6 +125,11 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester } } + if (lastProcessed != 0UL) + { + ReportStatus(lastProcessed); + } + ArrayPool.Shared.Return(hits, clearArray: true); hitsBuffer.Dispose(); @@ -174,6 +184,7 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester hitsBuffer.View.CopyToCPU(ref MemoryMarshal.GetReference(hitsSpan), count); bool composite = false; + ulong lastProcessed = 0UL; for (int i = 0; i < count; i++) { ulong divisor = newDivisorsSpan[i]; @@ -181,12 +192,18 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester _divisors.Add(divisor); _remainders.Add(remainder); _lastPrimes.Add(prime); + lastProcessed = divisor; if (!composite && hitsSpan[i] != 0) { composite = true; } } + if (lastProcessed != 0UL) + { + ReportStatus(lastProcessed); + } + ArrayPool.Shared.Return(newRemainders, clearArray: true); ArrayPool.Shared.Return(hits, clearArray: true); @@ -198,6 +215,17 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester return composite; } + private void ReportStatus(ulong divisor) + { + if (divisor <= _lastStatusDivisor) + { + return; + } + + _lastStatusDivisor = divisor; + Console.WriteLine($"...processed by-divisor candidate = {divisor}"); + } + private static ulong ComputeDivisorLimitFromMaxPrime(ulong maxPrime) { if (maxPrime <= 1UL)