IsPrime optimized to do more operations outside of the lock.

This commit is contained in:
Marek Lemańczyk committed 2025-09-24 01:58:02 +02:00
1 parent cc834687fd
commit 4d16cfffa2
1 file changed
+12 -17
@@ -16,20 +16,12 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester
private ulong _lastStatusDivisor; private ulong _lastStatusDivisor;
private bool _useDivisorCycles; private bool _useDivisorCycles;
public readonly struct MontgomeryDivisorData public readonly struct MontgomeryDivisorData(ulong modulus, ulong nPrime, ulong montgomeryOne, ulong montgomeryTwo)
{ {
public readonly ulong Modulus; public readonly ulong Modulus = modulus;
public readonly ulong NPrime; public readonly ulong NPrime = nPrime;
public readonly ulong MontgomeryOne; public readonly ulong MontgomeryOne = montgomeryOne;
public readonly ulong MontgomeryTwo; public readonly ulong MontgomeryTwo = montgomeryTwo;
public MontgomeryDivisorData(ulong modulus, ulong nPrime, ulong montgomeryOne, ulong montgomeryTwo)
{
Modulus = modulus;
NPrime = nPrime;
MontgomeryOne = montgomeryOne;
MontgomeryTwo = montgomeryTwo;
}
} }
private readonly ConcurrentDictionary<Accelerator, Action<Index1D, ulong, ArrayView<MontgomeryDivisorData>, ArrayView<byte>>> _kernelCache = new(); private readonly ConcurrentDictionary<Accelerator, Action<Index1D, ulong, ArrayView<MontgomeryDivisorData>, ArrayView<byte>>> _kernelCache = new();
@@ -63,8 +55,6 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester
} }
public bool IsPrime(ulong prime, out bool divisorsExhausted) public bool IsPrime(ulong prime, out bool divisorsExhausted)
{
lock (_sync)
{ {
if (!_isConfigured) if (!_isConfigured)
{ {
@@ -78,12 +68,18 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester
return true; return true;
} }
bool composite = CheckDivisors(prime, allowedMax, out ulong lastProcessed, out bool coveredRange); bool composite, coveredRange;
// TODO: Let's rework this to check if the number is prime and check divisors outside of the lock. Lock and update the state afterwards.
lock (_sync)
{
composite = CheckDivisors(prime, allowedMax, out ulong lastProcessed, out coveredRange);
if (lastProcessed != 0UL) if (lastProcessed != 0UL)
{ {
ReportStatus(lastProcessed); ReportStatus(lastProcessed);
} }
}
if (composite) if (composite)
{ {
@@ -94,7 +90,6 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester
divisorsExhausted = coveredRange; divisorsExhausted = coveredRange;
return true; return true;
} }
}
private bool CheckDivisors(ulong prime, ulong allowedMax, out ulong lastProcessed, out bool coveredRange) private bool CheckDivisors(ulong prime, ulong allowedMax, out ulong lastProcessed, out bool coveredRange)
{ {