add scheduler method; fixing buffer parallel errors
This commit is contained in:
@@ -27,6 +27,7 @@
|
||||
// -----------------------------------------------------------------------
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
@@ -53,6 +54,7 @@ namespace StgSharp.Mathematics.Numeric
|
||||
_affinity = AffinityAllocator.Allocate();
|
||||
|
||||
_managedThread = new Thread(MatrixParallelWorker);
|
||||
_managedThread.Start();
|
||||
_resetEvent = new ManualResetEventSlim(false);
|
||||
}
|
||||
|
||||
@@ -78,7 +80,7 @@ namespace StgSharp.Mathematics.Numeric
|
||||
{
|
||||
while (taskQueue.TryDequeue(out nint handle))
|
||||
{
|
||||
MatrixParallelTaskPackageNonGeneric* p = (MatrixParallelTaskPackageNonGeneric*)handle;
|
||||
MatrixParallelTaskPackage* p = (MatrixParallelTaskPackage*)handle;
|
||||
switch (p->ComputeMode.OperationStyle)
|
||||
{
|
||||
case MatrixOperationStyle.PANEL_OP:
|
||||
@@ -127,16 +129,12 @@ namespace StgSharp.Mathematics.Numeric
|
||||
}
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public void Restart()
|
||||
{
|
||||
_resetEvent.Set();
|
||||
}
|
||||
|
||||
public void ReturnToPool()
|
||||
{
|
||||
// MatrixParallel.(this);
|
||||
}
|
||||
|
||||
protected virtual void Dispose(bool disposing)
|
||||
{
|
||||
if (!disposedValue)
|
||||
@@ -159,27 +157,30 @@ namespace StgSharp.Mathematics.Numeric
|
||||
// Bind OS-thread affinity once when the worker starts running
|
||||
ApplyAffinityIfNeeded();
|
||||
|
||||
// Thread self = Thread.CurrentThread;
|
||||
_resetEvent.Wait();
|
||||
_resetEvent.Reset();
|
||||
_managedThread.Priority = ThreadPriority.Highest;
|
||||
switch (Role)
|
||||
while (true)
|
||||
{
|
||||
case 0://worker
|
||||
// _ = Interlocked.Decrement(ref RemainThreadCount);
|
||||
ExecuteTaskPackage(Tasks);
|
||||
break;
|
||||
case 1://scheduler
|
||||
BindedWrap.PublishTaskToWorkers(Tasks);
|
||||
BindedWrap.SetAllWorker();
|
||||
ExecuteTaskPackage(Tasks);
|
||||
break;
|
||||
case 2://leader, error because leader should be at outer thread but not here
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
// Thread self = Thread.CurrentThread;
|
||||
_managedThread.Priority = ThreadPriority.Highest;
|
||||
_resetEvent.Wait();
|
||||
_resetEvent.Reset();
|
||||
switch (Role)
|
||||
{
|
||||
case 0://worker
|
||||
// _ = Interlocked.Decrement(ref RemainThreadCount);
|
||||
ExecuteTaskPackage(Tasks);
|
||||
break;
|
||||
case 1://scheduler
|
||||
BindedWrap.PublishTaskToWorkers(BindedWrap.WrapTask);
|
||||
BindedWrap.SetAllWorker();
|
||||
ExecuteTaskPackage(Tasks);
|
||||
break;
|
||||
case 2://leader, error because leader should be at outer thread but not here
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
_managedThread.Priority = AfterWork;
|
||||
}
|
||||
_managedThread.Priority = AfterWork;
|
||||
}
|
||||
|
||||
#region core affinity
|
||||
|
||||
Reference in New Issue
Block a user