Add cycle cache hit tracking instrumentation

This commit is contained in:
Marek Lemańczyk committed 2025-10-20 19:28:06 +02:00
1 parent 1a4818c794
commit 8acccce471
4 files changed
+50 -93

No files matched your search

@@ -12,12 +12,6 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv
private ulong _lastStatusDivisor;
private int _batchSize = 1_024;
private const int FactorCachePrimeTrackingLimit = 500_000;
private static readonly HashSet<ulong> FactorCacheTrackedPrimes = new();
private static readonly object FactorCachePrimeLock = new();
private static ulong FactorCachePrimeHitCount;
private static bool FactorCachePrimeTrackingDisabled;
[ThreadStatic]
private static GpuUInt128WorkSet _divisorScanGpuWorkSet;
@@ -122,8 +116,6 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv
processedCount = 0UL;
processedAll = false;
ObserveFactorCachePrime(prime);
// The EvenPerfectBitScanner feeds primes >= 138,000,000 here, so allowedMax >= 3 in production runs.
// Keeping the guard commented out documents the reasoning for benchmarks and tests.
// if (allowedMax < 3UL)
@@ -263,43 +255,6 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv
return false;
}
private static void ObserveFactorCachePrime(ulong prime)
{
bool logHit = false;
ulong hitNumber = 0UL;
bool trackingDisabledNow = false;
lock (FactorCachePrimeLock)
{
if (FactorCachePrimeTrackingDisabled)
{
return;
}
if (!FactorCacheTrackedPrimes.Add(prime))
{
FactorCachePrimeHitCount++;
hitNumber = FactorCachePrimeHitCount;
logHit = true;
}
else if (FactorCacheTrackedPrimes.Count >= FactorCachePrimeTrackingLimit)
{
FactorCachePrimeTrackingDisabled = true;
FactorCacheTrackedPrimes.Clear();
trackingDisabledNow = true;
}
}
if (logHit)
{
Console.WriteLine($"Factor cache hit for exponent {prime} ({hitNumber})");
}
else if (trackingDisabledNow)
{
Console.WriteLine("Factor cache hit tracking disabled after exceeding the tracking limit.");
}
}
private static byte CheckDivisor(ulong prime, ulong divisorCycle, in MontgomeryDivisorData divisorData)
{
ulong residue = prime.Pow2MontgomeryModWithCycleCpu(divisorCycle, divisorData);