#ifndef FP_816_LOCAL_BODY_H_
#define FP_816_LOCAL_BODY_H_

__host__ __device__ int VP_FP32BiggerZero(MyVoid *x);
__host__ __device__ int VP_FP8_E4M3BiggerZero(MyVoid *x);
__host__ __device__ int VP_FP8_E5M2BiggerZero(MyVoid *x);
__host__ __device__ int VP_FP16BiggerZero(MyVoid *x);
__host__ __device__ void VP_FP32ArraySetValue(MyVoid *outF, int len, MyVoid *inF);
__host__ __device__ void VP_FP8_E4M3ArraySetValue(MyVoid *outF, int len, MyVoid *inF);
__host__ __device__ void VP_FP8_E5M2ArraySetValue(MyVoid *outF, int len, MyVoid *inF);
__host__ __device__ void VP_FP16ArraySetValue(MyVoid *outF, int len, MyVoid *inF);
__host__ __device__ void VP_FP32ArrayExchangeValue(MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP8_E4M3ArrayExchangeValue(MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP8_E5M2ArrayExchangeValue(MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP16ArrayExchangeValue(MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP32AddArray(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP8_E4M3AddArray(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP8_E5M2AddArray(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP16AddArray(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP32SubArray(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP8_E4M3SubArray(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP8_E5M2SubArray(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP16SubArray(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP32DotArray(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP8_E4M3DotArray(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP8_E5M2DotArray(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP16DotArray(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP32AddinDotArray(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP8_E4M3AddinDotArray(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP8_E5M2AddinDotArray(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP16AddinDotArray(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP32SumKernelFloatArrayDot(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP8_E4M3SumKernelFloatArrayDot(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP8_E5M2SumKernelFloatArrayDot(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP16SumKernelFloatArrayDot(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP32DivArray(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP8_E4M3DivArray(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP8_E5M2DivArray(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP16DivArray(MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);
__host__ __device__ void VP_FP32KernelFloatSubArray(MyVoid *result, MyVoid *srcArray, MyVoid *inFloat, int len);
__host__ __device__ void VP_FP8_E4M3KernelFloatSubArray(MyVoid *result, MyVoid *srcArray, MyVoid *inFloat, int len);
__host__ __device__ void VP_FP8_E5M2KernelFloatSubArray(MyVoid *result, MyVoid *srcArray, MyVoid *inFloat, int len);
__host__ __device__ void VP_FP16KernelFloatSubArray(MyVoid *result, MyVoid *srcArray, MyVoid *inFloat, int len);
__host__ __device__ void VP_FP32KernelFloatAddArray(MyVoid *result, MyVoid *srcArray, MyVoid *inFloat, int len);
__host__ __device__ void VP_FP8_E4M3KernelFloatAddArray(MyVoid *result, MyVoid *srcArray, MyVoid *inFloat, int len);
__host__ __device__ void VP_FP8_E5M2KernelFloatAddArray(MyVoid *result, MyVoid *srcArray, MyVoid *inFloat, int len);
__host__ __device__ void VP_FP16KernelFloatAddArray(MyVoid *result, MyVoid *srcArray, MyVoid *inFloat, int len);
__host__ __device__ void VP_FP32SumKernelFloatArray(MyVoid *result, MyVoid *srcArray, int len);
__host__ __device__ void VP_FP8_E4M3SumKernelFloatArray(MyVoid *result, MyVoid *srcArray, int len);
__host__ __device__ void VP_FP8_E5M2SumKernelFloatArray(MyVoid *result, MyVoid *srcArray, int len);
__host__ __device__ void VP_FP16SumKernelFloatArray(MyVoid *result, MyVoid *srcArray, int len);
__host__ __device__ void VP_FP32MulAddKernelFloatArray(MyVoid *y, MyVoid *x, MyVoid *w, MyVoid *b, int len);
__host__ __device__ void VP_FP8_E4M3MulAddKernelFloatArray(MyVoid *y, MyVoid *x, MyVoid *w, MyVoid *b, int len);
__host__ __device__ void VP_FP8_E5M2MulAddKernelFloatArray(MyVoid *y, MyVoid *x, MyVoid *w, MyVoid *b, int len);
__host__ __device__ void VP_FP16MulAddKernelFloatArray(MyVoid *y, MyVoid *x, MyVoid *w, MyVoid *b, int len);
__host__ __device__ void VP_FP32ArrayCopyValue(MyVoid *fA1Array, MyVoid *fA2Array, int len);
__host__ __device__ void VP_FP8_E4M3ArrayCopyValue(MyVoid *fA1Array, MyVoid *fA2Array, int len);
__host__ __device__ void VP_FP8_E5M2ArrayCopyValue(MyVoid *fA1Array, MyVoid *fA2Array, int len);
__host__ __device__ void VP_FP16ArrayCopyValue(MyVoid *fA1Array, MyVoid *fA2Array, int len);
__host__ __device__ void VP_CopyFP32ArrayOffset(MyVoid *Y, int indexOfY, MyVoid *X, int indexOfX, int len);
__host__ __device__ void VP_CopyFP8_E4M3ArrayOffset(MyVoid *Y, int indexOfY, MyVoid *X, int indexOfX, int len);
__host__ __device__ void VP_CopyFP8_E5M2ArrayOffset(MyVoid *Y, int indexOfY, MyVoid *X, int indexOfX, int len);
__host__ __device__ void VP_CopyFP16ArrayOffset(MyVoid *Y, int indexOfY, MyVoid *X, int indexOfX, int len);
__host__ __device__ void VP_FP32ToFP32(MyVoid *outF, float inF);
__host__ __device__ void VP_FP32ToFP8_E4M3(MyVoid *outF, float inF);
__host__ __device__ void VP_FP32ToFP8_E5M2(MyVoid *outF, float inF);
__host__ __device__ void VP_FP32ToFP16(MyVoid *outF, float inF);
__host__ __device__ void VP_GetFP32OppositerNum(MyVoid *outF, MyVoid *inF);
__host__ __device__ void VP_GetFP8_E4M3OppositerNum(MyVoid *outF, MyVoid *inF);
__host__ __device__ void VP_GetFP8_E5M2OppositerNum(MyVoid *outF, MyVoid *inF);
__host__ __device__ void VP_GetFP16OppositerNum(MyVoid *outF, MyVoid *inF);
__host__ __device__ int VP_FP32Bigger(MyVoid *f1, MyVoid *f2);
__host__ __device__ int VP_FP8_E4M3Bigger(MyVoid *f1, MyVoid *f2);
__host__ __device__ int VP_FP8_E5M2Bigger(MyVoid *f1, MyVoid *f2);
__host__ __device__ int VP_FP16Bigger(MyVoid *f1, MyVoid *f2);
__host__ __device__ int VP_FP32Equal(MyVoid *f1, MyVoid *f2);
__host__ __device__ int VP_FP8_E4M3Equal(MyVoid *f1, MyVoid *f2);
__host__ __device__ int VP_FP8_E5M2Equal(MyVoid *f1, MyVoid *f2);
__host__ __device__ int VP_FP16Equal(MyVoid *f1, MyVoid *f2);
__host__ __device__ int VP_FP32BiggerEqual(MyVoid *f1, MyVoid *f2);
__host__ __device__ int VP_FP8_E4M3BiggerEqual(MyVoid *f1, MyVoid *f2);
__host__ __device__ int VP_FP8_E5M2BiggerEqual(MyVoid *f1, MyVoid *f2);
__host__ __device__ int VP_FP16BiggerEqual(MyVoid *f1, MyVoid *f2);
__host__ __device__ void VP_FP32Add(MyVoid *result, MyVoid *f1, MyVoid *f2);
__host__ __device__ void VP_FP8_E4M3Add(MyVoid *result, MyVoid *f1, MyVoid *f2);
__host__ __device__ void VP_FP8_E5M2Add(MyVoid *result, MyVoid *f1, MyVoid *f2);
__host__ __device__ void VP_FP16Add(MyVoid *result, MyVoid *f1, MyVoid *f2);
__host__ __device__ void VP_FP32Sub(MyVoid *result, MyVoid *f1, MyVoid *f2);
__host__ __device__ void VP_FP8_E4M3Sub(MyVoid *result, MyVoid *f1, MyVoid *f2);
__host__ __device__ void VP_FP8_E5M2Sub(MyVoid *result, MyVoid *f1, MyVoid *f2);
__host__ __device__ void VP_FP16Sub(MyVoid *result, MyVoid *f1, MyVoid *f2);
__host__ __device__ void VP_FP32Mul(MyVoid *result, MyVoid *f1, MyVoid *f2);
__host__ __device__ void VP_FP8_E4M3Mul(MyVoid *result, MyVoid *f1, MyVoid *f2);
__host__ __device__ void VP_FP8_E5M2Mul(MyVoid *result, MyVoid *f1, MyVoid *f2);
__host__ __device__ void VP_FP16Mul(MyVoid *result, MyVoid *f1, MyVoid *f2);
__host__ __device__ void VP_FP32Div(MyVoid *result, MyVoid *f1, MyVoid *f2);
__host__ __device__ void VP_FP8_E4M3Div(MyVoid *result, MyVoid *f1, MyVoid *f2);
__host__ __device__ void VP_FP8_E5M2Div(MyVoid *result, MyVoid *f1, MyVoid *f2);
__host__ __device__ void VP_FP16Div(MyVoid *result, MyVoid *f1, MyVoid *f2);
__host__ __device__ void VP_FP32_sin(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP8_E4M3_sin(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP8_E5M2_sin(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP16_sin(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP32_cos(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP8_E4M3_cos(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP8_E5M2_cos(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP16_cos(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP32_exp(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP8_E4M3_exp(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP8_E5M2_exp(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP16_exp(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP32_log(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP8_E4M3_log(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP8_E5M2_log(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP16_log(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP32_sqrt(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP8_E4M3_sqrt(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP8_E5M2_sqrt(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP16_sqrt(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP32_fabs(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP8_E4M3_fabs(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP8_E5M2_fabs(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP16_fabs(MyVoid *result, MyVoid *inF);
__host__ __device__ void VP_FP32_pow(MyVoid *result, MyVoid *base, MyVoid *expo);
__host__ __device__ void VP_FP8_E4M3_pow(MyVoid *result, MyVoid *base, MyVoid *expo);
__host__ __device__ void VP_FP8_E5M2_pow(MyVoid *result, MyVoid *base, MyVoid *expo);
__host__ __device__ void VP_FP16_pow(MyVoid *result, MyVoid *base, MyVoid *expo);
__host__ __device__ void MathExpectMyVoidArray(int fType, MyVoid *result, MyVoid *arrayData, int len);
__host__ __device__ void VP_FP32Variance(MyVoid *result, MyVoid *arrayData, int len);
__host__ __device__ void VP_FP8_E4M3Variance(MyVoid *result, MyVoid *arrayData, int len);
__host__ __device__ void VP_FP8_E5M2Variance(MyVoid *result, MyVoid *arrayData, int len);
__host__ __device__ void VP_FP16Variance(MyVoid *result, MyVoid *arrayData, int len);
__host__ __device__ int VP_FP32VectorMaxIndex(MyVoid *vec, int veclength);
__host__ __device__ int VP_FP8_E4M3VectorMaxIndex(MyVoid *vec, int veclength);
__host__ __device__ int VP_FP8_E5M2VectorMaxIndex(MyVoid *vec, int veclength);
__host__ __device__ int VP_FP16VectorMaxIndex(MyVoid *vec, int veclength);
__host__ __device__ MyVoid *VP_FP32GetVoidPoint(MyVoid *arr, int indexofArr);
__host__ __device__ MyVoid *VP_FP8_E4M3GetVoidPoint(MyVoid *arr, int indexofArr);
__host__ __device__ MyVoid *VP_FP8_E5M2GetVoidPoint(MyVoid *arr, int indexofArr);
__host__ __device__ MyVoid *VP_FP16GetGetVoidPoint(MyVoid *arr, int indexofArr);
__host__ __device__ void VP_FP32SetFloatWithIndex(MyVoid *arr, int indexofArr, float v);
__host__ __device__ void VP_FP8_E4M3SetFloatWithIndex(MyVoid *arr, int indexofArr, float v);
__host__ __device__ void VP_FP8_E5M2SetFloatWithIndex(MyVoid *arr, int indexofArr, float v);
__host__ __device__ void VP_FP16SetFloatWithIndex(MyVoid *arr, int indexofArr, float v);
__host__ __device__ void VP_CopyFP32Point(MyVoid *Y, int indexOfY, MyVoid *X, int indexOfX);
__host__ __device__ void VP_CopyFP8_E4M3Point(MyVoid *Y, int indexOfY, MyVoid *X, int indexOfX);
__host__ __device__ void VP_CopyFP8_E5M2Point(MyVoid *Y, int indexOfY, MyVoid *X, int indexOfX);
__host__ __device__ void VP_CopyFP16Point(MyVoid *Y, int indexOfY, MyVoid *X, int indexOfX);
__host__ __device__ int VP_FP32GetInt(MyVoid *arr, int indexofArr);
__host__ __device__ int VP_FP8_E4M3GetInt(MyVoid *arr, int indexofArr);
__host__ __device__ int VP_FP8_E5M2GetInt(MyVoid *arr, int indexofArr);
__host__ __device__ int VP_FP16GetInt(MyVoid *arr, int indexofArr);
__host__ __device__ float VP_FP32ToFloat(MyVoid *inArray);
__host__ __device__ float VP_FP8_E4M3ToFloat(MyVoid *inArray);
__host__ __device__ float VP_FP8_E5M2ToFloat(MyVoid *inArray);
__host__ __device__ float VP_FP16ToFloat(MyVoid *inArray);
__host__ __device__ float VP_OffsetFP32ToFloat(MyVoid *inArray, int offset);
__host__ __device__ float VP_OffsetFP8_E4M3ToFloat(MyVoid *inArray, int offset);
__host__ __device__ float VP_OffsetFP8_E5M2ToFloat(MyVoid *inArray, int offset);
__host__ __device__ float VP_OffsetFP16ToFloat(MyVoid *inArray, int offset);
__host__ __device__ void VP_FP32SetZero(MyVoid *result);
__host__ __device__ void VP_FP8_E4M3SetZero(MyVoid *result);
__host__ __device__ void VP_FP8_E5M2SetZero(MyVoid *result);
__host__ __device__ void VP_FP16SetZero(MyVoid *result);
__host__ __device__ void VP_FP32AddinMyVoidArrayOffset(MyVoid *result, int rOffset, MyVoid *src1, \
                                                       int offset1, MyVoid *src2, int offset2, int len);
__host__ __device__ void VP_FP8_E4M3AddinMyVoidArrayOffset(MyVoid *result, int rOffset, MyVoid *src1, \
                                                           int offset1, MyVoid *src2, int offset2, int len);
__host__ __device__ void VP_FP8_E5M2AddinMyVoidArrayOffset(MyVoid *result, int rOffset, MyVoid *src1, \
                                                           int offset1, MyVoid *src2, int offset2, int len);                                                           
__host__ __device__ void VP_FP16AddinMyVoidArrayOffset(MyVoid *result, int rOffset, MyVoid *src1, \
                                                       int offset1, MyVoid *src2, int offset2, int len);
__host__ __device__ void VP_FP32MulCoffMyVoidArray(MyVoid *yArr, MyVoid *xArr, MyVoid *wCoff, int len);
__host__ __device__ void VP_FP8_E4M3MulCoffMyVoidArray(MyVoid *yArr, MyVoid *xArr, MyVoid *wCoff, int len);
__host__ __device__ void VP_FP8_E5M2MulCoffMyVoidArray(MyVoid *yArr, MyVoid *xArr, MyVoid *wCoff, int len);
__host__ __device__ void VP_FP16MulCoffMyVoidArray(MyVoid *yArr, MyVoid *xArr, MyVoid *wCoff, int len);
__host__ __device__ void VP_FP32MulCoffAddInMyVoidArray(MyVoid *yArr, MyVoid *xArr, MyVoid *wCoff, int len);
__host__ __device__ void VP_FP8_E4M3MulCoffAddInMyVoidArray(MyVoid *yArr, MyVoid *xArr, MyVoid *wCoff, int len);
__host__ __device__ void VP_FP8_E5M2MulCoffAddInMyVoidArray(MyVoid *yArr, MyVoid *xArr, MyVoid *wCoff, int len);
__host__ __device__ void VP_FP16MulCoffAddInMyVoidArray(MyVoid *yArr, MyVoid *xArr, MyVoid *wCoff, int len);

__host__ __device__ void SumKernelFloatArray(int fType, MyVoid *result, MyVoid *srcArray, int len);

/********************************************************************/
__host__ __device__ void SetMyVoidValueZero(int fType, MyVoid *result);

/****************************************************************/
__host__ __device__ float MyVoidToFloat(int fType, MyVoid *result);

/***********************************************************************************/
__host__ __device__ float MyVoidOffsetToFloat(int fType, MyVoid *result, int offset);

/************************************************************/
__host__ __device__ int BiggerZeroMyVoid(int fType, MyVoid *x);

/*****************************************************************************************/
__host__ __device__ void SetMyVoidArrayValue(int fType, MyVoid *outF, int len, MyVoid *inF);

/****************************************************************************************/
__host__ __device__ void ExchangeMyVoidArray(int fType, MyVoid *fA1, MyVoid *fA2, int len);

__host__ __device__ void AddMyVoidArray(int fType, MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);

__host__ __device__ void SubMyVoidArray(int fType, MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);

__host__ __device__ void DotMyVoidArray(int fType, MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);

__host__ __device__ void AddinDotMyVoidArray(int fType, MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);

__host__ __device__ void SumKernelFloatArrayDot(int fType, MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);

__host__ __device__ void AddinMyVoidArrayOffset(int fType, MyVoid *result, int rOffset, MyVoid *src1, \
                                                int offset1, MyVoid *src2, int offset2, int len);

__host__ __device__ void MulCoffMyVoidArray(int fType, MyVoid *yArr, MyVoid *xArr, MyVoid *wCoff, int len);

__host__ __device__ void MulCoffAddInMyVoidArray(int fType, MyVoid *yArr, MyVoid *xArr, MyVoid *wCoff, int len);

__host__ __device__ void SumMyVoidArrayDot(int fType, MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);

__host__ __device__ void DivMyVoidArray(int fType, MyVoid *result, MyVoid *fA1, MyVoid *fA2, int len);

__host__ __device__ void MyVoidSubArray(int fType, MyVoid *result, MyVoid *srcArray, MyVoid *inFloat, int len);

__host__ __device__ void MyVoidAddArray(int fType, MyVoid *result, MyVoid *srcArray, MyVoid *inFloat, int len);

__host__ __device__ void SumMyVoidArray(int fType, MyVoid *result, MyVoid *srcArray, int len);

__host__ __device__ void MulAddMyVoidArray(int fType, MyVoid *y, MyVoid *x, MyVoid *w, MyVoid *b, int len);

__host__ __device__ void CopyMyVoidArray(int fType, MyVoid *fA1Array, MyVoid *fA2Array, int len);

__host__ __device__ void SetMyVoidValueByFloat(int fType, MyVoid *outF, float inF);

__host__ __device__ void OppMyVoidValue(int fType, MyVoid *outF, MyVoid *inF);

__host__ __device__ int BiggerMyVoid(int fType, MyVoid *f1, MyVoid *f2);

__host__ __device__ int EqualMyVoid(int fType, MyVoid *f1, MyVoid *f2);

__host__ __device__ int BiggerEqualMyVoid(int fType, MyVoid *f1, MyVoid *f2);

__host__ __device__ void AddMyVoid(int fType, MyVoid *result, MyVoid *f1, MyVoid *f2);

__host__ __device__ void SubMyVoid(int fType, MyVoid *result, MyVoid *f1, MyVoid *f2);

__host__ __device__ void MulMyVoid(int fType, MyVoid *result, MyVoid *f1, MyVoid *f2);

__host__ __device__ void DivMyVoid(int fType, MyVoid *result, MyVoid *f1, MyVoid *f2);

__host__ __device__ void SinMyVoid(int fType, MyVoid *result, MyVoid *inF);

__host__ __device__ void CosMyVoid(int fType, MyVoid *result, MyVoid *inF);

__host__ __device__ void ExpMyVoid(int fType, MyVoid *result, MyVoid *inF);

__host__ __device__ void LogMyVoid(int fType, MyVoid *result, MyVoid *inF);

__host__ __device__ void SqrtMyVoid(int fType, MyVoid *result, MyVoid *inF);

__host__ __device__ void FabsMyVoid(int fType, MyVoid *result, MyVoid *inF);

__host__ __device__ void PowMyVoid(int fType, MyVoid *result, MyVoid *base, MyVoid *expo);

__host__ __device__ void PowNatureMyVoid(int fType, MyVoid *result, MyVoid *expo);

__host__ __device__ void VarianceMyVoidArray(int fType, MyVoid *result, MyVoid *arrayData, int len);

__host__ __device__ int VectorMaxIndex(int fType, MyVoid *vec, int veclength);

__host__ __device__ void CopyMyVoid(int fType, MyVoid *Y, int indexOfY, MyVoid *X, int indexOfX);

__host__ __device__ void CopyMyVoidArrayOffset(int fType, MyVoid *Y, int indexOfY, MyVoid *X, int indexOfX, int len);

__host__ __device__ int GetFPInt(int fType, MyVoid *arr, int indexofArr);

__host__ __device__ void SetFloatWithIndex(int fType, MyVoid *arr, int indexofArr, float v);

__host__ __device__ MyVoid *GetVoidPoint(int fType, MyVoid *arr, int indexofArr);

__host__ __device__ void MulAddinMyVoid(int fType, MyVoid *result, MyVoid *f1, MyVoid *f2);
__host__ __device__ void VP_FP32MulAddin(MyVoid *result, MyVoid *f1, MyVoid *f2);
__host__ __device__ void VP_FP8_E4M3MulAddin(MyVoid *result, MyVoid *f1, MyVoid *f2);
__host__ __device__ void VP_FP8_E5M2MulAddin(MyVoid *result, MyVoid *f1, MyVoid *f2);
__host__ __device__ void VP_FP16MulAddin(MyVoid *result, MyVoid *f1, MyVoid *f2);

__host__ __device__ void VoidArrayToVoidArray(int dfType, int sfType, MyVoid *yDst, MyVoid *ySrc, long long len);

__host__ __device__ void GetSoftMaxLoss(int fType, MyVoid *result, int lostType, MyVoid *P_t, float coff);

__host__ __device__ void GetSoftMaxGrad(int fType, MyVoid *result, int lostType, int cIndex, int trueChannelIndex, MyVoid *Pt, MyVoid *Pi, float coff);

__host__ __device__ void LogSumExp(int fType, MyVoid *result, MyVoid *arrFloat, int len, int tIndex);

__host__ __device__ void GetSoftMaxLossBySrcOut(int fType, MyVoid *result, int lostType, MyVoid *arrFloat, int len, int tIndex, MyVoid *coff);

#endif