From daf9076e54bfbe16fb2170a85e1e1a835e3b8149 Mon Sep 17 00:00:00 2001 From: Youmu Liu <105042599+Nitload-NSI@users.noreply.github.com> Date: Tue, 28 Oct 2025 20:44:38 +0800 Subject: [PATCH] daily --- StgSharp.Common/HighPerformance/M64.cs | 6 -- StgSharp.Common/Mathematics/Linear/Matrix.cs | 4 +- .../Numeric/MatrixCompute.Basic.cs | 57 +++++++++++++++---- 3 files changed, 49 insertions(+), 18 deletions(-) diff --git a/StgSharp.Common/HighPerformance/M64.cs b/StgSharp.Common/HighPerformance/M64.cs index 5b6a1798..19412588 100644 --- a/StgSharp.Common/HighPerformance/M64.cs +++ b/StgSharp.Common/HighPerformance/M64.cs @@ -25,15 +25,9 @@ // // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using System.Text; -using System.Threading.Tasks; namespace StgSharp.HighPerformance { diff --git a/StgSharp.Common/Mathematics/Linear/Matrix.cs b/StgSharp.Common/Mathematics/Linear/Matrix.cs index 53feeb04..62868022 100644 --- a/StgSharp.Common/Mathematics/Linear/Matrix.cs +++ b/StgSharp.Common/Mathematics/Linear/Matrix.cs @@ -167,7 +167,7 @@ namespace StgSharp.Mathematics.Numeric { private readonly MatrixKernel* _source = enumeration._source; - private int _indexCount = 0; + private int _indexCount = -1; private readonly int _stride = enumeration.PrimStride; private readonly long _bound = (long)enumeration.PrimSize * enumeration.PrimStride; private long _index = (long)enumeration.PrimOffset * enumeration.PrimStride; @@ -230,7 +230,7 @@ namespace StgSharp.Mathematics.Numeric private readonly int _end = segment._size; - private int _indexCount = 0; + private int _indexCount = -1; private readonly long _bound = (long)segment._size * segment._stride; private long _index = (long)segment._offset * segment._stride; private readonly MatrixSegment _segment = segment; diff --git a/StgSharp.Mathematics/Numeric/MatrixCompute.Basic.cs b/StgSharp.Mathematics/Numeric/MatrixCompute.Basic.cs index 29fd591e..f28bbada 100644 --- a/StgSharp.Mathematics/Numeric/MatrixCompute.Basic.cs +++ b/StgSharp.Mathematics/Numeric/MatrixCompute.Basic.cs @@ -45,24 +45,61 @@ namespace StgSharp.Mathematics.Numeric throw new IndexOutOfRangeException("Matrix dimensions must agree."); } Matrix ans = Matrix.FromDefault(left.ColumnLength, left.RowLength); - if (left.KernelColumnLength * left.KernelRowLength <= 1024) + long count = (long)left.KernelColumnLength * left.KernelRowLength; + if (count <= 1024) { MatrixParallelPool pool = MatrixParallel.LeadParallel(); - if (!pool.TryRentIndividualHandle(out MatrixParallelWrap.Handle? handle)) { } - MatrixSegmentEnumeration.Enumerator leftEnum = left.GetColumnEnumeration().GetEnumerator(); - MatrixSegmentEnumeration.Enumerator rightEnum = right.GetColumnEnumeration().GetEnumerator(); - MatrixSegmentEnumeration.Enumerator ansEnum = ans.GetColumnEnumeration().GetEnumerator(); - - for (int i = 0; i < left.KernelColumnLength; i++) + if (!pool.TryRentIndividualHandle(out MatrixParallelWrap.Handle? handle)) { - MatrixSegment.Enumerator leftColumEnum = leftEnum.Current.GetEnumerator(); - MatrixSegment.Enumerator rightColumEnum = rightEnum.Current.GetEnumerator(); - MatrixSegment.Enumerator ansColumEnum = ansEnum.Current.GetEnumerator(); + /* + * wait + */ + } + MatrixKernel* leftPtr = left.Buffer; + MatrixKernel* rightPtr = right.Buffer; + MatrixKernel* ansPtr = ans.Buffer; + for (int i = 0; i < count; i++) { + NativeIntrinsic.Intrinsic.f32_add(leftPtr + i, rightPtr + i, ansPtr + i); } return ans; } Stack taskGroup = MatrixParallel.PublicTask(left.GetColumnEnumeration(), right.GetColumnEnumeration(), ans.GetColumnEnumeration(), (delegate**, MatrixKernel*, MatrixKernel*, void>)NativeIntrinsic.Intrinsic.f32_add); + /* + * run parallel + */ + return ans; + } + + public static unsafe Matrix Sub(Matrix left, Matrix right) + { + if (left.ColumnLength != right.ColumnLength || left.RowLength != right.RowLength) { + throw new IndexOutOfRangeException("Matrix dimensions must agree."); + } + Matrix ans = Matrix.FromDefault(left.ColumnLength, left.RowLength); + long count = (long)left.KernelColumnLength * left.KernelRowLength; + if (count <= 1024) + { + MatrixParallelPool pool = MatrixParallel.LeadParallel(); + if (!pool.TryRentIndividualHandle(out MatrixParallelWrap.Handle? handle)) + { + /* + * wait + */ + } + MatrixKernel* leftPtr = left.Buffer; + MatrixKernel* rightPtr = right.Buffer; + MatrixKernel* ansPtr = ans.Buffer; + for (int i = 0; i < count; i++) { + NativeIntrinsic.Intrinsic.f32_sub(leftPtr + i, rightPtr + i, ansPtr + i); + } + return ans; + } + Stack taskGroup = MatrixParallel.PublicTask(left.GetColumnEnumeration(), right.GetColumnEnumeration(), ans.GetColumnEnumeration(), + (delegate**, MatrixKernel*, MatrixKernel*, void>)NativeIntrinsic.Intrinsic.f32_sub); + /* + * run parallel + */ return ans; }