Formatting
This commit is contained in:
1 parent
d72cfc9748
commit
84c3c23997
1 file changed
+87
-87
@@ -34,8 +34,8 @@ internal static class Program
|
|||||||
private static bool _useByDivisorMode;
|
private static bool _useByDivisorMode;
|
||||||
private static bool _byDivisorPrecheckOnly;
|
private static bool _byDivisorPrecheckOnly;
|
||||||
private static UInt128 _divisor;
|
private static UInt128 _divisor;
|
||||||
private static MersenneNumberDivisorGpuTester? _divisorTester;
|
private static MersenneNumberDivisorGpuTester? _divisorTester;
|
||||||
private static IMersenneNumberDivisorByDivisorTester? _byDivisorTester;
|
private static IMersenneNumberDivisorByDivisorTester? _byDivisorTester;
|
||||||
private static ulong? _orderWarmupLimitOverride;
|
private static ulong? _orderWarmupLimitOverride;
|
||||||
private static unsafe delegate*<ulong, ref ulong, ulong> _transformP;
|
private static unsafe delegate*<ulong, ref ulong, ulong> _transformP;
|
||||||
private static long _state;
|
private static long _state;
|
||||||
@@ -448,18 +448,18 @@ internal static class Program
|
|||||||
}
|
}
|
||||||
|
|
||||||
Console.WriteLine($"Loading divisor cycles into memory...");
|
Console.WriteLine($"Loading divisor cycles into memory...");
|
||||||
if (string.Equals(Path.GetExtension(cyclesPath), ".csv", StringComparison.OrdinalIgnoreCase))
|
if (string.Equals(Path.GetExtension(cyclesPath), ".csv", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
MersenneDivisorCycles.Shared.LoadFrom(cyclesPath);
|
MersenneDivisorCycles.Shared.LoadFrom(cyclesPath);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MersenneDivisorCycles.Shared.LoadFrom(cyclesPath);
|
MersenneDivisorCycles.Shared.LoadFrom(cyclesPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
DivisorCycleCache.Shared.ReloadFromCurrentSnapshot();
|
DivisorCycleCache.Shared.ReloadFromCurrentSnapshot();
|
||||||
|
|
||||||
Console.WriteLine("Divisor cycles are ready");
|
Console.WriteLine("Divisor cycles are ready");
|
||||||
|
|
||||||
if (useByDivisor)
|
if (useByDivisor)
|
||||||
{
|
{
|
||||||
@@ -519,14 +519,14 @@ internal static class Program
|
|||||||
|
|
||||||
_divisorTester = new MersenneNumberDivisorGpuTester();
|
_divisorTester = new MersenneNumberDivisorGpuTester();
|
||||||
}
|
}
|
||||||
else if (useByDivisor)
|
else if (useByDivisor)
|
||||||
{
|
{
|
||||||
_byDivisorTester = mersenneOnGpu
|
_byDivisorTester = mersenneOnGpu
|
||||||
? new MersenneNumberDivisorByDivisorGpuTester()
|
? new MersenneNumberDivisorByDivisorGpuTester()
|
||||||
: new MersenneNumberDivisorByDivisorCpuTester();
|
: new MersenneNumberDivisorByDivisorCpuTester();
|
||||||
_byDivisorTester.BatchSize = scanBatchSize;
|
_byDivisorTester.BatchSize = scanBatchSize;
|
||||||
_byDivisorTester.UseDivisorCycles = useDivisorCycles;
|
_byDivisorTester.UseDivisorCycles = useDivisorCycles;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load RLE blacklist (optional)
|
// Load RLE blacklist (optional)
|
||||||
if (!string.IsNullOrEmpty(_rleBlacklistPath))
|
if (!string.IsNullOrEmpty(_rleBlacklistPath))
|
||||||
@@ -885,18 +885,18 @@ internal static class Program
|
|||||||
bool exhausted = false;
|
bool exhausted = false;
|
||||||
ulong divisor = 0UL;
|
ulong divisor = 0UL;
|
||||||
int activeCount = 0;
|
int activeCount = 0;
|
||||||
Span<byte> hitsSpan = default;
|
Span<byte> hitsSpan = default;
|
||||||
int hitIndex = 0;
|
int hitIndex = 0;
|
||||||
int index = 0;
|
int index = 0;
|
||||||
bool useCycleFilter = _byDivisorTester!.UseDivisorCycles;
|
bool useCycleFilter = _byDivisorTester!.UseDivisorCycles;
|
||||||
DivisorCycleCache.Lease cycleLease = default;
|
DivisorCycleCache.Lease cycleLease = default;
|
||||||
ulong cycleLeaseStart = 0UL;
|
ulong cycleLeaseStart = 0UL;
|
||||||
ulong cycleLeaseEnd = 0UL;
|
ulong cycleLeaseEnd = 0UL;
|
||||||
ulong[]? cycleValues = null;
|
ulong[]? cycleValues = null;
|
||||||
ulong divisorCycle = 0UL;
|
ulong divisorCycle = 0UL;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
if (Volatile.Read(ref remainingStates) == 0)
|
if (Volatile.Read(ref remainingStates) == 0)
|
||||||
@@ -909,11 +909,11 @@ 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 (!exhausted)
|
if (!exhausted)
|
||||||
{
|
{
|
||||||
if (Volatile.Read(ref remainingStates) == 0)
|
if (Volatile.Read(ref remainingStates) == 0)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -946,48 +946,48 @@ internal static class Program
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (useCycleFilter)
|
if (useCycleFilter)
|
||||||
{
|
{
|
||||||
if (!cycleLease.IsValid || divisor < cycleLeaseStart || divisor > cycleLeaseEnd)
|
if (!cycleLease.IsValid || divisor < cycleLeaseStart || divisor > cycleLeaseEnd)
|
||||||
{
|
{
|
||||||
cycleLease.Dispose();
|
cycleLease.Dispose();
|
||||||
cycleLease = DivisorCycleCache.Shared.Acquire(divisor);
|
cycleLease = DivisorCycleCache.Shared.Acquire(divisor);
|
||||||
cycleLeaseStart = cycleLease.Start;
|
cycleLeaseStart = cycleLease.Start;
|
||||||
cycleLeaseEnd = cycleLease.End;
|
cycleLeaseEnd = cycleLease.End;
|
||||||
cycleValues = cycleLease.Values;
|
cycleValues = cycleLease.Values;
|
||||||
}
|
}
|
||||||
else if (cycleValues is null)
|
else if (cycleValues is null)
|
||||||
{
|
{
|
||||||
cycleValues = cycleLease.Values;
|
cycleValues = cycleLease.Values;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cycleValues is not null && divisor >= cycleLeaseStart)
|
if (cycleValues is not null && divisor >= cycleLeaseStart)
|
||||||
{
|
{
|
||||||
ulong offset = divisor - cycleLeaseStart;
|
ulong offset = divisor - cycleLeaseStart;
|
||||||
if (offset < (ulong)cycleValues.Length)
|
if (offset < (ulong)cycleValues.Length)
|
||||||
{
|
{
|
||||||
divisorCycle = cycleValues[(int)offset];
|
divisorCycle = cycleValues[(int)offset];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
divisorCycle = cycleLease.GetCycle(divisor);
|
divisorCycle = cycleLease.GetCycle(divisor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
divisorCycle = cycleLease.GetCycle(divisor);
|
divisorCycle = cycleLease.GetCycle(divisor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
divisorCycle = 0UL;
|
divisorCycle = 0UL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Can we prepare as many buffers as many threads were requested upfront and have them prepared in separate task, so that they're always ready when needed?
|
// Can we prepare as many buffers as many threads were requested upfront and have them prepared in separate task, so that they're always ready when needed?
|
||||||
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);
|
||||||
|
|
||||||
if (completionsCount > 0)
|
if (completionsCount > 0)
|
||||||
{
|
{
|
||||||
@@ -999,9 +999,9 @@ internal static class Program
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
hitsSpan = hitsBuffer.AsSpan(0, activeCount);
|
hitsSpan = hitsBuffer.AsSpan(0, activeCount);
|
||||||
hitsSpan.Clear();
|
hitsSpan.Clear();
|
||||||
session.CheckDivisor(divisor, divisorCycle, primeBuffer.AsSpan(0, activeCount), hitsSpan);
|
session.CheckDivisor(divisor, divisorCycle, primeBuffer.AsSpan(0, activeCount), hitsSpan);
|
||||||
|
|
||||||
for (hitIndex = 0; hitIndex < activeCount; hitIndex++)
|
for (hitIndex = 0; hitIndex < activeCount; hitIndex++)
|
||||||
{
|
{
|
||||||
@@ -1039,15 +1039,15 @@ internal static class Program
|
|||||||
{
|
{
|
||||||
FlushPendingResults(compositesBuffer, ref compositesCount);
|
FlushPendingResults(compositesBuffer, ref compositesCount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
cycleLease.Dispose();
|
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);
|
||||||
ArrayPool<byte>.Shared.Return(hitsBuffer, clearArray: true);
|
ArrayPool<byte>.Shared.Return(hitsBuffer, clearArray: true);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user