Performance improvements
This commit is contained in:
1 parent
5bc65464d0
commit
43863d03fb
11 files changed
+127
-86
No files matched your search
@@ -1,24 +1,26 @@
|
||||
using System.Collections.Concurrent;
|
||||
using ILGPU.Runtime;
|
||||
using Open.Collections;
|
||||
|
||||
namespace PerfectNumbers.Core.Gpu.Accelerators;
|
||||
|
||||
public static class AcceleratorStreamPool
|
||||
{
|
||||
private static readonly ConcurrentDictionary<Accelerator, ConcurrentQueue<AcceleratorStream>> _streams = new(20_480, PerfectNumberConstants.RollingAccelerators);
|
||||
private static readonly Dictionary<Accelerator, ConcurrentQueue<AcceleratorStream>> _streams = new(PerfectNumberConstants .RollingAccelerators);
|
||||
// private static readonly ConcurrentDictionary<Accelerator, AcceleratorStream> _streams = new(AcceleratorPool.Shared.Accelerators.ToDictionary(static x => x, CreateStream));
|
||||
|
||||
private static SemaphoreSlim CreateLock() => new(PerfectNumberConstants.ThreadsByStream);
|
||||
private static AcceleratorStream CreateStream(Accelerator accelerator) => accelerator.CreateStream();
|
||||
|
||||
private static readonly ConcurrentDictionary<Accelerator, SemaphoreSlim> _locks = new(AcceleratorPool.Shared.Accelerators.ToDictionary(x => x, static x => CreateLock()));
|
||||
private static readonly Dictionary<Accelerator, SemaphoreSlim> _locks = new(AcceleratorPool.Shared.Accelerators.ToDictionary(x => x, static x => CreateLock()));
|
||||
|
||||
public static AcceleratorStream Rent(Accelerator accelerator)
|
||||
{
|
||||
var streamLock = _locks.GetOrAdd(accelerator, static _ => new SemaphoreSlim(PerfectNumberConstants.ThreadsByStream));
|
||||
var streamLock = _locks[accelerator];
|
||||
// var streamLock = _locks.GetOrAdd(accelerator, static _ => CreateLock());
|
||||
|
||||
streamLock.Wait();
|
||||
var queue = _streams.GetOrAdd(accelerator, static _ => new());
|
||||
var queue = _streams[accelerator];
|
||||
|
||||
return queue.TryDequeue(out var stream)
|
||||
? stream
|
||||
@@ -28,9 +30,23 @@ public static class AcceleratorStreamPool
|
||||
public static void Return(AcceleratorStream stream)
|
||||
{
|
||||
Accelerator accelerator = stream.Accelerator;
|
||||
var streamLock = _locks.GetOrAdd(accelerator, static _ => CreateLock());
|
||||
var queue = _streams.GetOrAdd(accelerator, static _ => new());
|
||||
var streamLock = _locks[accelerator];
|
||||
var queue = _streams[accelerator];
|
||||
queue.Enqueue(stream);
|
||||
streamLock.Release();
|
||||
}
|
||||
|
||||
public static void WarmUp(Accelerator accelerator)
|
||||
{
|
||||
_streams.Add(accelerator, new());
|
||||
_ = _locks.TryAdd(accelerator, CreateLock());
|
||||
|
||||
// ConcurrentQueue<AcceleratorStream> streamQueue = new();
|
||||
// var stream = accelerator.CreateStream();
|
||||
// // var stream = accelerator.CreateStream();
|
||||
// streamQueue.Enqueue(stream);
|
||||
// _streams[accelerator] = streamQueue;
|
||||
// _locks[accelerator] = CreateLock();
|
||||
// stream.Synchronize();
|
||||
}
|
||||
}
|
||||
@@ -72,6 +72,8 @@ public sealed class Pow2MontgomeryAccelerator
|
||||
{
|
||||
Console.WriteLine($"Preparing accelerator {i}...");
|
||||
var accelerator = accelerators[i];
|
||||
AcceleratorStreamPool.WarmUp(accelerator);
|
||||
// AcceleratorStream stream = AcceleratorStreamPool.Rent(accelerator);
|
||||
AcceleratorStream stream = accelerator.CreateStream();
|
||||
LastDigitGpuTables.EnsureStaticTables(accelerator, stream);
|
||||
// SharedHeuristicGpuTables.EnsureStaticTables(accelerator, stream);
|
||||
@@ -80,6 +82,8 @@ public sealed class Pow2MontgomeryAccelerator
|
||||
// GpuStaticTableInitializer.EnsureStaticTables(accelerator, kernels, stream);
|
||||
stream.Synchronize();
|
||||
stream.Dispose();
|
||||
|
||||
// AcceleratorStreamPool.Return(stream);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user