Log by-divisor progress updates

This commit is contained in:
Marek Lemańczyk committed 2025-09-21 11:11:56 +02:00
1 parent 5ce0cf74fc
commit eb0a5b2655
1 file changed
+29 -1
@@ -17,6 +17,7 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester
private readonly object _sync = new(); private readonly object _sync = new();
private ulong _divisorLimit; private ulong _divisorLimit;
private bool _isConfigured; private bool _isConfigured;
private ulong _lastStatusDivisor;
private readonly ConcurrentDictionary<Accelerator, Action<Index1D, ulong, ArrayView<ulong>, ArrayView<ulong>, ArrayView<ulong>, ArrayView<byte>>> _updateKernelCache = new(); private readonly ConcurrentDictionary<Accelerator, Action<Index1D, ulong, ArrayView<ulong>, ArrayView<ulong>, ArrayView<ulong>, ArrayView<byte>>> _updateKernelCache = new();
private readonly ConcurrentDictionary<Accelerator, Action<Index1D, ulong, ArrayView<ulong>, ArrayView<ulong>, ArrayView<byte>>> _initialKernelCache = new(); private readonly ConcurrentDictionary<Accelerator, Action<Index1D, ulong, ArrayView<ulong>, ArrayView<ulong>, ArrayView<byte>>> _initialKernelCache = new();
@@ -39,6 +40,7 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester
} }
_divisorLimit = ComputeDivisorLimitFromMaxPrime(maxPrime); _divisorLimit = ComputeDivisorLimitFromMaxPrime(maxPrime);
_lastStatusDivisor = 0UL;
_isConfigured = true; _isConfigured = true;
} }
} }
@@ -106,13 +108,16 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester
hitsBuffer.View.CopyToCPU(ref MemoryMarshal.GetReference(hitsSpan), count); hitsBuffer.View.CopyToCPU(ref MemoryMarshal.GetReference(hitsSpan), count);
bool composite = false; bool composite = false;
ulong lastProcessed = 0UL;
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
if (divisorsSpan[i] > allowedMax) ulong divisor = divisorsSpan[i];
if (divisor > allowedMax)
{ {
break; break;
} }
lastProcessed = divisor;
if (hitsSpan[i] != 0) if (hitsSpan[i] != 0)
{ {
composite = true; composite = true;
@@ -120,6 +125,11 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester
} }
} }
if (lastProcessed != 0UL)
{
ReportStatus(lastProcessed);
}
ArrayPool<byte>.Shared.Return(hits, clearArray: true); ArrayPool<byte>.Shared.Return(hits, clearArray: true);
hitsBuffer.Dispose(); hitsBuffer.Dispose();
@@ -174,6 +184,7 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester
hitsBuffer.View.CopyToCPU(ref MemoryMarshal.GetReference(hitsSpan), count); hitsBuffer.View.CopyToCPU(ref MemoryMarshal.GetReference(hitsSpan), count);
bool composite = false; bool composite = false;
ulong lastProcessed = 0UL;
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
ulong divisor = newDivisorsSpan[i]; ulong divisor = newDivisorsSpan[i];
@@ -181,12 +192,18 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester
_divisors.Add(divisor); _divisors.Add(divisor);
_remainders.Add(remainder); _remainders.Add(remainder);
_lastPrimes.Add(prime); _lastPrimes.Add(prime);
lastProcessed = divisor;
if (!composite && hitsSpan[i] != 0) if (!composite && hitsSpan[i] != 0)
{ {
composite = true; composite = true;
} }
} }
if (lastProcessed != 0UL)
{
ReportStatus(lastProcessed);
}
ArrayPool<ulong>.Shared.Return(newRemainders, clearArray: true); ArrayPool<ulong>.Shared.Return(newRemainders, clearArray: true);
ArrayPool<byte>.Shared.Return(hits, clearArray: true); ArrayPool<byte>.Shared.Return(hits, clearArray: true);
@@ -198,6 +215,17 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester
return composite; 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) private static ulong ComputeDivisorLimitFromMaxPrime(ulong maxPrime)
{ {
if (maxPrime <= 1UL) if (maxPrime <= 1UL)