Huge progress on Matrix Parallel, a parallel pool has its basic structure.

This commit is contained in:
Youmu Liu
2025-09-02 21:56:10 +08:00
parent 2475a3b0ed
commit 125040620b
6 changed files with 307 additions and 39 deletions
@@ -42,7 +42,7 @@ namespace StgSharp.Mathematics
private static readonly SlabAllocator<ScalarDataPacket> _scalarAllocator = SlabAllocator<ScalarDataPacket>.Create(64, SlabBufferLayout.Chunked, true);
private static readonly SlabAllocator<MatrixParallelTaskWrap> _wrapAllocator = SlabAllocator<MatrixParallelTaskWrap>.Create(64, SlabBufferLayout.Chunked, true);
private static readonly SlabAllocator<MatrixParallelTaskPackage> _wrapAllocator = SlabAllocator<MatrixParallelTaskPackage>.Create(64, SlabBufferLayout.Chunked, true);
public static ScalarDataPacket* CreateScalarPacket()
{
@@ -50,9 +50,9 @@ namespace StgSharp.Mathematics
return p;
}
public static MatrixParallelTaskWrap* FromTaskWrap(MatrixParallelTaskWrap* source, int offset)
public static MatrixParallelTaskPackage* FromTaskWrap(MatrixParallelTaskPackage* source, int offset)
{
MatrixParallelTaskWrap* p = (MatrixParallelTaskWrap*)_wrapAllocator.Allocate();
MatrixParallelTaskPackage* p = (MatrixParallelTaskPackage*)_wrapAllocator.Allocate();
*p = *source;
p->left += offset * p->leftStride;
p->right += offset * p->rightStride;
@@ -65,7 +65,7 @@ namespace StgSharp.Mathematics
_scalarAllocator.Free((nuint)source);
}
public static void Release(MatrixParallelTaskWrap* source)
public static void Release(MatrixParallelTaskPackage* source)
{
if (source->scalerPacket != null) {
_scalarAllocator.Free((nuint)source->scalerPacket);
@@ -73,5 +73,29 @@ namespace StgSharp.Mathematics
_wrapAllocator.Free((nuint)source);
}
public static void SliceTask(MatrixParallelTaskPackage* source, Span<IntPtr> group)
{
int count = group.Length;
group[0] = (nint)source;
int l = source->leftStride, r = source->rightStride, res = source->resultStride, c = source->count / count;
source->leftStride *= count;
source->rightStride *= count;
source->resultStride *= count;
int remain = source->count - (c * count);
for (int i = 1; i < count; i++)
{
nint handle = (nint)_wrapAllocator.Allocate();
MatrixParallelTaskPackage* p = (MatrixParallelTaskPackage*)handle;
*p = *source;
p->left += l;
p->right += r;
p->result += res;
group[i] = handle;
}
for (int i = 0; i < remain; i++) {
((MatrixParallelTaskPackage*)group[^i])->count++;
}
}
}
}