Small optimization
This commit is contained in:
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()
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in new issue
Block a user