Adjust divisor cycle cache usage after lease removal

This commit is contained in:
Marek Lemańczyk committed 2025-09-25 06:09:50 +02:00
1 parent d95195e0c6
commit 62e4b31f35
2 files changed
+9 -32

No files matched your search

+7 -30
View File
@@ -881,11 +881,7 @@ internal static class Program
Span<byte> hitsSpan = default; Span<byte> hitsSpan = default;
int hitIndex = 0; int hitIndex = 0;
int index; int index;
bool useDivisorCycles = _byDivisorTester!.UseDivisorCycles; bool useDivisorCycles = _byDivisorTester!.UseDivisorCycles;
DivisorCycleCache.Lease cycleLease = default;
ulong cycleLeaseStart = 0UL;
ulong cycleLeaseEnd = 0UL;
ulong[]? cycleValues = null;
ulong divisorCycle = 0UL; ulong divisorCycle = 0UL;
try try
@@ -903,27 +899,9 @@ internal static class Program
divisor = AcquireNextDivisor(ref nextDivisor, divisorLimit, ref divisorsExhaustedFlag, ref finalDivisorBits, out exhausted, ref localDivisorCursor, ref localDivisorsRemaining); divisor = AcquireNextDivisor(ref nextDivisor, divisorLimit, ref divisorsExhaustedFlag, ref finalDivisorBits, out exhausted, ref localDivisorCursor, ref localDivisorsRemaining);
if (divisor != 0UL) if (divisor != 0UL)
{ {
if (useDivisorCycles) divisorCycle = useDivisorCycles
{ ? DivisorCycleCache.Shared.Acquire(divisor).GetCycle(divisor)
if (!cycleLease.IsValid || divisor < cycleLeaseStart || divisor > cycleLeaseEnd) : 0UL;
{
cycleLease.Dispose();
cycleLease = DivisorCycleCache.Shared.Acquire(divisor);
cycleLeaseStart = cycleLease.Start;
cycleLeaseEnd = cycleLease.End;
cycleValues = cycleLease.Values ?? throw new InvalidOperationException("Divisor cycle cache returned no values for acquired lease.");
}
else if (cycleValues is null)
{
cycleValues = cycleLease.Values ?? throw new InvalidOperationException("Divisor cycle cache returned no values for acquired lease.");
}
divisorCycle = cycleValues[(int)(divisor - cycleLeaseStart)];
}
else
{
divisorCycle = 0UL;
}
activeCount = BuildPrimeBuffer(divisor, primeValues, allowedMaxValues, stateFlags, primeBuffer, indexBuffer, completionsBuffer, ref completionsCount, ref remainingStates, activeStateMask, ref activeStartIndex); activeCount = BuildPrimeBuffer(divisor, primeValues, allowedMaxValues, stateFlags, primeBuffer, indexBuffer, completionsBuffer, ref completionsCount, ref remainingStates, activeStateMask, ref activeStartIndex);
@@ -1016,10 +994,9 @@ internal static class Program
FlushPendingResults(compositesBuffer, ref compositesCount); FlushPendingResults(compositesBuffer, ref compositesCount);
} }
} }
finally finally
{ {
cycleLease.Dispose(); ArrayPool<PendingResult>.Shared.Return(compositesBuffer, clearArray: true);
ArrayPool<PendingResult>.Shared.Return(compositesBuffer, clearArray: true);
ArrayPool<PendingResult>.Shared.Return(completionsBuffer, clearArray: true); ArrayPool<PendingResult>.Shared.Return(completionsBuffer, clearArray: true);
ArrayPool<int>.Shared.Return(indexBuffer, clearArray: true); ArrayPool<int>.Shared.Return(indexBuffer, clearArray: true);
ArrayPool<ulong>.Shared.Return(primeBuffer, clearArray: true); ArrayPool<ulong>.Shared.Return(primeBuffer, clearArray: true);
@@ -171,8 +171,8 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv
byte hit; byte hit;
if (useCycles) if (useCycles)
{ {
using DivisorCycleCache.Lease cycleLease = DivisorCycleCache.Shared.Acquire(divisor); DivisorCycleCache.CycleBlock cycleBlock = DivisorCycleCache.Shared.Acquire(divisor);
ulong divisorCycle = cycleLease.GetCycle(divisor); ulong divisorCycle = cycleBlock.GetCycle(divisor);
hit = CheckDivisor(prime, divisorCycle != 0UL, divisorCycle, divisorData); hit = CheckDivisor(prime, divisorCycle != 0UL, divisorCycle, divisorData);
} }
else else