diff --git a/PerfectNumbers.Core/Gpu/Accelerators/HeuristicPrimeTesterAccelerator.cs b/PerfectNumbers.Core/Gpu/Accelerators/HeuristicPrimeTesterAccelerator.cs index 2654e7d..4d57e00 100644 --- a/PerfectNumbers.Core/Gpu/Accelerators/HeuristicPrimeTesterAccelerator.cs +++ b/PerfectNumbers.Core/Gpu/Accelerators/HeuristicPrimeTesterAccelerator.cs @@ -104,22 +104,7 @@ internal sealed class HeuristicPrimeTesterAccelerator return cached; } - [ThreadStatic] - public static Dictionary, ulong, ulong, HeuristicGpuDivisorTableKind, HeuristicGpuDivisorTables>>? HeuristicTrialDivisionKernel; - - internal static Action, ulong, ulong, HeuristicGpuDivisorTableKind, HeuristicGpuDivisorTables> GetHeuristicTrialDivisionKernel(Accelerator accelerator) - { - var pool = HeuristicTrialDivisionKernel ??= []; - if (pool.TryGetValue(accelerator, out var cached)) - { - return cached; - } - - cached = KernelUtil.GetKernel(accelerator.LoadAutoGroupedStreamKernel, ulong, ulong, HeuristicGpuDivisorTableKind, HeuristicGpuDivisorTables>(PrimeTesterKernels.HeuristicTrialDivisionKernel)).CreateLauncherDelegate, ulong, ulong, HeuristicGpuDivisorTableKind, HeuristicGpuDivisorTables>>(); - pool[accelerator] = cached; - return cached; - } - + public readonly Kernel HeuristicTrialDivisionKernel; public MemoryBuffer1D Input = null!; public MemoryBuffer1D Output = null!; @@ -152,17 +137,19 @@ internal sealed class HeuristicPrimeTesterAccelerator Context = accelerator.Context; Accelerator = accelerator; - AcceleratorStream stream = accelerator.CreateStream(); - // var kernels = _kernels[index]; //GpuKernelPool.Kernels; + EnsureCapacity(minBufferCapacity); + + HeuristicTrialDivisionKernel = KernelUtil.GetKernel(accelerator.LoadAutoGroupedStreamKernel, ulong, ulong, HeuristicGpuDivisorTableKind, HeuristicGpuDivisorTables>(PrimeTesterKernels.HeuristicTrialDivisionKernel)); + + AcceleratorStream stream = AcceleratorStreamPool.Rent(accelerator); + // GpuStaticTableInitializer.EnsureStaticTables(accelerator, kernels, stream); _sharedTables = Accelerators.HeuristicGpuTables.EnsureStaticTables(accelerator, stream); - var heuristicDivisorTables = _sharedTables.CreateHeuristicDivisorTables(); - _heuristicDivisorTables = heuristicDivisorTables; + _heuristicDivisorTables = _sharedTables.CreateHeuristicDivisorTables(); - EnsureCapacity(minBufferCapacity); stream.Synchronize(); - stream.Dispose(); + AcceleratorStreamPool.Return(stream); } public void EnsureCapacity(int minCapacity) @@ -172,16 +159,13 @@ internal sealed class HeuristicPrimeTesterAccelerator return; } - Input?.Dispose(); - Output?.Dispose(); + Input.Dispose(); + Output.Dispose(); HeuristicFlag?.Dispose(); - // lock (Accelerator) - { - Input = Accelerator.Allocate1D(minCapacity); - Output = Accelerator.Allocate1D(minCapacity); - HeuristicFlag = Accelerator.Allocate1D(minCapacity); - } + Input = Accelerator.Allocate1D(minCapacity); + Output = Accelerator.Allocate1D(minCapacity); + HeuristicFlag = Accelerator.Allocate1D(minCapacity); BufferCapacity = minCapacity; } diff --git a/PerfectNumbers.Core/Gpu/Accelerators/PrimeOrderCalculatorAccelerator.cs b/PerfectNumbers.Core/Gpu/Accelerators/PrimeOrderCalculatorAccelerator.cs index 81813cf..797faf1 100644 --- a/PerfectNumbers.Core/Gpu/Accelerators/PrimeOrderCalculatorAccelerator.cs +++ b/PerfectNumbers.Core/Gpu/Accelerators/PrimeOrderCalculatorAccelerator.cs @@ -110,6 +110,8 @@ public sealed class PrimeOrderCalculatorAccelerator public readonly Kernel ConvertToStandardKernel; public readonly Kernel KeepMontgomeryKernel; public readonly Kernel PollardRhoKernel; + public Kernel SharesFactorKernel; + public void EnsureCapacity(int factorsCount, int primeTesterCapacity) { @@ -199,6 +201,8 @@ public sealed class PrimeOrderCalculatorAccelerator SmallPrimeSieveKernel = KernelUtil.GetKernel(accelerator.LoadAutoGroupedStreamKernel, ArrayView, ArrayView, ArrayView, ArrayView, ArrayView, ArrayView, ArrayView, ArrayView, ArrayView>(PrimeTesterKernels.SmallPrimeSieveKernel)); PollardRhoKernel = KernelUtil.GetKernel(accelerator.LoadStreamKernel, ArrayView1D, ArrayView1D>(Pow2MontgomeryKernels.TryPollardRhoKernel)); + + SharesFactorKernel = KernelUtil.GetKernel(accelerator.LoadAutoGroupedStreamKernel, ArrayView>(PrimeTesterKernels.SharesFactorKernel)); ; } public void Dispose() diff --git a/PerfectNumbers.Core/HeuristicCombinedPrimeTester.cs b/PerfectNumbers.Core/HeuristicCombinedPrimeTester.cs index 727eaa1..5c14b30 100644 --- a/PerfectNumbers.Core/HeuristicCombinedPrimeTester.cs +++ b/PerfectNumbers.Core/HeuristicCombinedPrimeTester.cs @@ -228,7 +228,7 @@ public sealed class HeuristicCombinedPrimeTester var gpu = HeuristicPrimeTesterAccelerator.Rent(1); var accelerator = gpu.Accelerator; var stream = gpu.Stream; - var kernel = HeuristicPrimeTesterAccelerator.HeuristicTrialDivisionKernel; + var kernel = gpu.HeuristicTrialDivisionKernel; var flagView1D = gpu.HeuristicFlag.View; var flagView = flagView1D.AsContiguous(); @@ -240,8 +240,9 @@ public sealed class HeuristicCombinedPrimeTester stream!.Synchronize(); - kernel( + kernel.Launch( stream, + 1, divisorLength, flagView, n, diff --git a/PerfectNumbers.Core/HeuristicPrimeTester.cs b/PerfectNumbers.Core/HeuristicPrimeTester.cs index 29d14f3..29865e1 100644 --- a/PerfectNumbers.Core/HeuristicPrimeTester.cs +++ b/PerfectNumbers.Core/HeuristicPrimeTester.cs @@ -243,9 +243,8 @@ public sealed class HeuristicPrimeTester { // GpuPrimeWorkLimiter.Acquire(); var gpu = HeuristicPrimeTesterAccelerator.Rent(1); - var accelerator = gpu.Accelerator; var stream = gpu.Stream; - var kernel = HeuristicPrimeTesterAccelerator.GetHeuristicTrialDivisionKernel(accelerator); + var kernel = gpu.HeuristicTrialDivisionKernel; var flagView1D = gpu.HeuristicFlag.View; var flagView = flagView1D.AsContiguous(); @@ -255,8 +254,9 @@ public sealed class HeuristicPrimeTester int groupALength = HeuristicPrimeSieves.GroupADivisors.Length; flagView1D.CopyFromCPU(stream, ref compositeFlag, 1); - kernel( + kernel.Launch( stream!, + 1, groupALength, flagView, n, @@ -292,8 +292,9 @@ public sealed class HeuristicPrimeTester compositeFlag = 0; flagView1D.CopyFromCPU(stream, ref compositeFlag, 1); - kernel( - stream, + kernel.Launch( + stream, + 1, divisorLength, flagView, n, diff --git a/PerfectNumbers.Core/PrimeTester.cs b/PerfectNumbers.Core/PrimeTester.cs index 0aeabe2..c357f65 100644 --- a/PerfectNumbers.Core/PrimeTester.cs +++ b/PerfectNumbers.Core/PrimeTester.cs @@ -278,10 +278,10 @@ public sealed class PrimeTester // and implement it. int length = values.Length; - ArrayPool pool = ThreadStaticPools.UlongPool; var gpu = PrimeOrderCalculatorAccelerator.Rent(1); var accelerator = gpu.Accelerator; + var kernel = gpu.SharesFactorKernel; gpu.EnsureCapacity(0, length); MemoryBuffer1D? inputBuffer = gpu.PrimeTestInput; MemoryBuffer1D? resultBuffer = gpu.OutputByte; @@ -289,8 +289,7 @@ public sealed class PrimeTester AcceleratorStream stream = AcceleratorStreamPool.Rent(accelerator); inputBuffer.View.CopyFromCPU(stream, values); - var kernel = GetSharesFactorKernel(accelerator); - kernel(stream, length, inputBuffer.View, resultBuffer.View); + kernel.Launch(stream, 1, length, inputBuffer.View, resultBuffer.View); resultBuffer.View.CopyToCPU(stream, in results); stream.Synchronize(); @@ -298,19 +297,6 @@ public sealed class PrimeTester PrimeOrderCalculatorAccelerator.Return(gpu); } - private static Action, ArrayView> GetSharesFactorKernel(Accelerator accelerator) - { - var pool = _kernel ?? []; - if (pool.TryGetValue(accelerator, out var cached)) - { - return cached; - } - - cached = KernelUtil.GetKernel(accelerator.LoadAutoGroupedStreamKernel, ArrayView>(PrimeTesterKernels.SharesFactorKernel)).CreateLauncherDelegate, ArrayView>>(); - pool[accelerator] = cached; - return cached; - } - [MethodImpl(MethodImplOptions.AggressiveInlining)] private static ulong BinaryGcd(ulong u, ulong v) {