Problem on fma data sync or thread load unbalance

This commit is contained in:
Youmu Liu
2025-09-03 21:29:45 +08:00
parent 125040620b
commit c9442d2b4f
3 changed files with 209 additions and 196 deletions
@@ -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);
}
}