diff --git a/StgSharp.Common/HighPerformance/MatrixKernel.cs b/StgSharp.Common/HighPerformance/MatrixKernel.cs index d47d2b68..252c0970 100644 --- a/StgSharp.Common/HighPerformance/MatrixKernel.cs +++ b/StgSharp.Common/HighPerformance/MatrixKernel.cs @@ -41,20 +41,26 @@ using System.Threading.Tasks; namespace StgSharp.HighPerformance { - [StructLayout(LayoutKind.Explicit, Size = 64)] + [StructLayout(LayoutKind.Sequential)] public unsafe struct MatrixKernel where T: unmanaged, INumber { - [FieldOffset(0)] internal fixed byte Buffer[64]; - [FieldOffset(0)] internal fixed double FP64Buffer[8]; - [FieldOffset(0)] internal fixed float FP32Buffer[16]; - [FieldOffset(0)] public M128 XMM0; - [FieldOffset(16)] public M128 XMM1; - [FieldOffset(32)] public M128 XMM2; - [FieldOffset(48)] public M128 XMM3; - [FieldOffset(0)] public M256 YMM0; - [FieldOffset(32)] public M256 YMM1; - [FieldOffset(64)] public M512 ZMM0; + private T c0r0; + private T c0r1; + private T c0r2; + private T c0r3; + private T c1r0; + private T c1r1; + private T c1r2; + private T c1r3; + private T c2r0; + private T c2r1; + private T c2r2; + private T c2r3; + private T c3r0; + private T c3r1; + private T c3r2; + private T c3r3; public MatrixKernel() { @@ -68,24 +74,10 @@ namespace StgSharp.HighPerformance } } - public static MatrixKernel Unit + public ref T this[int column, int row] { - get - { - MatrixKernel kernel = new(true); - kernel.FP32Buffer[0] = 1f; - kernel.FP32Buffer[3] = 1f; - kernel.FP32Buffer[8] = 1f; - kernel.FP32Buffer[15] = 1f; - return kernel; - } - } - - public ref T UnsafeIndex(int column, int row) - { - ref M128 col = ref Unsafe.As(ref Buffer[0]); - col = ref Unsafe.Add(ref col, column); - return ref col.Member(row); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => ref Unsafe.Add(ref c0r0, (column * 4) + row); } } diff --git a/StgSharp.Common/Mathematics/Linear/MatrixParallel.TaskPublic.cs b/StgSharp.Common/Mathematics/Linear/MatrixParallel.Publish.cs similarity index 91% rename from StgSharp.Common/Mathematics/Linear/MatrixParallel.TaskPublic.cs rename to StgSharp.Common/Mathematics/Linear/MatrixParallel.Publish.cs index b0b241d3..49d50125 100644 --- a/StgSharp.Common/Mathematics/Linear/MatrixParallel.TaskPublic.cs +++ b/StgSharp.Common/Mathematics/Linear/MatrixParallel.Publish.cs @@ -49,8 +49,11 @@ namespace StgSharp.Mathematics delegate**, MatrixKernel*, MatrixKernel*, void> Operation) where T: unmanaged, INumber { - int columnCount = left.PrimSize; - int rowCount = right.PrimSize; + int length = _threads.Length, + columnCount = left.PrimSize, + rowCount = right.PrimSize, + cAverage = left.PrimSize / length, cRemain = left.PrimSize % length, + rAverage = right.PrimSize / length, rRemain = right.PrimSize % length; MatrixParallelTaskPackage package = new() { diff --git a/StgSharp.Native/StgSharp.Native.vcxproj.filters b/StgSharp.Native/StgSharp.Native.vcxproj.filters index 563ce522..e71f202f 100644 --- a/StgSharp.Native/StgSharp.Native.vcxproj.filters +++ b/StgSharp.Native/StgSharp.Native.vcxproj.filters @@ -13,9 +13,6 @@ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - {bfdaad49-d6af-4b2e-aba9-2dcaa7f7d693} - diff --git a/StgSharp.Native/sn-head/sn_intrinsic.h b/StgSharp.Native/sn-head/sn_intrinsic.h index 9ff16f3b..5071eac5 100644 --- a/StgSharp.Native/sn-head/sn_intrinsic.h +++ b/StgSharp.Native/sn-head/sn_intrinsic.h @@ -85,7 +85,6 @@ INTERNAL void SN_DECL f32_scalar_mul_avx(MAT_KERNEL(float) const *matrix, float MAT_KERNEL(float) *restrict ans); INTERNAL void SN_DECL f32_scalar_mul_512(MAT_KERNEL(float) const *matrix, float const scalar, MAT_KERNEL(float) *restrict ans); - #pragma endregion #pragma region fma @@ -104,9 +103,12 @@ INTERNAL uint64_t SN_DECL factorial_simd_sse(int n); INTERNAL void FORCEINLINE SN_DECL dot_41_sse(MAT_KERNEL(float) const *transpose, __m128 const *vector, __m128 *ans); -INTERNAL void SN_DECL dot_41_avx(MAT_KERNEL(float) const *transpose, __m128 const *vector, __m128 *ans); -INTERNAL void SN_DECL dot_42_sse(MAT_KERNEL(float) const *transpose, __m128 const *vector, __m128 *ans); -INTERNAL void SN_DECL dot_42_avx(MAT_KERNEL(float) const *transpose, __m128 const *vector, __m128 *ans); +INTERNAL void SN_DECL dot_41_avx(MAT_KERNEL(float) const *transpose, __m128 const *vector, + __m128 *ans); +INTERNAL void SN_DECL dot_42_sse(MAT_KERNEL(float) const *transpose, __m128 const *vector, + __m128 *ans); +INTERNAL void SN_DECL dot_42_avx(MAT_KERNEL(float) const *transpose, __m128 const *vector, + __m128 *ans); #pragma endregion diff --git a/StgSharp.Native/sn-head/sn_matkernel.h b/StgSharp.Native/sn-head/sn_matkernel.h index 8f7930b2..0bdafa7d 100644 --- a/StgSharp.Native/sn-head/sn_matkernel.h +++ b/StgSharp.Native/sn-head/sn_matkernel.h @@ -4,16 +4,16 @@ #include #define ELEMENTSIZE(T) sizeof(T) -#define XMMCOUNT(T) sizeof(T) / 16 -#define YMMCOUNT(T) sizeof(T) / 32 -#define ZMMCOUNT(T) sizeof(T) / 64 +#define XMMCOUNT(T) sizeof(T) +#define YMMCOUNT(T) sizeof(T) / 2 +#define ZMMCOUNT(T) sizeof(T) / 4 #define MAT_KERNEL(T) \ union { \ __m128 xmm[XMMCOUNT(T)]; \ __m256 ymm[YMMCOUNT(T)]; \ __m512 zmm[ZMMCOUNT(T)]; \ - T m[16]; \ + T m[4][4]; \ } #endif