43 lines
1.1 KiB
C#
43 lines
1.1 KiB
C#
using System.Collections.Concurrent;
|
|
using ILGPU.Runtime;
|
|
|
|
namespace PerfectNumbers.Core.Gpu.Accelerators;
|
|
|
|
public static class AcceleratorStreamPool
|
|
{
|
|
private static readonly Accelerator[] _accelerators = AcceleratorPool.Shared.Accelerators;
|
|
private static readonly SemaphoreSlim[] _locks = new SemaphoreSlim[PerfectNumberConstants.RollingAccelerators];
|
|
private static readonly AcceleratorStream[] _streams = new AcceleratorStream[PerfectNumberConstants.RollingAccelerators];
|
|
private static SemaphoreSlim CreateLock() => new(PerfectNumberConstants.ThreadsByAccelerator);
|
|
|
|
|
|
// private static int _rented;
|
|
|
|
public static AcceleratorStream Rent(int acceleratorIndex)
|
|
{
|
|
var streamLock = _locks[acceleratorIndex];
|
|
|
|
streamLock.Wait();
|
|
var queue = _streams[acceleratorIndex];
|
|
if (queue != null)
|
|
{
|
|
return queue;
|
|
}
|
|
|
|
queue = _accelerators[acceleratorIndex].CreateStream();
|
|
_streams[acceleratorIndex] = queue;
|
|
return queue;
|
|
}
|
|
|
|
public static void Return(int acceleratorIndex)
|
|
{
|
|
var streamLock = _locks[acceleratorIndex];
|
|
streamLock.Release();
|
|
}
|
|
|
|
public static void WarmUp(int acceleratorIndex)
|
|
{
|
|
_locks[acceleratorIndex] = CreateLock();
|
|
}
|
|
}
|