Adjust divisor cycle cache usage after lease removal
This commit is contained in:
1 parent
d95195e0c6
commit
62e4b31f35
2 files changed
+5
-28
No files matched your search
@@ -882,10 +882,6 @@ internal static class Program
|
|||||||
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);
|
||||||
|
|
||||||
@@ -1018,7 +996,6 @@ internal static class Program
|
|||||||
}
|
}
|
||||||
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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in new issue
Block a user