From 31f649015cfc057459f84ec5093a7d1eb32d7bed Mon Sep 17 00:00:00 2001 From: Youmu Liu <105042599+Nitload-NSI@users.noreply.github.com> Date: Thu, 9 Oct 2025 20:47:09 +0800 Subject: [PATCH] all public occassions --- .../Linear/MatrixParallel.Publish.cs | 760 +++++++++++++++++- 1 file changed, 751 insertions(+), 9 deletions(-) diff --git a/StgSharp.Common/Mathematics/Linear/MatrixParallel.Publish.cs b/StgSharp.Common/Mathematics/Linear/MatrixParallel.Publish.cs index 0338c129..e79be888 100644 --- a/StgSharp.Common/Mathematics/Linear/MatrixParallel.Publish.cs +++ b/StgSharp.Common/Mathematics/Linear/MatrixParallel.Publish.cs @@ -42,6 +42,32 @@ namespace StgSharp.Mathematics public static partial class MatrixParallel { + public static unsafe void PublicTask( + MatrixSegmentEnumeration source, + MatrixSegmentEnumeration ans, + delegate**, MatrixKernel*, MatrixKernel*, void> Operation) + where T: unmanaged, INumber + { + MatrixParallelTaskPackage* package = MatrixParallelFactory.CreateBaseTask(); + package->Right = source.Source; + package->Result = ans.Source; + package->RightPrimOffset = source.PrimOffset; + package->ResultPrimOffset = ans.PrimOffset; + package->RightPrimStride = source.PrimStride; + package->ResultPrimStride = ans.PrimStride; + package->RightSecOffset = source.SecondaryOffset; + package->ResultSecOffset = ans.SecondaryOffset; + package->RightSecStride = source.SecondaryStride; + package->ResultSecStride = ans.SecondaryStride; + package->PrimCount = source.PrimSize; + package->SecCount = source.SecondarySize; + package->ComputeHandle = (nint)Operation; + package->ElementSize = sizeof(T); + package->ComputeMode = 1; // Unary + + PublicTaskPrivate(package); + } + public static unsafe void PublicTask( MatrixSegmentEnumeration left, MatrixSegmentEnumeration right, @@ -49,11 +75,6 @@ namespace StgSharp.Mathematics delegate**, MatrixKernel*, MatrixKernel*, void> Operation) where T: unmanaged, INumber { - int length = _threads.Length, - columnCount = left.PrimSize, - rowCount = right.PrimSize; - (int c3, int c4) = FastDecompose(columnCount); - MatrixParallelTaskPackage* package = MatrixParallelFactory.CreateBaseTask(); package->Left = left.Source; package->Right = right.Source; @@ -74,11 +95,732 @@ namespace StgSharp.Mathematics package->SecCount = left.SecondarySize; package->ComputeHandle = (nint)Operation; package->ElementSize = sizeof(T); - package->ComputeMode = 3; + package->ComputeMode = 3; // Binary - int baseCount = columnCount / length, - rem = columnCount % length; - if (baseCount == 0) { } + PublicTaskPrivate(package); + } + + // Unary with 1..8 scalars (each scalar is independent generic type) + public static unsafe void PublicTask( + MatrixSegmentEnumeration source, + MatrixSegmentEnumeration ans, + delegate**, MatrixKernel*, MatrixKernel*, void> Operation, + TScalar0 s0) + where T: unmanaged, INumber + where TScalar0: unmanaged, INumber + { + MatrixParallelTaskPackage* package = MatrixParallelFactory.CreateBaseTask(); + package->Right = source.Source; + package->Result = ans.Source; + package->RightPrimOffset = source.PrimOffset; + package->ResultPrimOffset = ans.PrimOffset; + package->RightPrimStride = source.PrimStride; + package->ResultPrimStride = ans.PrimStride; + package->RightSecOffset = source.SecondaryOffset; + package->ResultSecOffset = ans.SecondaryOffset; + package->RightSecStride = source.SecondaryStride; + package->ResultSecStride = ans.SecondaryStride; + package->PrimCount = source.PrimSize; + package->SecCount = source.SecondarySize; + package->ComputeHandle = (nint)Operation; + package->ElementSize = sizeof(T); + package->ComputeMode = 2; // UnaryScalar + ScalarPacket* sp = MatrixParallelFactory.CreateScalarPacket(); + + sp->Data(0) = s0; + package->Scalar = sp; + PublicTaskPrivate(package); + } + + public static unsafe void PublicTask( + MatrixSegmentEnumeration source, + MatrixSegmentEnumeration ans, + delegate**, MatrixKernel*, MatrixKernel*, void> Operation, + TScalar0 s0, + TScalar1 s1) + where T: unmanaged, INumber + where TScalar0: unmanaged, INumber + where TScalar1: unmanaged, INumber + { + MatrixParallelTaskPackage* package = MatrixParallelFactory.CreateBaseTask(); + package->Right = source.Source; + package->Result = ans.Source; + package->RightPrimOffset = source.PrimOffset; + package->ResultPrimOffset = ans.PrimOffset; + package->RightPrimStride = source.PrimStride; + package->ResultPrimStride = ans.PrimStride; + package->RightSecOffset = source.SecondaryOffset; + package->ResultSecOffset = ans.SecondaryOffset; + package->RightSecStride = source.SecondaryStride; + package->ResultSecStride = ans.SecondaryStride; + package->PrimCount = source.PrimSize; + package->SecCount = source.SecondarySize; + package->ComputeHandle = (nint)Operation; + package->ElementSize = sizeof(T); + package->ComputeMode = 2; + ScalarPacket* sp = MatrixParallelFactory.CreateScalarPacket(); + + sp->Data(0) = s0; + sp->Data(1) = s1; + package->Scalar = sp; + PublicTaskPrivate(package); + } + + // Binary with 1..8 scalars (each scalar is independent generic type) + public static unsafe void PublicTask( + MatrixSegmentEnumeration left, + MatrixSegmentEnumeration right, + MatrixSegmentEnumeration ans, + delegate**, MatrixKernel*, MatrixKernel*, void> Operation, + TScalar0 s0) + where T: unmanaged, INumber + where TScalar0: unmanaged, INumber + { + MatrixParallelTaskPackage* package = MatrixParallelFactory.CreateBaseTask(); + package->Left = left.Source; + package->Right = right.Source; + package->Result = ans.Source; + package->LeftPrimOffset = left.PrimOffset; + package->RightPrimOffset = right.PrimOffset; + package->ResultPrimOffset = ans.PrimOffset; + package->LeftPrimStride = left.PrimStride; + package->RightPrimStride = right.PrimStride; + package->ResultPrimStride = ans.PrimStride; + package->LeftSecOffset = left.SecondaryOffset; + package->RightSecOffset = right.SecondaryOffset; + package->ResultSecOffset = ans.SecondaryOffset; + package->LeftSecStride = left.SecondaryStride; + package->RightSecStride = right.SecondaryStride; + package->ResultSecStride = ans.SecondaryStride; + package->PrimCount = left.PrimSize; + package->SecCount = left.SecondarySize; + package->ComputeHandle = (nint)Operation; + package->ElementSize = sizeof(T); + package->ComputeMode = 4; // BinaryScalar + ScalarPacket* sp = MatrixParallelFactory.CreateScalarPacket(); + + sp->Data(0) = s0; + package->Scalar = sp; + PublicTaskPrivate(package); + } + + public static unsafe void PublicTask( + MatrixSegmentEnumeration source, + MatrixSegmentEnumeration ans, + delegate**, MatrixKernel*, MatrixKernel*, void> Operation, + TScalar0 s0, + TScalar1 s1, + TScalar2 s2) + where T: unmanaged, INumber + where TScalar0: unmanaged, INumber + where TScalar1: unmanaged, INumber + where TScalar2: unmanaged, INumber + { + MatrixParallelTaskPackage* package = MatrixParallelFactory.CreateBaseTask(); + package->Right = source.Source; + package->Result = ans.Source; + package->RightPrimOffset = source.PrimOffset; + package->ResultPrimOffset = ans.PrimOffset; + package->RightPrimStride = source.PrimStride; + package->ResultPrimStride = ans.PrimStride; + package->RightSecOffset = source.SecondaryOffset; + package->ResultSecOffset = ans.SecondaryOffset; + package->RightSecStride = source.SecondaryStride; + package->ResultSecStride = ans.SecondaryStride; + package->PrimCount = source.PrimSize; + package->SecCount = source.SecondarySize; + package->ComputeHandle = (nint)Operation; + package->ElementSize = sizeof(T); + package->ComputeMode = 2; + ScalarPacket* sp = MatrixParallelFactory.CreateScalarPacket(); + + sp->Data(0) = s0; + sp->Data(1) = s1; + sp->Data(2) = s2; + package->Scalar = sp; + PublicTaskPrivate(package); + } + + public static unsafe void PublicTask( + MatrixSegmentEnumeration left, + MatrixSegmentEnumeration right, + MatrixSegmentEnumeration ans, + delegate**, MatrixKernel*, MatrixKernel*, void> Operation, + TScalar0 s0, + TScalar1 s1) + where T: unmanaged, INumber + where TScalar0: unmanaged, INumber + where TScalar1: unmanaged, INumber + { + MatrixParallelTaskPackage* package = MatrixParallelFactory.CreateBaseTask(); + package->Left = left.Source; + package->Right = right.Source; + package->Result = ans.Source; + package->LeftPrimOffset = left.PrimOffset; + package->RightPrimOffset = right.PrimOffset; + package->ResultPrimOffset = ans.PrimOffset; + package->LeftPrimStride = left.PrimStride; + package->RightPrimStride = right.PrimStride; + package->ResultPrimStride = ans.PrimStride; + package->LeftSecOffset = left.SecondaryOffset; + package->RightSecOffset = right.SecondaryOffset; + package->ResultSecOffset = ans.SecondaryOffset; + package->LeftSecStride = left.SecondaryStride; + package->RightSecStride = right.SecondaryStride; + package->ResultSecStride = ans.SecondaryStride; + package->PrimCount = left.PrimSize; + package->SecCount = left.SecondarySize; + package->ComputeHandle = (nint)Operation; + package->ElementSize = sizeof(T); + package->ComputeMode = 4; + ScalarPacket* sp = MatrixParallelFactory.CreateScalarPacket(); + + sp->Data(0) = s0; + sp->Data(1) = s1; + package->Scalar = sp; + PublicTaskPrivate(package); + } + + public static unsafe void PublicTask( + MatrixSegmentEnumeration source, + MatrixSegmentEnumeration ans, + delegate**, MatrixKernel*, MatrixKernel*, void> Operation, + TScalar0 s0, + TScalar1 s1, + TScalar2 s2, + TScalar3 s3) + where T: unmanaged, INumber + where TScalar0: unmanaged, INumber + where TScalar1: unmanaged, INumber + where TScalar2: unmanaged, INumber + where TScalar3: unmanaged, INumber + { + MatrixParallelTaskPackage* package = MatrixParallelFactory.CreateBaseTask(); + package->Right = source.Source; + package->Result = ans.Source; + package->RightPrimOffset = source.PrimOffset; + package->ResultPrimOffset = ans.PrimOffset; + package->RightPrimStride = source.PrimStride; + package->ResultPrimStride = ans.PrimStride; + package->RightSecOffset = source.SecondaryOffset; + package->ResultSecOffset = ans.SecondaryOffset; + package->RightSecStride = source.SecondaryStride; + package->ResultSecStride = ans.SecondaryStride; + package->PrimCount = source.PrimSize; + package->SecCount = source.SecondarySize; + package->ComputeHandle = (nint)Operation; + package->ElementSize = sizeof(T); + package->ComputeMode = 2; + ScalarPacket* sp = MatrixParallelFactory.CreateScalarPacket(); + + sp->Data(0) = s0; + sp->Data(1) = s1; + sp->Data(2) = s2; + sp->Data(3) = s3; + package->Scalar = sp; + PublicTaskPrivate(package); + } + + public static unsafe void PublicTask( + MatrixSegmentEnumeration left, + MatrixSegmentEnumeration right, + MatrixSegmentEnumeration ans, + delegate**, MatrixKernel*, MatrixKernel*, void> Operation, + TScalar0 s0, + TScalar1 s1, + TScalar2 s2) + where T: unmanaged, INumber + where TScalar0: unmanaged, INumber + where TScalar1: unmanaged, INumber + where TScalar2: unmanaged, INumber + { + MatrixParallelTaskPackage* package = MatrixParallelFactory.CreateBaseTask(); + package->Left = left.Source; + package->Right = right.Source; + package->Result = ans.Source; + package->LeftPrimOffset = left.PrimOffset; + package->RightPrimOffset = right.PrimOffset; + package->ResultPrimOffset = ans.PrimOffset; + package->LeftPrimStride = left.PrimStride; + package->RightPrimStride = right.PrimStride; + package->ResultPrimStride = ans.PrimStride; + package->LeftSecOffset = left.SecondaryOffset; + package->RightSecOffset = right.SecondaryOffset; + package->ResultSecOffset = ans.SecondaryOffset; + package->LeftSecStride = left.SecondaryStride; + package->RightSecStride = right.SecondaryStride; + package->ResultSecStride = ans.SecondaryStride; + package->PrimCount = left.PrimSize; + package->SecCount = left.SecondarySize; + package->ComputeHandle = (nint)Operation; + package->ElementSize = sizeof(T); + package->ComputeMode = 4; + ScalarPacket* sp = MatrixParallelFactory.CreateScalarPacket(); + + sp->Data(0) = s0; + sp->Data(1) = s1; + sp->Data(2) = s2; + package->Scalar = sp; + PublicTaskPrivate(package); + } + + public static unsafe void PublicTask( + MatrixSegmentEnumeration source, + MatrixSegmentEnumeration ans, + delegate**, MatrixKernel*, MatrixKernel*, void> Operation, + TScalar0 s0, + TScalar1 s1, + TScalar2 s2, + TScalar3 s3, + TScalar4 s4) + where T: unmanaged, INumber + where TScalar0: unmanaged, INumber + where TScalar1: unmanaged, INumber + where TScalar2: unmanaged, INumber + where TScalar3: unmanaged, INumber + where TScalar4: unmanaged, INumber + { + MatrixParallelTaskPackage* package = MatrixParallelFactory.CreateBaseTask(); + package->Right = source.Source; + package->Result = ans.Source; + package->RightPrimOffset = source.PrimOffset; + package->ResultPrimOffset = ans.PrimOffset; + package->RightPrimStride = source.PrimStride; + package->ResultPrimStride = ans.PrimStride; + package->RightSecOffset = source.SecondaryOffset; + package->ResultSecOffset = ans.SecondaryOffset; + package->RightSecStride = source.SecondaryStride; + package->ResultSecStride = ans.SecondaryStride; + package->PrimCount = source.PrimSize; + package->SecCount = source.SecondarySize; + package->ComputeHandle = (nint)Operation; + package->ElementSize = sizeof(T); + package->ComputeMode = 2; + ScalarPacket* sp = MatrixParallelFactory.CreateScalarPacket(); + + sp->Data(0) = s0; + sp->Data(1) = s1; + sp->Data(2) = s2; + sp->Data(3) = s3; + sp->Data(4) = s4; + package->Scalar = sp; + PublicTaskPrivate(package); + } + + public static unsafe void PublicTask( + MatrixSegmentEnumeration left, + MatrixSegmentEnumeration right, + MatrixSegmentEnumeration ans, + delegate**, MatrixKernel*, MatrixKernel*, void> Operation, + TScalar0 s0, + TScalar1 s1, + TScalar2 s2, + TScalar3 s3) + where T: unmanaged, INumber + where TScalar0: unmanaged, INumber + where TScalar1: unmanaged, INumber + where TScalar2: unmanaged, INumber + where TScalar3: unmanaged, INumber + { + MatrixParallelTaskPackage* package = MatrixParallelFactory.CreateBaseTask(); + package->Left = left.Source; + package->Right = right.Source; + package->Result = ans.Source; + package->LeftPrimOffset = left.PrimOffset; + package->RightPrimOffset = right.PrimOffset; + package->ResultPrimOffset = ans.PrimOffset; + package->LeftPrimStride = left.PrimStride; + package->RightPrimStride = right.PrimStride; + package->ResultPrimStride = ans.PrimStride; + package->LeftSecOffset = left.SecondaryOffset; + package->RightSecOffset = right.SecondaryOffset; + package->ResultSecOffset = ans.SecondaryOffset; + package->LeftSecStride = left.SecondaryStride; + package->RightSecStride = right.SecondaryStride; + package->ResultSecStride = ans.SecondaryStride; + package->PrimCount = left.PrimSize; + package->SecCount = left.SecondarySize; + package->ComputeHandle = (nint)Operation; + package->ElementSize = sizeof(T); + package->ComputeMode = 4; + ScalarPacket* sp = MatrixParallelFactory.CreateScalarPacket(); + + sp->Data(0) = s0; + sp->Data(1) = s1; + sp->Data(2) = s2; + sp->Data(3) = s3; + package->Scalar = sp; + PublicTaskPrivate(package); + } + + public static unsafe void PublicTask( + MatrixSegmentEnumeration source, + MatrixSegmentEnumeration ans, + delegate**, MatrixKernel*, MatrixKernel*, void> Operation, + TScalar0 s0, + TScalar1 s1, + TScalar2 s2, + TScalar3 s3, + TScalar4 s4, + TScalar5 s5) + where T: unmanaged, INumber + where TScalar0: unmanaged, INumber + where TScalar1: unmanaged, INumber + where TScalar2: unmanaged, INumber + where TScalar3: unmanaged, INumber + where TScalar4: unmanaged, INumber + where TScalar5: unmanaged, INumber + { + MatrixParallelTaskPackage* package = MatrixParallelFactory.CreateBaseTask(); + package->Right = source.Source; + package->Result = ans.Source; + package->RightPrimOffset = source.PrimOffset; + package->ResultPrimOffset = ans.PrimOffset; + package->RightPrimStride = source.PrimStride; + package->ResultPrimStride = ans.PrimStride; + package->RightSecOffset = source.SecondaryOffset; + package->ResultSecOffset = ans.SecondaryOffset; + package->RightSecStride = source.SecondaryStride; + package->ResultSecStride = ans.SecondaryStride; + package->PrimCount = source.PrimSize; + package->SecCount = source.SecondarySize; + package->ComputeHandle = (nint)Operation; + package->ElementSize = sizeof(T); + package->ComputeMode = 2; + ScalarPacket* sp = MatrixParallelFactory.CreateScalarPacket(); + + sp->Data(0) = s0; + sp->Data(1) = s1; + sp->Data(2) = s2; + sp->Data(3) = s3; + sp->Data(4) = s4; + sp->Data(5) = s5; + package->Scalar = sp; + PublicTaskPrivate(package); + } + + public static unsafe void PublicTask( + MatrixSegmentEnumeration left, + MatrixSegmentEnumeration right, + MatrixSegmentEnumeration ans, + delegate**, MatrixKernel*, MatrixKernel*, void> Operation, + TScalar0 s0, + TScalar1 s1, + TScalar2 s2, + TScalar3 s3, + TScalar4 s4) + where T: unmanaged, INumber + where TScalar0: unmanaged, INumber + where TScalar1: unmanaged, INumber + where TScalar2: unmanaged, INumber + where TScalar3: unmanaged, INumber + where TScalar4: unmanaged, INumber + { + MatrixParallelTaskPackage* package = MatrixParallelFactory.CreateBaseTask(); + package->Left = left.Source; + package->Right = right.Source; + package->Result = ans.Source; + package->LeftPrimOffset = left.PrimOffset; + package->RightPrimOffset = right.PrimOffset; + package->ResultPrimOffset = ans.PrimOffset; + package->LeftPrimStride = left.PrimStride; + package->RightPrimStride = right.PrimStride; + package->ResultPrimStride = ans.PrimStride; + package->LeftSecOffset = left.SecondaryOffset; + package->RightSecOffset = right.SecondaryOffset; + package->ResultSecOffset = ans.SecondaryOffset; + package->LeftSecStride = left.SecondaryStride; + package->RightSecStride = right.SecondaryStride; + package->ResultSecStride = ans.SecondaryStride; + package->PrimCount = left.PrimSize; + package->SecCount = left.SecondarySize; + package->ComputeHandle = (nint)Operation; + package->ElementSize = sizeof(T); + package->ComputeMode = 4; + ScalarPacket* sp = MatrixParallelFactory.CreateScalarPacket(); + + sp->Data(0) = s0; + sp->Data(1) = s1; + sp->Data(2) = s2; + sp->Data(3) = s3; + sp->Data(4) = s4; + package->Scalar = sp; + PublicTaskPrivate(package); + } + + public static unsafe void PublicTask( + MatrixSegmentEnumeration source, + MatrixSegmentEnumeration ans, + delegate**, MatrixKernel*, MatrixKernel*, void> Operation, + TScalar0 s0, + TScalar1 s1, + TScalar2 s2, + TScalar3 s3, + TScalar4 s4, + TScalar5 s5, + TScalar6 s6) + where T: unmanaged, INumber + where TScalar0: unmanaged, INumber + where TScalar1: unmanaged, INumber + where TScalar2: unmanaged, INumber + where TScalar3: unmanaged, INumber + where TScalar4: unmanaged, INumber + where TScalar5: unmanaged, INumber + where TScalar6: unmanaged, INumber + { + MatrixParallelTaskPackage* package = MatrixParallelFactory.CreateBaseTask(); + package->Right = source.Source; + package->Result = ans.Source; + package->RightPrimOffset = source.PrimOffset; + package->ResultPrimOffset = ans.PrimOffset; + package->RightPrimStride = source.PrimStride; + package->ResultPrimStride = ans.PrimStride; + package->RightSecOffset = source.SecondaryOffset; + package->ResultSecOffset = ans.SecondaryOffset; + package->RightSecStride = source.SecondaryStride; + package->ResultSecStride = ans.SecondaryStride; + package->PrimCount = source.PrimSize; + package->SecCount = source.SecondarySize; + package->ComputeHandle = (nint)Operation; + package->ElementSize = sizeof(T); + package->ComputeMode = 2; + ScalarPacket* sp = MatrixParallelFactory.CreateScalarPacket(); + + sp->Data(0) = s0; + sp->Data(1) = s1; + sp->Data(2) = s2; + sp->Data(3) = s3; + sp->Data(4) = s4; + sp->Data(5) = s5; + sp->Data(6) = s6; + package->Scalar = sp; + PublicTaskPrivate(package); + } + + public static unsafe void PublicTask( + MatrixSegmentEnumeration left, + MatrixSegmentEnumeration right, + MatrixSegmentEnumeration ans, + delegate**, MatrixKernel*, MatrixKernel*, void> Operation, + TScalar0 s0, + TScalar1 s1, + TScalar2 s2, + TScalar3 s3, + TScalar4 s4, + TScalar5 s5) + where T: unmanaged, INumber + where TScalar0: unmanaged, INumber + where TScalar1: unmanaged, INumber + where TScalar2: unmanaged, INumber + where TScalar3: unmanaged, INumber + where TScalar4: unmanaged, INumber + where TScalar5: unmanaged, INumber + { + MatrixParallelTaskPackage* package = MatrixParallelFactory.CreateBaseTask(); + package->Left = left.Source; + package->Right = right.Source; + package->Result = ans.Source; + package->LeftPrimOffset = left.PrimOffset; + package->RightPrimOffset = right.PrimOffset; + package->ResultPrimOffset = ans.PrimOffset; + package->LeftPrimStride = left.PrimStride; + package->RightPrimStride = right.PrimStride; + package->ResultPrimStride = ans.PrimStride; + package->LeftSecOffset = left.SecondaryOffset; + package->RightSecOffset = right.SecondaryOffset; + package->ResultSecOffset = ans.SecondaryOffset; + package->LeftSecStride = left.SecondaryStride; + package->RightSecStride = right.SecondaryStride; + package->ResultSecStride = ans.SecondaryStride; + package->PrimCount = left.PrimSize; + package->SecCount = left.SecondarySize; + package->ComputeHandle = (nint)Operation; + package->ElementSize = sizeof(T); + package->ComputeMode = 4; + ScalarPacket* sp = MatrixParallelFactory.CreateScalarPacket(); + + sp->Data(0) = s0; + sp->Data(1) = s1; + sp->Data(2) = s2; + sp->Data(3) = s3; + sp->Data(4) = s4; + sp->Data(5) = s5; + package->Scalar = sp; + PublicTaskPrivate(package); + } + + public static unsafe void PublicTask( + MatrixSegmentEnumeration source, + MatrixSegmentEnumeration ans, + delegate**, MatrixKernel*, MatrixKernel*, void> Operation, + TScalar0 s0, + TScalar1 s1, + TScalar2 s2, + TScalar3 s3, + TScalar4 s4, + TScalar5 s5, + TScalar6 s6, + TScalar7 s7) + where T: unmanaged, INumber + where TScalar0: unmanaged, INumber + where TScalar1: unmanaged, INumber + where TScalar2: unmanaged, INumber + where TScalar3: unmanaged, INumber + where TScalar4: unmanaged, INumber + where TScalar5: unmanaged, INumber + where TScalar6: unmanaged, INumber + where TScalar7: unmanaged, INumber + { + MatrixParallelTaskPackage* package = MatrixParallelFactory.CreateBaseTask(); + package->Right = source.Source; + package->Result = ans.Source; + package->RightPrimOffset = source.PrimOffset; + package->ResultPrimOffset = ans.PrimOffset; + package->RightPrimStride = source.PrimStride; + package->ResultPrimStride = ans.PrimStride; + package->RightSecOffset = source.SecondaryOffset; + package->ResultSecOffset = ans.SecondaryOffset; + package->RightSecStride = source.SecondaryStride; + package->ResultSecStride = ans.SecondaryStride; + package->PrimCount = source.PrimSize; + package->SecCount = source.SecondarySize; + package->ComputeHandle = (nint)Operation; + package->ElementSize = sizeof(T); + package->ComputeMode = 2; + ScalarPacket* sp = MatrixParallelFactory.CreateScalarPacket(); + + sp->Data(0) = s0; + sp->Data(1) = s1; + sp->Data(2) = s2; + sp->Data(3) = s3; + sp->Data(4) = s4; + sp->Data(5) = s5; + sp->Data(6) = s6; + sp->Data(7) = s7; + package->Scalar = sp; + PublicTaskPrivate(package); + } + + public static unsafe void PublicTask( + MatrixSegmentEnumeration left, + MatrixSegmentEnumeration right, + MatrixSegmentEnumeration ans, + delegate**, MatrixKernel*, MatrixKernel*, void> Operation, + TScalar0 s0, + TScalar1 s1, + TScalar2 s2, + TScalar3 s3, + TScalar4 s4, + TScalar5 s5, + TScalar6 s6) + where T: unmanaged, INumber + where TScalar0: unmanaged, INumber + where TScalar1: unmanaged, INumber + where TScalar2: unmanaged, INumber + where TScalar3: unmanaged, INumber + where TScalar4: unmanaged, INumber + where TScalar5: unmanaged, INumber + where TScalar6: unmanaged, INumber + { + MatrixParallelTaskPackage* package = MatrixParallelFactory.CreateBaseTask(); + package->Left = left.Source; + package->Right = right.Source; + package->Result = ans.Source; + package->LeftPrimOffset = left.PrimOffset; + package->RightPrimOffset = right.PrimOffset; + package->ResultPrimOffset = ans.PrimOffset; + package->LeftPrimStride = left.PrimStride; + package->RightPrimStride = right.PrimStride; + package->ResultPrimStride = ans.PrimStride; + package->LeftSecOffset = left.SecondaryOffset; + package->RightSecOffset = right.SecondaryOffset; + package->ResultSecOffset = ans.SecondaryOffset; + package->LeftSecStride = left.SecondaryStride; + package->RightSecStride = right.SecondaryStride; + package->ResultSecStride = ans.SecondaryStride; + package->PrimCount = left.PrimSize; + package->SecCount = left.SecondarySize; + package->ComputeHandle = (nint)Operation; + package->ElementSize = sizeof(T); + package->ComputeMode = 4; + ScalarPacket* sp = MatrixParallelFactory.CreateScalarPacket(); + + sp->Data(0) = s0; + sp->Data(1) = s1; + sp->Data(2) = s2; + sp->Data(3) = s3; + sp->Data(4) = s4; + sp->Data(5) = s5; + sp->Data(6) = s6; + package->Scalar = sp; + PublicTaskPrivate(package); + } + + public static unsafe void PublicTask( + MatrixSegmentEnumeration left, + MatrixSegmentEnumeration right, + MatrixSegmentEnumeration ans, + delegate**, MatrixKernel*, MatrixKernel*, void> Operation, + TScalar0 s0, + TScalar1 s1, + TScalar2 s2, + TScalar3 s3, + TScalar4 s4, + TScalar5 s5, + TScalar6 s6, + TScalar7 s7) + where T: unmanaged, INumber + where TScalar0: unmanaged, INumber + where TScalar1: unmanaged, INumber + where TScalar2: unmanaged, INumber + where TScalar3: unmanaged, INumber + where TScalar4: unmanaged, INumber + where TScalar5: unmanaged, INumber + where TScalar6: unmanaged, INumber + where TScalar7: unmanaged, INumber + { + MatrixParallelTaskPackage* package = MatrixParallelFactory.CreateBaseTask(); + package->Left = left.Source; + package->Right = right.Source; + package->Result = ans.Source; + package->LeftPrimOffset = left.PrimOffset; + package->RightPrimOffset = right.PrimOffset; + package->ResultPrimOffset = ans.PrimOffset; + package->LeftPrimStride = left.PrimStride; + package->RightPrimStride = right.PrimStride; + package->ResultPrimStride = ans.PrimStride; + package->LeftSecOffset = left.SecondaryOffset; + package->RightSecOffset = right.SecondaryOffset; + package->ResultSecOffset = ans.SecondaryOffset; + package->LeftSecStride = left.SecondaryStride; + package->RightSecStride = right.SecondaryStride; + package->ResultSecStride = ans.SecondaryStride; + package->PrimCount = left.PrimSize; + package->SecCount = left.SecondarySize; + package->ComputeHandle = (nint)Operation; + package->ElementSize = sizeof(T); + package->ComputeMode = 4; + ScalarPacket* sp = MatrixParallelFactory.CreateScalarPacket(); + + sp->Data(0) = s0; + sp->Data(1) = s1; + sp->Data(2) = s2; + sp->Data(3) = s3; + sp->Data(4) = s4; + sp->Data(5) = s5; + sp->Data(6) = s6; + sp->Data(7) = s7; + package->Scalar = sp; + PublicTaskPrivate(package); + } + + private static unsafe void PublicTaskPrivate(MatrixParallelTaskPackage* package) + where T: unmanaged, INumber + { + int primCount = package->PrimCount; + int secCount = package->SecCount; + int threadPerGroup = (1024 / primCount) + 1; + secCount /= threadPerGroup; } }