Compare commits

...
Author SHA1 Message Date
mlemanczyk 38b3df9405 GPU calculations disabled again 2025-10-17 05:09:13 +02:00
mlemanczyk d30a915890 Various optimizations 2025-10-17 05:07:11 +02:00
mlemanczyk 91dd373f43 Capacity increased 2025-10-17 05:06:44 +02:00
Marek Lemańczyk 6d82f5a608 Enable GPU execution for windowed Montgomery pow2 2025-10-17 04:11:16 +02:00
4 changed files with 999 additions and 929 deletions

No files matched your search

@@ -546,7 +546,7 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
} }
ulong exponent = exponents[index]; ulong exponent = exponents[index];
hits[index] = exponent.Pow2MontgomeryModWindowedGpu(divisor, keepMontgomery: false) == 1UL ? (byte)1 : (byte)0; hits[index] = ULongExtensions.Pow2MontgomeryModWindowedKernel(exponent, divisor, keepMontgomery: false) == 1UL ? (byte)1 : (byte)0;
} }
public sealed class DivisorScanSession : IMersenneNumberDivisorByDivisorTester.IDivisorScanSession public sealed class DivisorScanSession : IMersenneNumberDivisorByDivisorTester.IDivisorScanSession
@@ -765,7 +765,7 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
ulong exponent = exponents[index]; ulong exponent = exponents[index];
results[index] = exponent.Pow2MontgomeryModWindowedGpu(divisor, keepMontgomery: true); results[index] = ULongExtensions.Pow2MontgomeryModWindowedKernel(exponent, divisor, keepMontgomery: true);
} }
public ulong DivisorLimit public ulong DivisorLimit
@@ -809,7 +809,7 @@ internal static partial class PrimeOrderGpuHeuristics
} }
ulong reduced = phi / factor; ulong reduced = phi / factor;
if (reduced.Pow2MontgomeryModWindowedGpu(divisor, keepMontgomery: false) == 1UL) if (ULongExtensions.Pow2MontgomeryModWindowedKernel(reduced, divisor, keepMontgomery: false) == 1UL)
{ {
return false; return false;
} }
@@ -1593,7 +1593,7 @@ internal static partial class PrimeOrderGpuHeuristics
private static bool Pow2EqualsOneKernel(ulong exponent, in MontgomeryDivisorData divisor) private static bool Pow2EqualsOneKernel(ulong exponent, in MontgomeryDivisorData divisor)
{ {
return exponent.Pow2MontgomeryModWindowedGpu(divisor, keepMontgomery: false) == 1UL; return ULongExtensions.Pow2MontgomeryModWindowedKernel(exponent, divisor, keepMontgomery: false) == 1UL;
} }
private static ulong CalculateByDoublingKernel(ulong prime) private static ulong CalculateByDoublingKernel(ulong prime)
@@ -1793,7 +1793,7 @@ internal static partial class PrimeOrderGpuHeuristics
return 0UL; return 0UL;
} }
return exponent.Pow2MontgomeryModWindowedGpu(divisorData, keepMontgomery: false); return ULongExtensions.Pow2MontgomeryModWindowedKernel(exponent, divisorData, keepMontgomery: false);
} }
private static Action<AcceleratorStream, Index1D, ArrayView1D<ulong, Stride1D.Dense>, MontgomeryDivisorData, ArrayView1D<ulong, Stride1D.Dense>> GetPow2ModKernel(Accelerator accelerator) private static Action<AcceleratorStream, Index1D, ArrayView1D<ulong, Stride1D.Dense>, MontgomeryDivisorData, ArrayView1D<ulong, Stride1D.Dense>> GetPow2ModKernel(Accelerator accelerator)
@@ -1809,7 +1809,7 @@ internal static partial class PrimeOrderGpuHeuristics
private static void Pow2ModKernel(Index1D index, ArrayView1D<ulong, Stride1D.Dense> exponents, MontgomeryDivisorData divisor, ArrayView1D<ulong, Stride1D.Dense> remainders) private static void Pow2ModKernel(Index1D index, ArrayView1D<ulong, Stride1D.Dense> exponents, MontgomeryDivisorData divisor, ArrayView1D<ulong, Stride1D.Dense> remainders)
{ {
ulong exponent = exponents[index]; ulong exponent = exponents[index];
remainders[index] = exponent.Pow2MontgomeryModWindowedGpu(divisor, keepMontgomery: false); remainders[index] = ULongExtensions.Pow2MontgomeryModWindowedKernel(exponent, divisor, keepMontgomery: false);
} }
private static Action<AcceleratorStream, Index1D, ArrayView1D<GpuUInt128, Stride1D.Dense>, GpuUInt128, ArrayView1D<GpuUInt128, Stride1D.Dense>> GetPow2ModWideKernel(Accelerator accelerator) private static Action<AcceleratorStream, Index1D, ArrayView1D<GpuUInt128, Stride1D.Dense>, GpuUInt128, ArrayView1D<GpuUInt128, Stride1D.Dense>> GetPow2ModWideKernel(Accelerator accelerator)
+11 -11
View File
@@ -317,7 +317,7 @@ internal static partial class PrimeOrderCalculator
bool gpuStackRemainders = false; bool gpuStackRemainders = false;
GpuPow2ModStatus status = GpuPow2ModStatus.Unavailable; GpuPow2ModStatus status = GpuPow2ModStatus.Unavailable;
// if (allowGpuBatch && IsGpuPow2Allowed) if (allowGpuBatch && IsGpuPow2Allowed)
{ {
if (batchSize <= StackGpuBatchSize) if (batchSize <= StackGpuBatchSize)
{ {
@@ -638,21 +638,21 @@ internal static partial class PrimeOrderCalculator
private static bool Pow2EqualsOneCpu(ulong exponent, ulong prime, in MontgomeryDivisorData divisorData) private static bool Pow2EqualsOneCpu(ulong exponent, ulong prime, in MontgomeryDivisorData divisorData)
{ {
// if (IsGpuPow2Allowed) if (IsGpuPow2Allowed)
// { {
ulong remainder = exponent.Pow2MontgomeryModWindowedGpu(divisorData, false); // ulong remainder = exponent.Pow2MontgomeryModWindowedGpu(divisorData, false);
// GpuPow2ModStatus status = PrimeOrderGpuHeuristics.TryPow2Mod(exponent, prime, out ulong remainder, divisorData); GpuPow2ModStatus status = PrimeOrderGpuHeuristics.TryPow2Mod(exponent, prime, out ulong remainder, divisorData);
// if (status == GpuPow2ModStatus.Success) if (status == GpuPow2ModStatus.Success)
// { {
return remainder == 1UL; return remainder == 1UL;
// } }
// } }
// return exponent.Pow2MontgomeryModWindowedCpu(divisorData, keepMontgomery: false) == 1UL; return exponent.Pow2MontgomeryModWindowedCpu(divisorData, keepMontgomery: false) == 1UL;
} }
// [ThreadStatic] // [ThreadStatic]
private static readonly Dictionary<ulong, bool> _primalityCache = new(16_777_216); private static readonly Dictionary<ulong, bool> _primalityCache = new(134_217_728);
private static readonly ReaderWriterLockSlim _primalityCacheLock = new(LockRecursionPolicy.NoRecursion); private static readonly ReaderWriterLockSlim _primalityCacheLock = new(LockRecursionPolicy.NoRecursion);
// [ThreadStatic] // [ThreadStatic]
File diff suppressed because it is too large. Load diff