Split GPU heuristic tables by scope

This commit is contained in:
Marek Lemańczyk committed 2025-11-01 09:22:44 +01:00
1 parent 936ce239db
commit 6027a73839
6 files changed
+574 -392

No files matched your search

+25 -5
View File
@@ -241,12 +241,13 @@ public sealed class HeuristicPrimeTester
private bool HeuristicTrialDivisionGpuDetectsDivisor(ulong n, ulong maxDivisorSquare, byte nMod10)
{
var limiter = GpuPrimeWorkLimiter.Acquire();
var gpu = PrimeTester.PrimeTesterGpuContextPool.Rent(1);
var gpu = PrimeTester.PrimeTesterGpuContextPool.Rent(nMod10, 1, PrimeTester.PrimeTesterGpuContextPool.HeuristicGpuTableScope.GroupAB);
var accelerator = gpu.Accelerator;
var kernel = gpu.HeuristicTrialDivisionKernel;
var flagView1D = gpu.HeuristicFlag.View;
var flagView = flagView1D.AsContiguous();
ulong maxDivisor = ComputeMaxDivisorLimit(maxDivisorSquare);
bool compositeDetected = false;
int compositeFlag = 0;
@@ -257,9 +258,10 @@ public sealed class HeuristicPrimeTester
groupALength,
flagView,
n,
maxDivisorSquare,
maxDivisor,
HeuristicGpuDivisorTableKind.GroupA,
gpu.HeuristicGpuTables);
gpu.HeuristicGpuTables,
gpu.HeuristicCombinedTables);
accelerator.Synchronize();
flagView1D.CopyToCPU(ref compositeFlag, 1);
compositeDetected = compositeFlag != 0;
@@ -291,9 +293,10 @@ public sealed class HeuristicPrimeTester
divisorLength,
flagView,
n,
maxDivisorSquare,
maxDivisor,
tableKind,
gpu.HeuristicGpuTables);
gpu.HeuristicGpuTables,
gpu.HeuristicCombinedTables);
accelerator.Synchronize();
flagView1D.CopyToCPU(ref compositeFlag, 1);
compositeDetected = compositeFlag != 0;
@@ -312,6 +315,23 @@ public sealed class HeuristicPrimeTester
{
return Prime.Numbers.IsPrime(n);
}
private static ulong ComputeMaxDivisorLimit(ulong maxDivisorSquare)
{
ulong maxDivisor = (ulong)Math.Sqrt(maxDivisorSquare);
while ((maxDivisor + 1) != 0 && (maxDivisor + 1) <= maxDivisorSquare / (maxDivisor + 1))
{
maxDivisor++;
}
while (maxDivisor != 0 && maxDivisor > maxDivisorSquare / maxDivisor)
{
maxDivisor--;
}
return maxDivisor;
}
internal static ulong ComputeHeuristicDivisorSquareLimit(ulong n)
{
return n;