From b792eb90e02636067ae288077bb5941292f35d14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Lema=C5=84czyk?= Date: Thu, 25 Sep 2025 09:35:02 +0200 Subject: [PATCH] Small optimization --- ...MersenneNumberDivisorByDivisorGpuTester.cs | 56 +++---------------- 1 file changed, 9 insertions(+), 47 deletions(-) diff --git a/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs b/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs index adb72f1..e39ad4a 100644 --- a/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs +++ b/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs @@ -453,14 +453,9 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv _disposed = true; _owner.ReturnSession(this); } - - } - internal void ReturnSession(DivisorScanSession session) - { - _sessionPool.Add(session); - } + internal void ReturnSession(DivisorScanSession session) => _sessionPool.Add(session); private static void ComputePrimeExponentKernel(Index1D index, MontgomeryDivisorData divisor, ArrayView exponents, ArrayView results) { @@ -521,28 +516,21 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv private BatchResources RentBatchResources(Accelerator accelerator, int capacity) { - var bag = _resourcePools.GetOrAdd(accelerator, static _ => new ConcurrentBag()); + var bag = _resourcePools.GetOrAdd(accelerator, static _ => []); if (bag.TryTake(out BatchResources? resources)) { - resources.EnsureCapacity(capacity); return resources; } return new BatchResources(accelerator, capacity); } - private void ReturnBatchResources(Accelerator accelerator, BatchResources resources) - { - _resourcePools.GetOrAdd(accelerator, static _ => []).Add(resources); - } + private void ReturnBatchResources(Accelerator accelerator, BatchResources resources) => _resourcePools.GetOrAdd(accelerator, static _ => []).Add(resources); private sealed class BatchResources : IDisposable { - private readonly Accelerator _accelerator; - internal BatchResources(Accelerator accelerator, int capacity) { - _accelerator = accelerator; DivisorsBuffer = accelerator.Allocate1D(capacity); HitsBuffer = accelerator.Allocate1D(capacity); Divisors = ArrayPool.Shared.Rent(capacity); @@ -551,43 +539,17 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv Capacity = capacity; } - internal MemoryBuffer1D DivisorsBuffer { get; private set; } + internal readonly MemoryBuffer1D DivisorsBuffer; - internal MemoryBuffer1D HitsBuffer { get; private set; } + internal readonly MemoryBuffer1D HitsBuffer; - internal ulong[] Divisors { get; private set; } + internal readonly ulong[] Divisors; - internal byte[] Hits { get; private set; } + internal readonly byte[] Hits; - internal MontgomeryDivisorData[] DivisorData { get; private set; } + internal readonly MontgomeryDivisorData[] DivisorData; - internal int Capacity { get; private set; } - - public void EnsureCapacity(int requiredCapacity) - { - if (requiredCapacity <= Capacity) - { - return; - } - - Resize(requiredCapacity); - } - - private void Resize(int newCapacity) - { - DivisorsBuffer.Dispose(); - HitsBuffer.Dispose(); - ArrayPool.Shared.Return(Divisors, clearArray: false); - ArrayPool.Shared.Return(Hits, clearArray: false); - ArrayPool.Shared.Return(DivisorData, clearArray: false); - - DivisorsBuffer = _accelerator.Allocate1D(newCapacity); - HitsBuffer = _accelerator.Allocate1D(newCapacity); - Divisors = ArrayPool.Shared.Rent(newCapacity); - Hits = ArrayPool.Shared.Rent(newCapacity); - DivisorData = ArrayPool.Shared.Rent(newCapacity); - Capacity = newCapacity; - } + internal readonly int Capacity; public void Dispose() {