Simplify by-divisor buffer guards and document prime ordering
This commit is contained in:
1 parent
594a38b9d7
commit
c8d6143ab7
2 files changed
+13
-25
No files matched your search
@@ -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;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user