diff --git a/StgSharp.Common/HighPerformance/MatrixKernel.cs b/StgSharp.Common/HighPerformance/MatrixKernel.cs index 1b5adb73..b80803b5 100644 --- a/StgSharp.Common/HighPerformance/MatrixKernel.cs +++ b/StgSharp.Common/HighPerformance/MatrixKernel.cs @@ -53,17 +53,22 @@ namespace StgSharp.HighPerformance Unsafe.SkipInit(out this); } - public MatrixKernel(bool clear) + public MatrixKernel( + bool clear + ) { if (!clear) { Unsafe.SkipInit(out this); } } - public ref T this[int row, int column] + public ref T this[ + int x, + int y + ] { [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => ref Unsafe.Add(ref c0r0, (row * 4) + column); + get => ref Unsafe.Add(ref c0r0, (x * 4) + y); } } diff --git a/StgSharp.Common/Mathematics/Linear/Matrix.cs b/StgSharp.Common/Mathematics/Linear/Matrix.cs index 5fbc9dbb..7219a271 100644 --- a/StgSharp.Common/Mathematics/Linear/Matrix.cs +++ b/StgSharp.Common/Mathematics/Linear/Matrix.cs @@ -70,11 +70,11 @@ namespace StgSharp.Mathematics.Numeric int k_c = y / 4, - k_r = x / 4, c = y % 4, + k_r = x / 4, r = x % 4; - ref MatrixKernel kernel = ref GetMatrixKernel(k_c, k_r); - return Unsafe.IsNullRef(ref kernel) ? T.Zero : kernel[c, r]; + ref MatrixKernel kernel = ref GetMatrixKernel(k_r, k_c); + return Unsafe.IsNullRef(ref kernel) ? T.Zero : kernel[r, c]; } set { @@ -84,12 +84,12 @@ namespace StgSharp.Mathematics.Numeric int k_c = y / 4, - k_r = x / 4, c = y % 4, + k_r = x / 4, r = x % 4; - ref MatrixKernel kernel = ref GetMatrixKernel(k_c, k_r); + ref MatrixKernel kernel = ref GetMatrixKernel(k_r, k_c); if (!Unsafe.IsNullRef(ref kernel)) { - kernel[c, r] = value; + kernel[r, c] = value; } } } @@ -146,10 +146,8 @@ namespace StgSharp.Mathematics.Numeric int y ) { - MatrixKernelEnumerator enumerator = new(_size.KernelColumnLength, _size.KernelRowLength, - x, y); - return ref _boarder.IsInBuffer(x, y, in enumerator) ? - ref _buffer[_boarder.GetIndexOffset(x, y, in enumerator)] : + return ref _boarder.IsInBuffer(x, y, in _size) ? + ref _buffer[_boarder.GetIndexOffset(x, y, in _size)] : ref Unsafe.NullRef>(); } @@ -165,9 +163,7 @@ namespace StgSharp.Mathematics.Numeric int c = y & 3; int r = x & 3; - MatrixKernelEnumerator enumerator = new(_size.KernelColumnLength, _size.KernelRowLength, - k_c, k_r); - ref MatrixKernel kernel = ref _buffer[_boarder.GetIndexOffset(k_c, k_r, in enumerator)]; + ref MatrixKernel kernel = ref _buffer[_boarder.GetIndexOffset(k_c, k_r, in _size)]; return ref kernel[c, r]; } @@ -177,10 +173,7 @@ namespace StgSharp.Mathematics.Numeric int y ) { - // Caller guarantees: indices in range, layout is dense square. - MatrixKernelEnumerator enumerator = new(_size.KernelColumnLength, _size.KernelRowLength, - x, y); - return Buffer + _boarder.GetIndexOffset(x, y, in enumerator); + return Buffer + _boarder.GetIndexOffset(x, y, in _size); } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -194,10 +187,7 @@ namespace StgSharp.Mathematics.Numeric int k_r = x >> 2; int c = y & 3; int r = x & 3; - - MatrixKernelEnumerator enumerator = new(_size.KernelColumnLength, _size.KernelRowLength, - k_c, k_r); - return ref _buffer[_boarder.GetIndexOffset(k_c, k_r, in enumerator)]; + return ref _buffer[_boarder.GetIndexOffset(k_c, k_r, in _size)]; } } diff --git a/StgSharp.Common/Mathematics/Linear/MatrixMetadata.cs b/StgSharp.Common/Mathematics/Linear/MatrixMetadata.cs index 253710cd..a529ea33 100644 --- a/StgSharp.Common/Mathematics/Linear/MatrixMetadata.cs +++ b/StgSharp.Common/Mathematics/Linear/MatrixMetadata.cs @@ -48,7 +48,9 @@ namespace StgSharp.Mathematics.Numeric private static readonly MatrixKernelBoarder UpperTriangleInstance = new UpperTriangleKernelBoarder(); [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static MatrixKernelBoarder Create(MatrixLayout layout) + public static MatrixKernelBoarder Create( + MatrixLayout layout + ) { return layout switch { @@ -63,25 +65,30 @@ namespace StgSharp.Mathematics.Numeric public abstract long GetIndexOffset( int xKernel, int yKernel, - in MatrixKernelEnumerator enumerator); + in MatrixSize size + ); [MethodImpl(MethodImplOptions.AggressiveInlining)] public abstract bool IsInBuffer( int xKernel, int yKernel, - in MatrixKernelEnumerator enumerator); + in MatrixSize enumerator + ); [MethodImpl(MethodImplOptions.AggressiveInlining)] - protected static long GetTriangularOrder(in MatrixKernelEnumerator enumerator) + protected static long GetTriangularOrder( + in MatrixSize enumerator + ) { return Math.Min(enumerator.KernelColumnLength, enumerator.KernelRowLength); } [MethodImpl(MethodImplOptions.AggressiveInlining)] protected static bool IsWithinKernelDomain( - in MatrixKernelEnumerator enumerator, + in MatrixSize enumerator, int xKernel, - int yKernel) + int yKernel + ) { return xKernel >= 0 && yKernel >= 0 && @@ -91,9 +98,10 @@ namespace StgSharp.Mathematics.Numeric [MethodImpl(MethodImplOptions.AggressiveInlining)] protected static bool IsWithinTriangularDomain( - in MatrixKernelEnumerator enumerator, + in MatrixSize enumerator, int xKernel, - int yKernel) + int yKernel + ) { long order = GetTriangularOrder(enumerator); return xKernel >= 0 && yKernel >= 0 && xKernel < order && yKernel < order; @@ -106,19 +114,23 @@ namespace StgSharp.Mathematics.Numeric public override long GetIndexOffset( int xKernel, int yKernel, - in MatrixKernelEnumerator enumerator) + in MatrixSize enumerator + ) { long x = xKernel; long y = yKernel; - long rows = enumerator.KernelRowLength; - return x * rows + y; + long col = enumerator.KernelColumnLength; + + Console.Write($"Attempt to get offset at ({x},{y}), offset is {x * col + y} "); + return x * col + y; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public override bool IsInBuffer( int xKernel, int yKernel, - in MatrixKernelEnumerator enumerator) + in MatrixSize enumerator + ) { return IsWithinKernelDomain(enumerator, xKernel, yKernel); } @@ -132,7 +144,8 @@ namespace StgSharp.Mathematics.Numeric public override long GetIndexOffset( int xKernel, int yKernel, - in MatrixKernelEnumerator enumerator) + in MatrixSize enumerator + ) { long order = GetTriangularOrder(enumerator); long x = xKernel; @@ -146,7 +159,8 @@ namespace StgSharp.Mathematics.Numeric public override bool IsInBuffer( int xKernel, int yKernel, - in MatrixKernelEnumerator enumerator) + in MatrixSize enumerator + ) { return IsWithinTriangularDomain(enumerator, xKernel, yKernel) && yKernel >= xKernel; } @@ -160,7 +174,8 @@ namespace StgSharp.Mathematics.Numeric public override long GetIndexOffset( int xKernel, int yKernel, - in MatrixKernelEnumerator enumerator) + in MatrixSize enumerator + ) { long x = xKernel; long y = yKernel; @@ -173,7 +188,8 @@ namespace StgSharp.Mathematics.Numeric public override bool IsInBuffer( int xKernel, int yKernel, - in MatrixKernelEnumerator enumerator) + in MatrixSize enumerator + ) { return IsWithinTriangularDomain(enumerator, xKernel, yKernel) && yKernel <= xKernel; } @@ -197,7 +213,8 @@ namespace StgSharp.Mathematics.Numeric int elementColumnLength, int elementRowLength, int kernelColumnLength, - int kernelRowLength) + int kernelRowLength + ) { ElementColumnLength = elementColumnLength; ElementRowLength = elementRowLength; @@ -222,7 +239,8 @@ namespace StgSharp.Mathematics.Numeric int kernelColumnLength, int kernelRowLength, int currentColumn = 0, - int currentRow = 0) + int currentRow = 0 + ) { CurrentColumn = currentColumn; CurrentRow = currentRow; diff --git a/StgSharp.Mathematics/Numeric/MatrixCompute.Float.cs b/StgSharp.Mathematics/Numeric/MatrixCompute.Float.cs index d8a09c14..6edc6b7e 100644 --- a/StgSharp.Mathematics/Numeric/MatrixCompute.Float.cs +++ b/StgSharp.Mathematics/Numeric/MatrixCompute.Float.cs @@ -1,9 +1,9 @@ -//----------------------------------------------------------------------- +//----------------------------------------------------------------------- // ----------------------------------------------------------------------- // file="MatrixCompute.Float" // Project: StgSharp -// AuthorGroup: Nitload Space -// Copyright (c) Nitload Space. All rights reserved. +// AuthorGroup: Nitload +// Copyright (c) Nitload. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -42,7 +42,11 @@ namespace StgSharp.Mathematics.Numeric public static partial class MatrixCompute { - public static unsafe void Add(Matrix left, Matrix right, Matrix ans) + public static unsafe void Add( + Matrix left, + Matrix right, + Matrix ans + ) { int f32 = (int)MatrixElementType.F32; if (left.ColumnLength != right.ColumnLength || @@ -88,7 +92,10 @@ namespace StgSharp.Mathematics.Numeric return; } - public static unsafe void Fill(Matrix ans, float value) + public static unsafe void Fill( + Matrix ans, + float value + ) { int f32 = (int)MatrixElementType.F32; long count = (long)ans.KernelColumnLength * ans.KernelRowLength; @@ -119,7 +126,11 @@ namespace StgSharp.Mathematics.Numeric taskGroup.Dispose(); } - public static unsafe void Mul(Matrix left, Matrix right, Matrix ans) + public static unsafe void Mul( + Matrix left, + Matrix right, + Matrix ans + ) { int f32 = (int)MatrixElementType.F32; @@ -145,31 +156,20 @@ namespace StgSharp.Mathematics.Numeric pool = MatrixParallel.LeadParallel(1); } M128* enumeration = stackalloc M128[4]; + enumeration->Member(2) = left.KernelColumnLength; + enumeration->Member(3) = ans.KernelColumnLength; for (int i = 0; i < ans.KernelRowLength; i++) { for (int j = 0; j < ans.KernelColumnLength; j++) { enumeration->Member(0) = i; enumeration->Member(1) = j; - enumeration->Member(2) = ans.KernelRowLength; - enumeration->Member(3) = left.KernelColumnLength; NativeIntrinsic.Context .mat[f32].kernel_tile_fma((MatrixKernel*)left.Buffer, (MatrixKernel*)right.Buffer, - (MatrixKernel*)ans.Buffer, enumeration); - /* - for (int k = 0; k < left.KernelColumnLength; k++) { - NativeIntrinsic.Context - .mat[f32].kernel_fma(GetKernelAddressUnsafe(left.Buffer, - left.KernelColumnLength, i, - k), - GetKernelAddressUnsafe(right.Buffer, - right.KernelColumnLength, k, j), - GetKernelAddressUnsafe(ans.Buffer, - ans.KernelColumnLength, i, j)); - } - /**/ + (MatrixKernel*)ans.Buffer, + enumeration); } } @@ -196,13 +196,18 @@ namespace StgSharp.Mathematics.Numeric return; } - public static unsafe void Mul(Matrix left, float right, Matrix ans) + public static unsafe void Mul( + Matrix left, + float right, + Matrix ans + ) { int f32 = (int)MatrixElementType.F32; if (left.ColumnLength != ans.ColumnLength || left.RowLength != ans.RowLength) { throw new IndexOutOfRangeException("Matrix dimensions must agree."); } - if (left.Layout != MatrixLayout.DenseRectangle || ans.Layout != MatrixLayout.DenseRectangle) { + if (left.Layout != MatrixLayout.DenseRectangle || + ans.Layout != MatrixLayout.DenseRectangle) { throw new NotSupportedException("Only dense rectangle matrices are supported."); } long count = (long)left.KernelColumnLength * left.KernelRowLength; @@ -243,7 +248,11 @@ namespace StgSharp.Mathematics.Numeric return; } - public static unsafe void Sub(Matrix left, Matrix right, Matrix ans) + public static unsafe void Sub( + Matrix left, + Matrix right, + Matrix ans + ) { int f32 = (int)MatrixElementType.F32; if (left.ColumnLength != right.ColumnLength || diff --git a/StgSharp.Mathematics/Numeric/MatrixCompute.cs b/StgSharp.Mathematics/Numeric/MatrixCompute.cs index aa1e78a5..d2ba217f 100644 --- a/StgSharp.Mathematics/Numeric/MatrixCompute.cs +++ b/StgSharp.Mathematics/Numeric/MatrixCompute.cs @@ -1,9 +1,9 @@ -//----------------------------------------------------------------------- +//----------------------------------------------------------------------- // ----------------------------------------------------------------------- // file="MatrixCompute" // Project: StgSharp -// AuthorGroup: Nitload Space -// Copyright (c) Nitload Space. All rights reserved. +// AuthorGroup: Nitload +// Copyright (c) Nitload. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -40,7 +40,9 @@ namespace StgSharp.Mathematics.Numeric public partial class MatrixCompute { - internal static unsafe void ComputeFmaPanelF32(MatrixParallelTaskPackage* p) + internal static unsafe void ComputeFmaPanelF32( + MatrixParallelTaskPackage* p + ) { int f32 = (int)MatrixElementType.F32; MatrixKernel* leftBuffer = (MatrixKernel*)p->Left; @@ -57,19 +59,24 @@ namespace StgSharp.Mathematics.Numeric // in this occasion size must be 1 for (long c = offsetRef; c < offsetRef + lengthRef; c++) { - int i = (int)(c / ansWidth); - int j = (int)(c % ansWidth); + int i = (int)(c / ansHeight); + int j = (int)(c % ansHeight); for (int k = 0; k < commonK; k++) { NativeIntrinsic.Context .mat[f32].kernel_fma( - GetKernelAddressUnsafe((MatrixKernel*)leftBuffer, ansHeight, k, j), - GetKernelAddressUnsafe((MatrixKernel*)rightBuffer, commonK, j, k), - GetKernelAddressUnsafe((MatrixKernel*)ansBuffer, ansHeight, i, j)); + GetKernelAddressUnsafe((MatrixKernel*)leftBuffer, + ansHeight, k, j), + GetKernelAddressUnsafe((MatrixKernel*)rightBuffer, + commonK, j, k), + GetKernelAddressUnsafe((MatrixKernel*)ansBuffer, + ansHeight, i, j)); } } } - internal static unsafe void ComputeFmaPanelF64(MatrixParallelTaskPackage* p) + internal static unsafe void ComputeFmaPanelF64( + MatrixParallelTaskPackage* p + ) { int f64 = (int)MatrixElementType.F64; @@ -88,22 +95,14 @@ namespace StgSharp.Mathematics.Numeric // in this occasion size must be 1 for (long c = offsetRef; c < offsetRef + lengthRef; c++) { - int i = (int)(c / ansWidth); - int j = (int)(c % ansWidth); + int i = (int)(c / ansHeight); + int j = (int)(c % ansHeight); enumeration->Member(0) = i; enumeration->Member(1) = j; enumeration->Member(2) = commonK; enumeration->Member(3) = ansHeight; - NativeIntrinsic.Context.mat[f64].kernel_tile_fma(leftBuffer, rightBuffer, ansBuffer, enumeration); - /* - for (int k = 0; k < commonK; k += 1) { - NativeIntrinsic.Context - .mat[f64].kernel_fma( - GetKernelAddressUnsafe((MatrixKernel*)leftBuffer, ansHeight, k, j), - GetKernelAddressUnsafe((MatrixKernel*)rightBuffer, commonK, j, k), - GetKernelAddressUnsafe((MatrixKernel*)ansBuffer, ansHeight, i, j)); - } - /**/ + NativeIntrinsic.Context.mat[f64].kernel_tile_fma(leftBuffer, rightBuffer, ansBuffer, + enumeration); } } @@ -112,8 +111,8 @@ namespace StgSharp.Mathematics.Numeric MatrixKernel* buffer, int colLength, int x, - int y) - where T: unmanaged, INumber + int y + ) where T : unmanaged, INumber { return (MatrixKernel*)(buffer + (colLength * x + y)); } diff --git a/StgSharp.Mathematics/Numeric/MatrixCompute.double.cs b/StgSharp.Mathematics/Numeric/MatrixCompute.double.cs index 8de0d83a..fc2f0d6a 100644 --- a/StgSharp.Mathematics/Numeric/MatrixCompute.double.cs +++ b/StgSharp.Mathematics/Numeric/MatrixCompute.double.cs @@ -1,9 +1,9 @@ -//----------------------------------------------------------------------- +//----------------------------------------------------------------------- // ----------------------------------------------------------------------- // file="MatrixCompute.double" // Project: StgSharp -// AuthorGroup: Nitload Space -// Copyright (c) Nitload Space. All rights reserved. +// AuthorGroup: Nitload +// Copyright (c) Nitload. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -38,7 +38,11 @@ namespace StgSharp.Mathematics.Numeric public partial class MatrixCompute { - public static unsafe void Add(Matrix left, Matrix right, Matrix ans) + public static unsafe void Add( + Matrix left, + Matrix right, + Matrix ans + ) { int f64 = (int)MatrixElementType.F64; if (left.ColumnLength != right.ColumnLength || @@ -84,7 +88,10 @@ namespace StgSharp.Mathematics.Numeric return; } - public static unsafe void Fill(Matrix ans, double value) + public static unsafe void Fill( + Matrix ans, + double value + ) { int f64 = (int)MatrixElementType.F64; long count = (long)ans.KernelColumnLength * ans.KernelRowLength; @@ -115,7 +122,11 @@ namespace StgSharp.Mathematics.Numeric taskGroup.Dispose(); } - public static unsafe void Mul(Matrix left, Matrix right, Matrix ans) + public static unsafe void Mul( + Matrix left, + Matrix right, + Matrix ans + ) { int f64 = (int)MatrixElementType.F64; @@ -137,34 +148,23 @@ namespace StgSharp.Mathematics.Numeric pool = MatrixParallel.LeadParallel(1); } M128* enumeration = stackalloc M128[1]; + enumeration->Member(2) = left.KernelColumnLength; + enumeration->Member(3) = ans.KernelColumnLength; for (int i = 0; i < ans.KernelRowLength; i++) { - for (int j = 0; j < ans.KernelColumnLength; j += 1) + for (int j = 0; j < ans.KernelColumnLength; j++) { enumeration->Member(0) = i; enumeration->Member(1) = j; - enumeration->Member(2) = ans.KernelRowLength; - enumeration->Member(3) = left.KernelColumnLength; NativeIntrinsic.Context .mat[f64].kernel_tile_fma((MatrixKernel*)left.Buffer, (MatrixKernel*)right.Buffer, - (MatrixKernel*)ans.Buffer, enumeration); - /* - // Console.WriteLine($"{i}{j}"); - for (int k = 0; k < left.KernelColumnLength; k++) - { - NativeIntrinsic.Context - .mat[f64].kernel_fma(GetKernelAddressUnsafe(left.Buffer, - left.KernelColumnLength, i, - k), - GetKernelAddressUnsafe(right.Buffer, - right.KernelColumnLength, k, j), - GetKernelAddressUnsafe(ans.Buffer, - ans.KernelColumnLength, i, j)); - } - /**/ + (MatrixKernel*)ans.Buffer, + enumeration); + Console.WriteLine($"{i},{j},{ans[4*i,4*j]:0.0E00}\t"); } + Console.WriteLine(); } if (count > 256) { MatrixParallel.ReturnParallelResources(ref pool!); @@ -189,13 +189,18 @@ namespace StgSharp.Mathematics.Numeric return; } - public static unsafe void Mul(Matrix left, double right, Matrix ans) + public static unsafe void Mul( + Matrix left, + double right, + Matrix ans + ) { int f64 = (int)MatrixElementType.F64; if (left.ColumnLength != ans.ColumnLength || left.RowLength != ans.RowLength) { throw new IndexOutOfRangeException("Matrix dimensions must agree."); } - if (left.Layout != MatrixLayout.DenseRectangle || ans.Layout != MatrixLayout.DenseRectangle) { + if (left.Layout != MatrixLayout.DenseRectangle || + ans.Layout != MatrixLayout.DenseRectangle) { throw new NotSupportedException("Only dense rectangle matrices are supported."); } long count = (long)left.KernelColumnLength * left.KernelRowLength; @@ -236,7 +241,11 @@ namespace StgSharp.Mathematics.Numeric return; } - public static unsafe void Sub(Matrix left, Matrix right, Matrix ans) + public static unsafe void Sub( + Matrix left, + Matrix right, + Matrix ans + ) { int f64 = (int)MatrixElementType.F64; if (left.ColumnLength != right.ColumnLength || diff --git a/StgSharp.Native/sn-src/m.fma_tile.x86.c b/StgSharp.Native/sn-src/m.fma_tile.x86.c index 05afe8d1..1d874cb7 100644 --- a/StgSharp.Native/sn-src/m.fma_tile.x86.c +++ b/StgSharp.Native/sn-src/m.fma_tile.x86.c @@ -1,4 +1,4 @@ -#include "sn_target.h" +#include "sn_target.h" #if SN_IS_ARCH(SN_ARCH_X86_64) @@ -20,7 +20,7 @@ internal static unsafe MatrixKernel* GetKernelAddressUnsafe( } */ -#define GET_INDEX(col_len, x, y) col_len *x + y +#define GET_INDEX(col_len, x, y) (col_len * x + y) /* for (int k = 0; k < commonK; k += 1) { @@ -56,7 +56,7 @@ DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(float, sse, , fma) for (size_t k = 0; k < commonK; k++) { MAT_KERNEL(float) const *right_cur = right + GET_INDEX(ansHeight, k, j), // GetKernelAddressUnsafe - const *left_cur = left + GET_INDEX(commonK, j, k); // GetKernelAddressUnsafe + const *left_cur = left + GET_INDEX(commonK, i, k); // GetKernelAddressUnsafe const __m128 a0 = _mm_load_ps((float *)&left_cur->f32_x[0]); const __m128 a1 = _mm_load_ps((float *)&left_cur->f32_x[1]); @@ -119,7 +119,7 @@ DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(float, avx, , fma) for (size_t k = 0; k < commonK; k++) { MAT_KERNEL(float) - const *left_cur = left + GET_INDEX(ansHeight, k, j), // GetKernelAddressUnsafe + const *left_cur = left + GET_INDEX(ansHeight, i, k), // GetKernelAddressUnsafe const *right_cur = right + GET_INDEX(ansHeight, j, k); // GetKernelAddressUnsafe @@ -182,9 +182,9 @@ DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(float, avx, _fma, fma) for (size_t k = 0; k < commonK; k++) { MAT_KERNEL(float) - const *left_cur = left + GET_INDEX(ansHeight, k, j), // GetKernelAddressUnsafe + const *left_cur = left + GET_INDEX(commonK, i, k), // GetKernelAddressUnsafe const *right_cur = - right + GET_INDEX(ansHeight, j, k); // GetKernelAddressUnsafe + right + GET_INDEX(ansHeight, k, j); // GetKernelAddressUnsafe register __m256 a01 = _mm256_load_ps((float *)&left_cur->f32_y[0]); register __m256 a23 = _mm256_load_ps((float *)&left_cur->f32_y[1]); @@ -293,7 +293,7 @@ DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(float, 512, , fma) a_hi = _mm_load_pd(left_cur + (3 * 2 + 1)); \ b = _mm_shuffle_pd(b_hi, b_hi, 0x3); \ c##i##_lo = _mm_add_pd(c##i##_lo, _mm_mul_pd(a_lo, b)); \ - c##i##_hi = _mm_add_pd(c##i##_hi, _mm_mul_pd(a_hi, b));\ + c##i##_hi = _mm_add_pd(c##i##_hi, _mm_mul_pd(a_hi, b)); DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(double, sse, , fma) { @@ -313,12 +313,18 @@ DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(double, sse, , fma) for (size_t k = 0; k < commonK; k++) { MAT_KERNEL(double) - const *left_cur = left + GET_INDEX(ansHeight, k, j), + const *left_cur = left + GET_INDEX(ansHeight, i, k), const *right_cur = right + GET_INDEX(commonK, j, k); // GetKernelAddressUnsafe - {DOUBLE_KERNEL_FMA_CYCLE(0)} - {DOUBLE_KERNEL_FMA_CYCLE(1)} - {DOUBLE_KERNEL_FMA_CYCLE(2)} + { + DOUBLE_KERNEL_FMA_CYCLE(0) + } + { + DOUBLE_KERNEL_FMA_CYCLE(1) + } + { + DOUBLE_KERNEL_FMA_CYCLE(2) + } { DOUBLE_KERNEL_FMA_CYCLE(3) } @@ -353,12 +359,12 @@ DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(double, avx, , fma) for (size_t k = 0; k < commonK; k++) { MAT_KERNEL(double) const *right_cur = right + GET_INDEX(ansHeight, k, j), // GetKernelAddressUnsafe - const *left_cur = left + GET_INDEX(commonK, j, k); // GetKernelAddressUnsafe + const *left_cur = left + GET_INDEX(commonK, i, k); // GetKernelAddressUnsafe - const __m256d a0 = _mm256_load_pd((double *)&left_cur->f64_z[0]); - const __m256d a1 = _mm256_load_pd((double *)&left_cur->f64_z[1]); - const __m256d a2 = _mm256_load_pd((double *)&left_cur->f64_z[2]); - const __m256d a3 = _mm256_load_pd((double *)&left_cur->f64_z[3]); + const __m256d a0 = _mm256_load_pd((double *)&left_cur->f64_y[0]); + const __m256d a1 = _mm256_load_pd((double *)&left_cur->f64_y[1]); + const __m256d a2 = _mm256_load_pd((double *)&left_cur->f64_y[2]); + const __m256d a3 = _mm256_load_pd((double *)&left_cur->f64_y[3]); /* Column 0 */ bcol = _mm256_load_pd((double *)&right_cur->f64_y[0]); @@ -430,12 +436,12 @@ DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(double, avx, _fma, fma) for (size_t k = 0; k < commonK; k++) { MAT_KERNEL(double) const *right_cur = right + GET_INDEX(ansHeight, k, j), // GetKernelAddressUnsafe - const *left_cur = left + GET_INDEX(commonK, j, k); // GetKernelAddressUnsafe + const *left_cur = left + GET_INDEX(commonK, i, k); // GetKernelAddressUnsafe - const __m256d a0 = _mm256_load_pd((double *)&left_cur->f64_z[0]); - const __m256d a1 = _mm256_load_pd((double *)&left_cur->f64_z[1]); - const __m256d a2 = _mm256_load_pd((double *)&left_cur->f64_z[2]); - const __m256d a3 = _mm256_load_pd((double *)&left_cur->f64_z[3]); + const __m256d a0 = _mm256_load_pd((double *)&left_cur->f64_y[0]); + const __m256d a1 = _mm256_load_pd((double *)&left_cur->f64_y[1]); + const __m256d a2 = _mm256_load_pd((double *)&left_cur->f64_y[2]); + const __m256d a3 = _mm256_load_pd((double *)&left_cur->f64_y[3]); /* Column 0 */ bcol = _mm256_load_pd((double *)&right_cur->f64_y[0]); @@ -493,7 +499,7 @@ DECLARE_KERTILE_PROC_LEFT_RIGHT_ANS(double, 512, , fma) for (size_t k = 0; k < commonK; k++) { MAT_KERNEL(double) - const *left_cur = left + GET_INDEX(ansHeight, k, j), // GetKernelAddressUnsafe + const *left_cur = left + GET_INDEX(ansHeight, i, k), // GetKernelAddressUnsafe const *right_cur = right + GET_INDEX(ansHeight, j, k); // GetKernelAddressUnsafe diff --git a/StgSharpDebug/Program.cs b/StgSharpDebug/Program.cs index fffc3dc8..7c139d0c 100644 --- a/StgSharpDebug/Program.cs +++ b/StgSharpDebug/Program.cs @@ -1,9 +1,9 @@ -//----------------------------------------------------------------------- +//----------------------------------------------------------------------- // ----------------------------------------------------------------------- // file="Program" // Project: StgSharp -// AuthorGroup: Nitload Space -// Copyright (c) Nitload Space. All rights reserved. +// AuthorGroup: Nitload +// Copyright (c) Nitload. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -39,17 +39,22 @@ namespace StgSharp private static string testExpPath = @"D:\Programmer\stepcode\data\ap203\ap203.exp"; - internal static unsafe void Main(string[] args) + internal static unsafe void Main( + string[] args + ) { try { - World.Initialize().UseModule().UseModule().InitializeModule(); + World.Initialize() + .UseModule() + .UseModule() + .InitializeModule(); // TestRender(); /**/ HybridLayerSegregatedFitAllocator hlsf; unchecked { - hlsf = new((nuint)(64 * (ulong)10000 * 10000)); + hlsf = new((nuint)(4 * (ulong)1024 * 1024 * 1024)); } Matrix m = Matrix.Create(40, 40, MatrixLayout.DenseRectangle, hlsf); MatrixCompute.Fill(m, 1.0f); @@ -58,7 +63,7 @@ namespace StgSharp Matrix p = Matrix.Create(40, 40, MatrixLayout.DenseRectangle, hlsf); MatrixCompute.Fill(p, 0.0f); - /**/ + /* for (int j = 0; j < 20; j++) { for (int k = 0; k < 10; k++) { @@ -70,10 +75,18 @@ namespace StgSharp /**/ Console.WriteLine("==================================================="); MatrixCompute.Mul(n, m, p); - for (int i = 0; i < 20; i++) + /**/ + for (int i = 0; i < 40; i++) { - for (int j = 0; j < 10; j++) { - Console.Write($"{p[i, j]:0.0E+00}\t"); + if (i % 4 == 0) { + Console.WriteLine(); + } + for (int j = 0; j < 40; j++) + { + string extra = j % 4 == 3 ? " \t" : ",\t"; + double value = p[i, j]; + value = double.Abs(value) < 1e-6 ? 0 : value; + Console.Write($"{value:0E+0}{extra}"); } Console.WriteLine(); }