using System.Collections.Concurrent; using ILGPU; using ILGPU.Runtime; namespace PerfectNumbers.Core.Gpu; public sealed class GpuKernelLease { private static readonly ConcurrentQueue Pool = new(); internal static GpuKernelLease Rent() { if (!Pool.TryDequeue(out var lease)) { lease = new GpuKernelLease(); } return lease; } public static readonly Action, ArrayView> OrderKernel = GpuKernelPool.Kernels.Order!; public static readonly Action, ArrayView1D, ArrayView1D, ArrayView1D, ArrayView1D, ArrayView1D> Pow2ModKernel = GpuKernelPool.Kernels.Pow2Mod!; public static readonly Action, ArrayView1D> IncrementalKernel = GpuKernelPool.Kernels.Incremental!; public static readonly Action, ArrayView1D> IncrementalOrderKernel = GpuKernelPool.Kernels.IncrementalOrder!; public static readonly Action, ArrayView1D> Pow2ModOrderKernel = GpuKernelPool.Kernels.Pow2ModOrder!; public static readonly Action, int, MontgomeryDivisorData, ArrayView1D, ArrayView1D> SpecialMaxKernel = GpuKernelPool.Kernels.SpecialMax!; public static readonly Action, ArrayView1D, int, ArrayView1D, ArrayView1D, ArrayView1D, ArrayView1D> SmallPrimeFactorKernel = GpuKernelPool.Kernels.SmallPrimeFactor!; public void Dispose() { Pool.Enqueue(this); GpuPrimeWorkLimiter.Release(); } }