using System; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; using StgSharp.HighPerformance; using StgSharp.Internal; namespace StgSharp.Mathematics.Numeric { public partial class MatrixParallelThread { internal static unsafe void ComputeFmaPanelF32( MatrixParallelTaskPackage* p ) { int f32 = (int)MatrixElementType.F32; MatrixKernel* leftBuffer = (MatrixKernel*)p->Left; MatrixKernel* rightBuffer = (MatrixKernel*)p->Right; MatrixKernel* ansBuffer = (MatrixKernel*)p->Answer; ref long offsetRef = ref Unsafe.As(ref p->PrimTileOffset); ref long lengthRef = ref Unsafe.As(ref p->PrimCount); int ansWidth = p->AnsPrimOffset; int ansHeight = p->AnsSecOffset; int commonK = p->LeftPrimOffset; M128* enumeration = stackalloc M128[1]; enumeration->Member(2) = commonK; enumeration->Member(3) = ansHeight; // in this occasion size must be 1 for (long c = offsetRef; c < offsetRef + lengthRef; c++) { int i = (int)(c / ansHeight); int j = (int)(c % ansHeight); enumeration->Member(0) = i; enumeration->Member(1) = j; NativeIntrinsic.Context.mat[f32].kernel_tile_fma(leftBuffer, rightBuffer, ansBuffer, enumeration); } } internal static unsafe void ComputeFmaPanelF64( MatrixParallelTaskPackage* p ) { int f64 = (int)MatrixElementType.F64; // int size = 1; MatrixKernel* leftBuffer = (MatrixKernel*)p->Left; MatrixKernel* rightBuffer = (MatrixKernel*)p->Right; MatrixKernel* ansBuffer = (MatrixKernel*)p->Answer; ref long offsetRef = ref Unsafe.As(ref p->PrimTileOffset); ref long lengthRef = ref Unsafe.As(ref p->PrimCount); int ansWidth = p->AnsPrimOffset; int ansHeight = p->AnsSecOffset; int commonK = p->LeftPrimOffset; M128* enumeration = stackalloc M128[1]; enumeration->Member(2) = commonK; enumeration->Member(3) = ansHeight; // in this occasion size must be 1 for (long c = offsetRef; c < offsetRef + lengthRef; c++) { int i = (int)(c / ansHeight); int j = (int)(c % ansHeight); enumeration->Member(0) = i; enumeration->Member(1) = j; NativeIntrinsic.Context.mat[f64].kernel_tile_fma(leftBuffer, rightBuffer, ansBuffer, enumeration); } } } }