diff --git a/StgSharp.Mathematics/Internal/SIMDID.cs b/StgSharp.Mathematics/Internal/SIMDID.cs index 4421c961..94373441 100644 --- a/StgSharp.Mathematics/Internal/SIMDID.cs +++ b/StgSharp.Mathematics/Internal/SIMDID.cs @@ -39,8 +39,8 @@ namespace StgSharp.Mathematics.Internal internal unsafe struct SIMDID { - [FieldOffset(0)]public fixed byte MaskByte[16]; - [FieldOffset(0)]public ulong Mask; + [FieldOffset(0)] public fixed byte MaskByte[16]; + [FieldOffset(0)] public ulong Mask; internal SIMDID( ulong data @@ -54,5 +54,21 @@ namespace StgSharp.Mathematics.Internal Unsafe.SkipInit(out this); } + public static bool operator !=( + SIMDID left, + SIMDID right + ) + { + return left.Mask != right.Mask; + } + + public static bool operator ==( + SIMDID left, + SIMDID right + ) + { + return left.Mask == right.Mask; + } + } } diff --git a/StgSharp.Mathematics/Numeric/Runtime/MatrixParallel.cs b/StgSharp.Mathematics/Numeric/Runtime/MatrixParallel.cs index e58f4566..761cee2e 100644 --- a/StgSharp.Mathematics/Numeric/Runtime/MatrixParallel.cs +++ b/StgSharp.Mathematics/Numeric/Runtime/MatrixParallel.cs @@ -26,23 +26,13 @@ // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- using StgSharp.Collections; -using StgSharp.Internal; -using StgSharp.Mathematics.Internal; -using StgSharp.Mathematics.Internal; -using StgSharp.Mathematics.Memory; -using System; -using System.Collections.Concurrent; using System.Collections.Generic; -using System.Linq; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using System.Text; -using System.Threading; -using System.Threading.Tasks; namespace StgSharp.Mathematics.Numeric { - public static partial class MatrixParallel + public static unsafe partial class MatrixParallel { private static bool _meaningful; @@ -51,7 +41,10 @@ namespace StgSharp.Mathematics.Numeric public static bool IsParallelSupported { get; } = Environment.ProcessorCount > 6; - public static bool IsParallelMeaningful => (Environment.ProcessorCount > 6) && IsInitialized; + public static bool IsParallelMeaningful { get; } = (Environment.ProcessorCount > 6) && + IsInitialized; + + public static int ContextCount { get; private set; } private static bool IsInitialized { get; set; } @@ -75,7 +68,6 @@ namespace StgSharp.Mathematics.Numeric MatrixParallelThread thread = new(i); _threads.Push(thread); SpinWait.SpinUntil(() => thread.State == MatrixThreadState.Ready); - var index = (IsParallelSupported && contextMap.TryGetValue(simd, out int index)) ? index : (-1); } // TODO 构建全局的保底上下文 @@ -96,18 +88,11 @@ namespace StgSharp.Mathematics.Numeric } [LibraryImport(Native.LibName, EntryPoint = "sn_compare_simd")] - [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] + [UnmanagedCallConv(CallConvs = [ typeof(CallConvCdecl) ])] private static unsafe partial ulong CompareSIMDID( IntrinsicContext* context, ulong id ); - [LibraryImport(Native.LibName, EntryPoint = "load_intrinsic_function")] - [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] - private static unsafe partial void LoadIntrinsicFunction( - IntrinsicContext* context, - ulong id - ); - } } diff --git a/StgSharp.Mathematics/Numeric/Runtime/MatrixParallelThread.cs b/StgSharp.Mathematics/Numeric/Runtime/MatrixParallelThread.cs index 1839d1a7..c4c0aa52 100644 --- a/StgSharp.Mathematics/Numeric/Runtime/MatrixParallelThread.cs +++ b/StgSharp.Mathematics/Numeric/Runtime/MatrixParallelThread.cs @@ -48,7 +48,7 @@ namespace StgSharp.Mathematics.Numeric public unsafe partial class MatrixParallelThread : IDisposable { - private IntPtr* _context; + private IntrinsicContext* _context; private volatile bool _disposed, _isRetireRequested = false; private readonly ManualResetEventSlim _resetEvent; private readonly Thread _managedThread; @@ -69,15 +69,15 @@ namespace StgSharp.Mathematics.Numeric internal ManualResetEventSlim? LeaderEvent { get; set; } - internal bool IsSingle { get; set; } + internal ref readonly IntrinsicContext Intrinsic => ref (*_context); - internal IntrinsicContext Intrinsic { get; private set; } + internal bool IsSingle { get; set; } internal MatrixParallelWrap BindedWrap { get; set; } - internal MatrixThreadState State { get; set; } + internal MatrixThreadState State { get; private set; } - internal SIMDID Simd { get; set; } + internal SIMDID Simd { get; private set; } public void Dispose() { @@ -116,9 +116,9 @@ namespace StgSharp.Mathematics.Numeric SetThreadAffinity(PoolId); _ = Thread.Yield(); SIMDID feature = new(GetSimdId()); - int index = MatrixParallel.GetContext(feature); - Intrinsic = new IntrinsicContext(); - if (index > 0) { } + IntrinsicContext* contextPtr = stackalloc IntrinsicContext[1]; + LoadIntrinsicFunction(contextPtr, feature.Mask); + _context = contextPtr; State = MatrixThreadState.Ready; while (true) { @@ -162,17 +162,24 @@ namespace StgSharp.Mathematics.Numeric #pragma warning disable CA5393 [LibraryImport(Native.LibName, EntryPoint = "sn_get_simd_level_local")] - [UnmanagedCallConv(CallConvs = [ typeof(CallConvCdecl) ])] + [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] [DefaultDllImportSearchPaths(DllImportSearchPath.AssemblyDirectory)] internal static partial ulong GetSimdId(); [LibraryImport(Native.LibName, EntryPoint = "sn_set_thread_affinity")] - [UnmanagedCallConv(CallConvs = [ typeof(CallConvCdecl) ])] + [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] [DefaultDllImportSearchPaths(DllImportSearchPath.AssemblyDirectory)] internal static partial void SetThreadAffinity( int coreId ); + [LibraryImport(Native.LibName, EntryPoint = "load_intrinsic_function")] + [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] + [DefaultDllImportSearchPaths(DllImportSearchPath.AssemblyDirectory)] + private static unsafe partial void LoadIntrinsicFunction( + IntrinsicContext* context, + ulong id + ); #pragma warning restore CA5393 } }