Daily update on 20250907-184649 by Nitload Youmu. Additional Message : Matrix parallel task packet is done, parallel task executer is done. Now is working on building parallel wrap and pool.

Signed-off-by: Nitload <YoumuLiu_NSI@whv0t.onmicrosoft.com>
This commit is contained in:
Nitload
2025-09-07 18:46:49 +08:00
parent bfe3ada4fc
commit a7f82c04ea
5 changed files with 241 additions and 168 deletions
@@ -76,12 +76,9 @@ namespace StgSharp.Mathematics
private static readonly ManualResetEventSlim _restartEvent = new(false);
private static readonly ManualResetEventSlim _startEvent = new(false);
private static MatrixParallelTaskPackage _totalTask;
private static readonly object _lock = new();
private static ThreadPriority _AfterWork = ThreadPriority.Lowest;
public static ref MatrixParallelTaskPackage TotalTask => ref _totalTask;
public static bool SupportParallel { get; } = Environment.ProcessorCount > 6;
public static bool IsParallelMeaningful { get; } = Environment.ProcessorCount > 6;
@@ -139,7 +136,6 @@ namespace StgSharp.Mathematics
private Queue<IntPtr>[] _cache;
private Thread[] _threads;
private MatrixParallelTaskPackage _wrapTask;
public MatrixParallelWrap(int id, int wrapSize, bool isFirst)
{
@@ -169,8 +165,6 @@ namespace StgSharp.Mathematics
_threads[end].Start(new Handle(end, this));
}
public ref MatrixParallelTaskPackage WrapTask => ref _wrapTask;
public int ID { get; init; }
public Span<IntPtr> EnqueuePackage(Span<IntPtr> packageSpan)
@@ -183,9 +177,9 @@ namespace StgSharp.Mathematics
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool TryGetNextWrapTask(int idInWrap, out IntPtr handle)
public Queue<IntPtr> GetWorkerTaskQueue(int idInWrap)
{
return _cache[idInWrap].TryDequeue(out handle);
return _cache[idInWrap];
}
public record class Handle(int InWrapIndex, MatrixParallelWrap Wrap);
@@ -203,42 +197,35 @@ namespace StgSharp.Mathematics
while (true)
{
self.Priority = ThreadPriority.Highest;
while (wrap.TryGetNextWrapTask(inWrapIndex, out IntPtr ptr)) {
ExecuteTaskPackage((MatrixParallelTaskPackage*)ptr);
}
ExecuteTaskPackage(wrap.GetWorkerTaskQueue(inWrapIndex));
_ = Interlocked.Decrement(ref RemainThreadCount);
self.Priority = _AfterWork;
_restartEvent.Wait();
}
}
private static unsafe void ExecuteTaskPackage(MatrixParallelTaskPackage* p)
private static unsafe void ExecuteTaskPackage(Queue<IntPtr> taskQueue)
{
MatrixKernel* left = p->Left, right = p->Left, result = p->Result;
ref MatrixParallelEnumeration leftParam = ref p->LeftEnum, rightParam = ref p->RightEnum, resultParam = ref p->ResultEnum;
int count = p->count;
ScalarDataPacket* scalar = p->scalerPacket;
switch (p->ComputeMode)
while (taskQueue.TryDequeue(out nint handle))
{
case 1: // Unary operation
for (int i = 0; i < length; i++) { }
break;
case 2:
break;
case 3:
break;
case 4:
break;
case -1:
break;
case -2:
break;
case -3:
break;
case -4:
break;
default:
break;
MatrixParallelTaskPackage* p = (MatrixParallelTaskPackage*)handle;
switch (p->ComputeMode)
{
case 1:
Compute_Unary(p);
break;
case 2:
Compute_UnaryScalar(p);
break;
case 3:
Compute_Binary(p);
break;
case 4:
Compute_BinaryScalar(p);
break;
default:
break;
}
}
}
@@ -254,7 +241,7 @@ namespace StgSharp.Mathematics
while (true)
{
self.Priority = ThreadPriority.Highest;
while (wrap.TryGetNextWrapTask(inWrapIndex, out IntPtr ptr)) {
while (wrap.GetWorkerTaskQueue(inWrapIndex, out IntPtr ptr)) {
ExecuteTaskPackage((MatrixParallelTaskPackage*)ptr);
}
_ = Interlocked.Decrement(ref RemainThreadCount);