78 lines
3.0 KiB
C#
78 lines
3.0 KiB
C#
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<int, long>(ref p->PrimTileOffset);
|
|
ref long lengthRef = ref Unsafe.As<int, long>(ref p->PrimCount);
|
|
int ansWidth = p->AnsPrimOffset;
|
|
int ansHeight = p->AnsSecOffset;
|
|
int commonK = p->LeftPrimOffset;
|
|
|
|
M128* enumeration = stackalloc M128[1];
|
|
enumeration->Member<int>(2) = commonK;
|
|
enumeration->Member<int>(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<int>(0) = i;
|
|
enumeration->Member<int>(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<int, long>(ref p->PrimTileOffset);
|
|
ref long lengthRef = ref Unsafe.As<int, long>(ref p->PrimCount);
|
|
int ansWidth = p->AnsPrimOffset;
|
|
int ansHeight = p->AnsSecOffset;
|
|
int commonK = p->LeftPrimOffset;
|
|
|
|
M128* enumeration = stackalloc M128[1];
|
|
enumeration->Member<int>(2) = commonK;
|
|
enumeration->Member<int>(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<int>(0) = i;
|
|
enumeration->Member<int>(1) = j;
|
|
NativeIntrinsic.Context.mat[f64].kernel_tile_fma(leftBuffer, rightBuffer, ansBuffer,
|
|
enumeration);
|
|
}
|
|
}
|
|
}
|
|
}
|