Simplify by-divisor buffer guards and document prime ordering

This commit is contained in:
Marek Lemańczyk committed 2025-10-13 18:12:06 +02:00
1 parent 594a38b9d7
commit c8d6143ab7
2 files changed
+13 -25

No files matched your search

+1 -1
View File
@@ -1030,7 +1030,7 @@ internal static class Program
Console.WriteLine(" --use-order test primality via q order");
Console.WriteLine(" --workaround-mod avoid '%' operator on the GPU");
// mod-automaton removed
Console.WriteLine(" --filter-p=<path> process only p from previous run results (required for --mersenne=bydivisor)");
Console.WriteLine(" --filter-p=<path> process only p from previous run results (required for --mersenne=bydivisor; primes must be strictly increasing)");
Console.WriteLine(" --write-batch-size=<value> overwrite frequency of disk writes (default 100 lines)");
Console.WriteLine(" --gcd-filter enable early sieve based on GCD");
Console.WriteLine(" --help, -help, --?, -?, /? show this help message");
@@ -808,9 +808,8 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv
return;
}
// Sessions release pooled buffers between scans, so the null checks stay in place to avoid using returned arrays
// when a session is reset for a subsequent divisor.
if (requiredLength <= _bufferCapacity && _primeDeltas is not null && _cycleRemainders is not null && _residues is not null)
// Sessions release pooled buffers between scans; a single null check covers every array because buffers are rented and returned together.
if (requiredLength <= _bufferCapacity && _primeDeltas is not null)
{
return;
}
@@ -837,25 +836,18 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv
private void ReturnBuffers()
{
// Buffers are lazily allocated per session; return whichever arrays were rented before the next batch.
if (_primeDeltas is not null)
// Buffers are lazily allocated per session; the _primeDeltas guard applies to every pooled array because sessions rent and release them together.
if (_primeDeltas is null)
{
ArrayPool<ulong>.Shared.Return(_primeDeltas, clearArray: false);
_primeDeltas = null;
}
if (_cycleRemainders is not null)
{
ArrayPool<ulong>.Shared.Return(_cycleRemainders, clearArray: false);
_cycleRemainders = null;
}
if (_residues is not null)
{
ArrayPool<ulong>.Shared.Return(_residues, clearArray: false);
_residues = null;
return;
}
ArrayPool<ulong>.Shared.Return(_primeDeltas, clearArray: false);
ArrayPool<ulong>.Shared.Return(_cycleRemainders!, clearArray: false);
ArrayPool<ulong>.Shared.Return(_residues!, clearArray: false);
_primeDeltas = null;
_cycleRemainders = null;
_residues = null;
_bufferCapacity = 0;
}
@@ -870,14 +862,10 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv
ulong previous = primes[0];
deltas[0] = previous;
// Production batches feed strictly increasing primes; callers outside the scanning path must uphold the contract.
for (int i = 1; i < primes.Length; i++)
{
ulong current = primes[i];
if (current <= previous)
{
throw new ArgumentOutOfRangeException(nameof(primes), "Primes must be strictly increasing.");
}
deltas[i] = current - previous;
previous = current;
}