Various optimizations and cleanups. "in" removed from GpuUInt128 to avoid defensive copies from IL.

This commit is contained in:
mlemanczyk committed 2025-10-10 09:26:25 +02:00
1 parent 70eca5126b
commit ca0cadc8a3
18 files changed
+565 -395

No files matched your search

@@ -1,15 +1,12 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Numerics;
using PerfectNumbers.Core;
namespace PerfectNumbers.Core.Cpu;
public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDivisorByDivisorTester
{
private readonly object _sync = new();
private readonly ConcurrentBag<DivisorScanSession> _sessionPool = new();
private readonly ConcurrentBag<DivisorScanSession> _sessionPool = [];
private ulong _divisorLimit;
private ulong _lastStatusDivisor;
private bool _isConfigured;
@@ -213,7 +210,7 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv
ulong mersenne;
if (prime <= 63UL)
{
mersenne = (1UL << (int)prime) - 1UL;
mersenne = (1UL << (int)prime) - 1UL;
hasExactMersenne = true;
}
else if (prime == 64UL)
@@ -249,7 +246,7 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv
else
{
factorCache ??= new Dictionary<ulong, MersenneDivisorCycles.FactorCacheEntry>(8);
if (!MersenneDivisorCycles.TryCalculateCycleLengthForExponent(candidate, prime, divisorData, factorCache, out divisorCycle) || divisorCycle == 0UL)
if (!MersenneDivisorCycles.TryCalculateCycleLengthForExponentCpu(candidate, prime, divisorData, factorCache, out divisorCycle) || divisorCycle == 0UL)
{
divisorCycle = cycleCache.GetCycleLength(candidate);
}
@@ -287,12 +284,12 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv
UInt128 incrementAmount = step * increments;
divisor += incrementAmount;
remainder10 = AdvanceRemainder(remainder10, step10, (byte)10, increments);
remainder8 = AdvanceRemainder(remainder8, step8, (byte)8, increments);
remainder5 = AdvanceRemainder(remainder5, step5, (byte)5, increments);
remainder3 = AdvanceRemainder(remainder3, step3, (byte)3, increments);
remainder7 = AdvanceRemainder(remainder7, step7, (byte)7, increments);
remainder11 = AdvanceRemainder(remainder11, step11, (byte)11, increments);
remainder10 = AdvanceRemainder(remainder10, step10, 10, increments);
remainder8 = AdvanceRemainder(remainder8, step8, 8, increments);
remainder5 = AdvanceRemainder(remainder5, step5, 5, increments);
remainder3 = AdvanceRemainder(remainder3, step3, 3, increments);
remainder7 = AdvanceRemainder(remainder7, step7, 7, increments);
remainder11 = AdvanceRemainder(remainder11, step11, 11, increments);
}
processedAll = divisor > limit;
@@ -301,7 +298,7 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv
private static byte CheckDivisor(ulong prime, ulong divisorCycle, in MontgomeryDivisorData divisorData)
{
ulong residue = prime.Pow2MontgomeryModWithCycle(divisorCycle, divisorData);
ulong residue = prime.Pow2MontgomeryModWithCycleCpu(divisorCycle, divisorData);
return residue == 1UL ? (byte)1 : (byte)0;
}
@@ -323,8 +320,8 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv
return remainder;
}
ulong modulusValue = (ulong)modulus;
ulong scaledDelta = ((ulong)delta * (increments % modulusValue)) % modulusValue;
ulong modulusValue = modulus;
ulong scaledDelta = (delta * (increments % modulusValue)) % modulusValue;
byte reducedDelta = (byte)scaledDelta;
int sum = remainder + reducedDelta;
if (sum >= modulus)