From 86990ae0f79bd67545c2e337bece694fc56ec66a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Lema=C5=84czyk?= Date: Tue, 28 Oct 2025 13:30:47 +0100 Subject: [PATCH] Remove kernel initialization lock from GPU leases --- PerfectNumbers.Core/Gpu/GpuKernelLease.cs | 78 +++++++++-------------- 1 file changed, 30 insertions(+), 48 deletions(-) diff --git a/PerfectNumbers.Core/Gpu/GpuKernelLease.cs b/PerfectNumbers.Core/Gpu/GpuKernelLease.cs index 0603ef9..a79af7a 100644 --- a/PerfectNumbers.Core/Gpu/GpuKernelLease.cs +++ b/PerfectNumbers.Core/Gpu/GpuKernelLease.cs @@ -56,15 +56,12 @@ public sealed class GpuKernelLease get { var accel = Accelerator; // avoid capturing 'this' in lambda - lock (_gpu!.Value.ExecutionLock) + return KernelContainer.InitOnce(ref _kernels!.Order, () => { - return KernelContainer.InitOnce(ref _kernels!.Order, () => - { - var loaded = accel.LoadAutoGroupedStreamKernel, ArrayView>(OrderKernels.OrderKernelScan); - var kernel = KernelUtil.GetKernel(loaded); - return kernel.CreateLauncherDelegate, ArrayView>>(); - }); - } + var loaded = accel.LoadAutoGroupedStreamKernel, ArrayView>(OrderKernels.OrderKernelScan); + var kernel = KernelUtil.GetKernel(loaded); + return kernel.CreateLauncherDelegate, ArrayView>>(); + }); } } @@ -73,15 +70,12 @@ public sealed class GpuKernelLease get { var accel = Accelerator; - lock (_gpu!.Value.ExecutionLock) + return KernelContainer.InitOnce(ref _kernels!.Pow2Mod, () => { - return KernelContainer.InitOnce(ref _kernels!.Pow2Mod, () => - { - var loaded = accel.LoadAutoGroupedStreamKernel, ArrayView1D, ArrayView1D, ArrayView1D, ArrayView1D, ArrayView1D>(Pow2ModKernels.Pow2ModKernelScan); - var kernel = KernelUtil.GetKernel(loaded); - return kernel.CreateLauncherDelegate, ArrayView1D, ArrayView1D, ArrayView1D, ArrayView1D, ArrayView1D>>(); - }); - } + var loaded = accel.LoadAutoGroupedStreamKernel, ArrayView1D, ArrayView1D, ArrayView1D, ArrayView1D, ArrayView1D>(Pow2ModKernels.Pow2ModKernelScan); + var kernel = KernelUtil.GetKernel(loaded); + return kernel.CreateLauncherDelegate, ArrayView1D, ArrayView1D, ArrayView1D, ArrayView1D, ArrayView1D>>(); + }); } } @@ -90,15 +84,12 @@ public sealed class GpuKernelLease get { var accel = Accelerator; - lock (_gpu!.Value.ExecutionLock) + return KernelContainer.InitOnce(ref _kernels!.Incremental, () => { - return KernelContainer.InitOnce(ref _kernels!.Incremental, () => - { - var loaded = accel.LoadAutoGroupedStreamKernel, ArrayView1D>(IncrementalKernels.IncrementalKernelScan); - var kernel = KernelUtil.GetKernel(loaded); - return kernel.CreateLauncherDelegate, ArrayView1D>>(); - }); - } + var loaded = accel.LoadAutoGroupedStreamKernel, ArrayView1D>(IncrementalKernels.IncrementalKernelScan); + var kernel = KernelUtil.GetKernel(loaded); + return kernel.CreateLauncherDelegate, ArrayView1D>>(); + }); } } @@ -107,15 +98,12 @@ public sealed class GpuKernelLease get { var accel = Accelerator; - lock (_gpu!.Value.ExecutionLock) + return KernelContainer.InitOnce(ref _kernels!.IncrementalOrder, () => { - return KernelContainer.InitOnce(ref _kernels!.IncrementalOrder, () => - { - var loaded = accel.LoadAutoGroupedStreamKernel, ArrayView1D>(IncrementalKernels.IncrementalOrderKernelScan); - var kernel = KernelUtil.GetKernel(loaded); - return kernel.CreateLauncherDelegate, ArrayView1D>>(); - }); - } + var loaded = accel.LoadAutoGroupedStreamKernel, ArrayView1D>(IncrementalKernels.IncrementalOrderKernelScan); + var kernel = KernelUtil.GetKernel(loaded); + return kernel.CreateLauncherDelegate, ArrayView1D>>(); + }); } } @@ -124,15 +112,12 @@ public sealed class GpuKernelLease get { var accel = Accelerator; - lock (_gpu!.Value.ExecutionLock) + return KernelContainer.InitOnce(ref _kernels!.Pow2ModOrder, () => { - return KernelContainer.InitOnce(ref _kernels!.Pow2ModOrder, () => - { - var loaded = accel.LoadAutoGroupedStreamKernel, ArrayView1D>(Pow2ModKernels.Pow2ModOrderKernelScan); - var kernel = KernelUtil.GetKernel(loaded); - return kernel.CreateLauncherDelegate, ArrayView1D>>(); - }); - } + var loaded = accel.LoadAutoGroupedStreamKernel, ArrayView1D>(Pow2ModKernels.Pow2ModOrderKernelScan); + var kernel = KernelUtil.GetKernel(loaded); + return kernel.CreateLauncherDelegate, ArrayView1D>>(); + }); } } @@ -141,15 +126,12 @@ public sealed class GpuKernelLease get { var accel = Accelerator; - lock (_gpu!.Value.ExecutionLock) + return KernelContainer.InitOnce(ref _kernels!.SmallPrimeFactor, () => { - return KernelContainer.InitOnce(ref _kernels!.SmallPrimeFactor, () => - { - var loaded = accel.LoadAutoGroupedStreamKernel, ArrayView1D, int, ArrayView1D, ArrayView1D, ArrayView1D, ArrayView1D>(SmallPrimeFactorKernels.SmallPrimeFactorKernelScan); - var kernel = KernelUtil.GetKernel(loaded); - return kernel.CreateLauncherDelegate, ArrayView1D, int, ArrayView1D, ArrayView1D, ArrayView1D, ArrayView1D>>(); - }); - } + var loaded = accel.LoadAutoGroupedStreamKernel, ArrayView1D, int, ArrayView1D, ArrayView1D, ArrayView1D, ArrayView1D>(SmallPrimeFactorKernels.SmallPrimeFactorKernelScan); + var kernel = KernelUtil.GetKernel(loaded); + return kernel.CreateLauncherDelegate, ArrayView1D, int, ArrayView1D, ArrayView1D, ArrayView1D, ArrayView1D>>(); + }); } }