Problem on fma data sync or thread load unbalance
This commit is contained in:
@@ -41,21 +41,37 @@ using System.Threading;
|
||||
|
||||
namespace StgSharp.Mathematics
|
||||
{
|
||||
[StructLayout(LayoutKind.Explicit)]
|
||||
[StructLayout(LayoutKind.Explicit, Size = 32, Pack = 8)]
|
||||
public unsafe struct MatrixParallelEnumeration
|
||||
{
|
||||
|
||||
[FieldOffset(00)] public MatrixKernel* kernel;
|
||||
|
||||
[FieldOffset(08)] public int begin;
|
||||
[FieldOffset(12)] public int end;
|
||||
[FieldOffset(16)] public int primCount;
|
||||
[FieldOffset(20)] public int primStride;
|
||||
[FieldOffset(24)] public int secCount;
|
||||
[FieldOffset(28)] public int secStride;
|
||||
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Explicit, Size = 128, Pack = 8)]
|
||||
public unsafe struct MatrixParallelTaskPackage
|
||||
{
|
||||
|
||||
[FieldOffset(0)] public MatrixKernel* left;
|
||||
[FieldOffset(8)] public MatrixKernel* result;
|
||||
[FieldOffset(16)] public MatrixKernel* right;
|
||||
[FieldOffset(40)] public ScalarDataPacket* scalerPacket;
|
||||
[FieldOffset(24)] public int ComputeMode;
|
||||
[FieldOffset(60)] public int count;
|
||||
[FieldOffset(72)] public MatrixKernel* kernel;
|
||||
[FieldOffset(0)] public MatrixKernel* Left;
|
||||
[FieldOffset(32)] public MatrixKernel* Result;
|
||||
[FieldOffset(64)] public MatrixKernel* Right;
|
||||
[FieldOffset(96)] public ScalarDataPacket* scalerPacket;
|
||||
[FieldOffset(100)] public int ComputeMode;
|
||||
[FieldOffset(104)] public int count;
|
||||
[FieldOffset(108)] public IntPtr executionHandle;
|
||||
|
||||
[FieldOffset(48)] public int leftStride;
|
||||
[FieldOffset(56)] public int resultStride;
|
||||
[FieldOffset(52)] public int rightStride;
|
||||
[FieldOffset(32)] public IntPtr executionHandle;
|
||||
[FieldOffset(0)] public MatrixParallelEnumeration LeftEnum;
|
||||
[FieldOffset(32)] public MatrixParallelEnumeration ResultEnum;
|
||||
[FieldOffset(64)] public MatrixParallelEnumeration RightEnum;
|
||||
|
||||
}
|
||||
|
||||
@@ -87,43 +103,4 @@ namespace StgSharp.Mathematics
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public unsafe class MatrixParallelWrap
|
||||
{
|
||||
|
||||
public Queue<IntPtr>[] cache;
|
||||
|
||||
public MatrixParallelWrap(int wrapSize)
|
||||
{
|
||||
cache = new Queue<IntPtr>[wrapSize];
|
||||
for (int i = 0; i < cache.Length; i++) {
|
||||
cache[i] = new Queue<IntPtr>(8);
|
||||
}
|
||||
}
|
||||
|
||||
public Span<IntPtr> EnqueuePackage(Span<IntPtr> packageSpan)
|
||||
{
|
||||
int idx = 0;
|
||||
for (; idx < cache.Length; idx++) {
|
||||
cache[idx].Enqueue(packageSpan[idx]);
|
||||
}
|
||||
return packageSpan[idx..];
|
||||
}
|
||||
|
||||
public void EnqueuePackage(MatrixParallelTaskPackage* task)
|
||||
{
|
||||
Span<IntPtr> span = stackalloc IntPtr[cache.Length];
|
||||
MatrixParallelFactory.
|
||||
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public bool TryGetNextWrapTask(int idInWrap, out IntPtr handle)
|
||||
{
|
||||
return cache[idInWrap].TryDequeue(out handle);
|
||||
}
|
||||
|
||||
public record class Handle(int InWrapIndex, MatrixParallelWrap Wrap);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user