FFTLIB User Guide
FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX.cpp
Go to the documentation of this file.
1 /******************************************************************************
2 * *
3 * module name :FFTLIB *
4 * *
5 * module descripton :Matrix Multiply Accelerator Library module for C7x+MMA *
6 * *
7 * Copyright (C) 2017-2018 Texas Instruments Incorporated - https://www.ti.com/ *
8 * ALL RIGHTS RESERVED *
9 * *
10 ******************************************************************************/
11 
24 
27 {
28  int32_t privBufSize = sizeof(FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_PrivArgs);
29  return privBufSize ;
30 }
31 
33  const FFTLIB_bufParams2D_t * src0_addr,
34  const FFTLIB_bufParams2D_t * src1_addr,
35  const FFTLIB_bufParams2D_t * dst_addr,
37 {
38  FFTLIB_STATUS status = FFTLIB_SUCCESS ;
39  int8_t shift = pKerInitArgs->shift;
40 
41  if(handle == NULL) {
42  status = FFTLIB_ERR_NULL_POINTER;
43  }
44  // check for valid dimensions
45  else if((src0_addr->dim_x != src1_addr->dim_y) || // A is m x k, B is k x n, C is m x n
46  (src0_addr->dim_y != dst_addr->dim_y) ||
47  (src1_addr->dim_x != dst_addr->dim_x)){
49  }
50  // check for matching data types
51  else if(src0_addr->data_type == FFTLIB_INT8){ // i8s_i8s_o8s
52  if((src1_addr->data_type != FFTLIB_INT8) ||
53  (dst_addr->data_type != FFTLIB_INT8) ){
55  }
56  if((status == FFTLIB_SUCCESS) && (shift > (FFTLIB_sizeof(FFTLIB_INT32) * 8))){
57  status = FFTLIB_ERR_INVALID_SHIFT;
58  }
59  } else if(src0_addr->data_type == FFTLIB_INT16){ // i16s_i16s_o16s
60  if((src1_addr->data_type != FFTLIB_INT16) ||
61  (dst_addr->data_type != FFTLIB_INT16) ){
63  }
64  if((status == FFTLIB_SUCCESS) && (shift > (FFTLIB_sizeof(FFTLIB_INT64) * 8))){
65  status = FFTLIB_ERR_INVALID_SHIFT;
66  }
67  } else if(src0_addr->data_type == FFTLIB_INT32){ // i32s_i32s_o32s
68  if((src1_addr->data_type != FFTLIB_INT32) ||
69  (dst_addr->data_type != FFTLIB_INT32) ){
71  }
72  if((status == FFTLIB_SUCCESS) && (shift > (FFTLIB_sizeof(FFTLIB_INT128) * 8))){
73  status = FFTLIB_ERR_INVALID_SHIFT;
74  }
75  } else {
77  }
78 
79  return status ;
80 }
81 
83  FFTLIB_kernelHandle handle,
84  const void * src0,
85  const void * src1,
86  const void * dst)
87 {
88  FFTLIB_STATUS status = FFTLIB_SUCCESS ;
89 
90  if((src0 == NULL) || (src1 == NULL) || (dst == NULL)) {
91  status = FFTLIB_ERR_NULL_POINTER;
92  }
93 
94  return status ;
95 }
96 
98  FFTLIB_kernelHandle handle,
99  const FFTLIB_bufParams2D_t * src0_addr,
100  const FFTLIB_bufParams2D_t * src1_addr,
101  const FFTLIB_bufParams2D_t * dst_addr,
103 {
104  FFTLIB_STATUS status ;
105  //Error Checks and update status with appropriate error code
108 
109  // error check all parameters and handle for NULLNESS
110  // return if error
111 #if defined(FFTLIB_CHECK_PARAMS) || defined(FFTLIB_LINALG_MATRIXMATRIXMULTIPLY_IXX_IXX_OXX_CHECK_PARAMS)
113  handle, src0_addr, src1_addr, dst_addr, pKerInitArgs);
114  if(status != FFTLIB_SUCCESS)
115  {
116  return status ;
117  }
118 #endif
119 
120  pKerPrivArgs->initArgs = *pKerInitArgs;
121 
122  pKerPrivArgs->strideAElements = src0_addr->stride_y / FFTLIB_sizeof(src0_addr->data_type);
123  pKerPrivArgs->strideBElements = src1_addr->stride_y / FFTLIB_sizeof(src1_addr->data_type);
124  pKerPrivArgs->strideCElements = dst_addr->stride_y / FFTLIB_sizeof(dst_addr->data_type);
125 
126  if(pKerInitArgs->funcStyle == FFTLIB_FUNCTION_NATC)
127  {
128  status = FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_init_cn(handle, src0_addr, src1_addr, dst_addr, pKerInitArgs) ;
129  if (src0_addr->data_type == FFTLIB_INT8 && src1_addr->data_type == FFTLIB_INT8 && dst_addr->data_type == FFTLIB_INT8) {
131 
132  } else if (src0_addr->data_type == FFTLIB_INT16 && src1_addr->data_type == FFTLIB_INT16 && dst_addr->data_type == FFTLIB_INT16) {
134 
135  } else if (src0_addr->data_type == FFTLIB_INT32 && src1_addr->data_type == FFTLIB_INT32 && dst_addr->data_type == FFTLIB_INT32) {
137 
138  } else {
140  }
141  } else {
142  if (dst_addr->data_type == FFTLIB_INT8) {
144  status = FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_init_ci<FFTLIB_INT8>(handle, src0_addr, src1_addr, dst_addr, pKerInitArgs) ;
145 
146  } else if (dst_addr->data_type == FFTLIB_INT16) {
148  status = FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_init_ci<FFTLIB_INT16>(handle, src0_addr, src1_addr, dst_addr, pKerInitArgs) ;
149 
150  } else if (dst_addr->data_type == FFTLIB_INT32) {
152  status = FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_init_ci<FFTLIB_INT32>(handle, src0_addr, src1_addr, dst_addr, pKerInitArgs) ;
153 
154  } else {
156  }
157  }
158 
159  return status ;
160 }
161 
163  FFTLIB_kernelHandle handle,
164  const void * src0,
165  const void * src1,
166  void *dst)
167 {
168  FFTLIB_STATUS status ;
169 
172 
173  status = pKerPrivArgs->execute(handle, src0, src1, dst) ;
174 
175  return status ;
176 }
FFTLIB_STATUS FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_exec_checkParams(FFTLIB_kernelHandle handle, const void *src0, const void *src1, const void *dst)
This function checks the parameters and should be called before kernel executuon. It can be called on...
int32_t FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_getHandleSize(FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_InitArgs *pKerInitArgs)
This is a query function to return the size of internal handle.
FFTLIB_STATUS FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_exec(FFTLIB_kernelHandle handle, const void *src0, const void *src1, void *dst)
This function is the main compute function, and performs matrix-matrix multiplication.
FFTLIB_STATUS FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_init_checkParams(FFTLIB_kernelHandle handle, const FFTLIB_bufParams2D_t *src0_addr, const FFTLIB_bufParams2D_t *src1_addr, const FFTLIB_bufParams2D_t *dst_addr, const FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_InitArgs *pKerInitArgs)
This function checks the parameters and should be called before kernel executuon. It can be called on...
FFTLIB_STATUS FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_init(FFTLIB_kernelHandle handle, const FFTLIB_bufParams2D_t *src0_addr, const FFTLIB_bufParams2D_t *src1_addr, const FFTLIB_bufParams2D_t *dst_addr, const FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_InitArgs *pKerInitArgs)
This function call is required to initialize the handle. In this function most of the one time operat...
template FFTLIB_STATUS FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_exec_ci< FFTLIB_MMA_SIZE_8_BIT >(FFTLIB_kernelHandle handle, const void *src0, const void *src1, void *dst)
template FFTLIB_STATUS FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_exec_ci< FFTLIB_MMA_SIZE_16_BIT >(FFTLIB_kernelHandle handle, const void *src0, const void *src1, void *dst)
template FFTLIB_STATUS FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_init_ci< FFTLIB_INT16 >(FFTLIB_kernelHandle handle, const FFTLIB_bufParams2D_t *src0_addr, const FFTLIB_bufParams2D_t *src1_addr, const FFTLIB_bufParams2D_t *dst_addr, const FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_InitArgs *pKerInitArgs)
template FFTLIB_STATUS FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_init_ci< FFTLIB_INT8 >(FFTLIB_kernelHandle handle, const FFTLIB_bufParams2D_t *src0_addr, const FFTLIB_bufParams2D_t *src1_addr, const FFTLIB_bufParams2D_t *dst_addr, const FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_InitArgs *pKerInitArgs)
template FFTLIB_STATUS FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_exec_ci< FFTLIB_MMA_SIZE_32_BIT >(FFTLIB_kernelHandle handle, const void *src0, const void *src1, void *dst)
template FFTLIB_STATUS FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_init_ci< FFTLIB_INT32 >(FFTLIB_kernelHandle handle, const FFTLIB_bufParams2D_t *src0_addr, const FFTLIB_bufParams2D_t *src1_addr, const FFTLIB_bufParams2D_t *dst_addr, const FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_InitArgs *pKerInitArgs)
template FFTLIB_STATUS FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_exec_cn< int32_t, FFTLIB_int128_t >(FFTLIB_kernelHandle handle, const void *src0, const void *src1, void *dst)
template FFTLIB_STATUS FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_exec_cn< int16_t, int64_t >(FFTLIB_kernelHandle handle, const void *src0, const void *src1, void *dst)
FFTLIB_STATUS FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_init_cn(FFTLIB_kernelHandle handle, const FFTLIB_bufParams2D_t *src0_addr, const FFTLIB_bufParams2D_t *src1_addr, const FFTLIB_bufParams2D_t *dst_addr, const FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_InitArgs *pKerInitArgs)
This function is the initialization function for the natural C implementation of the kernel.
template FFTLIB_STATUS FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_exec_cn< int8_t, int32_t >(FFTLIB_kernelHandle handle, const void *src0, const void *src1, void *dst)
Header file for kernel's internal use. For the kernel's interface, please see FFTLIB_LINALG_matrixMat...
@ FFTLIB_INT128
@ FFTLIB_INT64
@ FFTLIB_INT16
@ FFTLIB_INT8
@ FFTLIB_INT32
static int32_t FFTLIB_sizeof(uint32_t type)
Inline function returns number of bytes per element given a type of _FFTLIB_data_type_e.
void * FFTLIB_kernelHandle
Handle type for FFTLIB operations.
Definition: FFTLIB_types.h:217
FFTLIB_STATUS_NAME
The enumeration of all status codes.
Definition: FFTLIB_types.h:172
@ FFTLIB_ERR_MATRIX_MATRIX_MULTIPLY_UNSUPPORTED_TYPE_COMBINATION
Definition: FFTLIB_types.h:192
@ FFTLIB_ERR_NULL_POINTER
Definition: FFTLIB_types.h:178
@ FFTLIB_ERR_INVALID_DIMENSION
Definition: FFTLIB_types.h:177
@ FFTLIB_ERR_MATRIX_MATRIX_MULTIPLY_UNSUPPORTED_OUTPUT_TYPE
Definition: FFTLIB_types.h:191
@ FFTLIB_ERR_INVALID_SHIFT
Definition: FFTLIB_types.h:185
@ FFTLIB_SUCCESS
Definition: FFTLIB_types.h:173
@ FFTLIB_ERR_MATRIX_MATRIX_MULTIPLY_UNSUPPORTED_INPUT_TYPE
Definition: FFTLIB_types.h:190
@ FFTLIB_FUNCTION_NATC
Definition: FFTLIB_types.h:221
This structure holds all the initialization parameters for matrix- matrix multiplication.
pFxnFFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_exec execute
Function pointer to the execution variant.
FFTLIB_LINALG_matrixMatrixMultiply_ixX_ixX_oxX_InitArgs initArgs
Structure holding initialization parameters.
A structure for a 2 dimensional buffer descriptor.
uint32_t dim_y
Height of buffer in Y dimension in elements.
uint32_t dim_x
Width of buffer in X dimension in elements.
int32_t stride_y
Stride in Y dimension in bytes.
uint32_t data_type
Values are of type FFTLIB_data_type_e.