Small optimization

This commit is contained in:
Marek Lemańczyk committed 2025-09-25 09:35:02 +02:00
1 parent 74747adc7c
commit b792eb90e0
1 file changed
+9 -47
@@ -453,14 +453,9 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
_disposed = true; _disposed = true;
_owner.ReturnSession(this); _owner.ReturnSession(this);
} }
} }
internal void ReturnSession(DivisorScanSession session) internal void ReturnSession(DivisorScanSession session) => _sessionPool.Add(session);
{
_sessionPool.Add(session);
}
private static void ComputePrimeExponentKernel(Index1D index, MontgomeryDivisorData divisor, ArrayView<ulong> exponents, ArrayView<ulong> results) private static void ComputePrimeExponentKernel(Index1D index, MontgomeryDivisorData divisor, ArrayView<ulong> exponents, ArrayView<ulong> results)
{ {
@@ -521,28 +516,21 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
private BatchResources RentBatchResources(Accelerator accelerator, int capacity) private BatchResources RentBatchResources(Accelerator accelerator, int capacity)
{ {
var bag = _resourcePools.GetOrAdd(accelerator, static _ => new ConcurrentBag<BatchResources>()); var bag = _resourcePools.GetOrAdd(accelerator, static _ => []);
if (bag.TryTake(out BatchResources? resources)) if (bag.TryTake(out BatchResources? resources))
{ {
resources.EnsureCapacity(capacity);
return resources; return resources;
} }
return new BatchResources(accelerator, capacity); return new BatchResources(accelerator, capacity);
} }
private void ReturnBatchResources(Accelerator accelerator, BatchResources resources) private void ReturnBatchResources(Accelerator accelerator, BatchResources resources) => _resourcePools.GetOrAdd(accelerator, static _ => []).Add(resources);
{
_resourcePools.GetOrAdd(accelerator, static _ => []).Add(resources);
}
private sealed class BatchResources : IDisposable private sealed class BatchResources : IDisposable
{ {
private readonly Accelerator _accelerator;
internal BatchResources(Accelerator accelerator, int capacity) internal BatchResources(Accelerator accelerator, int capacity)
{ {
_accelerator = accelerator;
DivisorsBuffer = accelerator.Allocate1D<MontgomeryDivisorData>(capacity); DivisorsBuffer = accelerator.Allocate1D<MontgomeryDivisorData>(capacity);
HitsBuffer = accelerator.Allocate1D<byte>(capacity); HitsBuffer = accelerator.Allocate1D<byte>(capacity);
Divisors = ArrayPool<ulong>.Shared.Rent(capacity); Divisors = ArrayPool<ulong>.Shared.Rent(capacity);
@@ -551,43 +539,17 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
Capacity = capacity; Capacity = capacity;
} }
internal MemoryBuffer1D<MontgomeryDivisorData, Stride1D.Dense> DivisorsBuffer { get; private set; } internal readonly MemoryBuffer1D<MontgomeryDivisorData, Stride1D.Dense> DivisorsBuffer;
internal MemoryBuffer1D<byte, Stride1D.Dense> HitsBuffer { get; private set; } internal readonly MemoryBuffer1D<byte, Stride1D.Dense> 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; } internal readonly int Capacity;
public void EnsureCapacity(int requiredCapacity)
{
if (requiredCapacity <= Capacity)
{
return;
}
Resize(requiredCapacity);
}
private void Resize(int newCapacity)
{
DivisorsBuffer.Dispose();
HitsBuffer.Dispose();
ArrayPool<ulong>.Shared.Return(Divisors, clearArray: false);
ArrayPool<byte>.Shared.Return(Hits, clearArray: false);
ArrayPool<MontgomeryDivisorData>.Shared.Return(DivisorData, clearArray: false);
DivisorsBuffer = _accelerator.Allocate1D<MontgomeryDivisorData>(newCapacity);
HitsBuffer = _accelerator.Allocate1D<byte>(newCapacity);
Divisors = ArrayPool<ulong>.Shared.Rent(newCapacity);
Hits = ArrayPool<byte>.Shared.Rent(newCapacity);
DivisorData = ArrayPool<MontgomeryDivisorData>.Shared.Rent(newCapacity);
Capacity = newCapacity;
}
public void Dispose() public void Dispose()
{ {