VXLIB User Guide
VXLIB_accumulateSquareImage.cpp
Go to the documentation of this file.
1 /******************************************************************************
2  * Copyright (C) 2023 Texas Instruments Incorporated - https://www.ti.com/
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *
11  * Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the
14  * distribution.
15  *
16  * Neither the name of Texas Instruments Incorporated nor the names of
17  * its contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  ******************************************************************************/
33 
34 /**********************************************************************************************************************/
35 /* */
36 /* INCLUDES */
37 /* */
38 /**********************************************************************************************************************/
39 
40 #include "../VXLIB_addSquare/VXLIB_addSquare_priv.h"
42 #include <cstdint>
43 
44 /**********************************************************************************************************************/
45 /* */
46 /* VXLIB_accumulateSquareImage_getHandleSize */
47 /* */
48 /**********************************************************************************************************************/
49 
50 // this method calculates and returns the size of the handle for the VXLIB_accumulateSquareImage kernel
51 // in this case, the function returns the size of the handle for the VXLIB_addSquare kernel becuase accumulateSqureImage
52 // has no internal implementation and it calls addSquare implementation instead.
54 {
55  int32_t privBufSize = sizeof(VXLIB_addSquare_PrivArgs);
56  return privBufSize;
57 }
58 
59 /**********************************************************************************************************************/
60 /* */
61 /* VXLIB_accumulateSquareImage_init_checkParams */
62 /* */
63 /**********************************************************************************************************************/
64 
65 // this method checks the initialization parameters for the VXLIB_accumulateSquareImage kernel
68  const VXLIB_bufParams2D_t *bufParamsIn,
69  const VXLIB_bufParams2D_t *bufParamsOut,
70  const VXLIB_accumulateSquareImage_InitArgs *pKerInitArgs)
71 {
72  VXLIB_STATUS status = VXLIB_SUCCESS;
73 
74  // obtain input buffer parameters
75  uint32_t dTypeIn = bufParamsIn->data_type;
76  uint32_t widthIn = bufParamsIn->dim_x;
77  uint32_t heightIn = bufParamsIn->dim_y;
78  uint32_t strideIn = bufParamsIn->stride_y;
79 
80  // obtain output buffer parameters
81  uint32_t dTypeOut = bufParamsOut->data_type;
82  uint32_t widthOut = bufParamsOut->dim_x;
83  uint32_t heightOut = bufParamsOut->dim_y;
84  uint32_t strideOut = bufParamsOut->stride_y;
85 
86  uint32_t strideInElements = strideIn / VXLIB_sizeof(bufParamsIn->data_type);
87  uint32_t strideOutElements = strideOut / VXLIB_sizeof(bufParamsOut->data_type);
88 
89  // check for dimensions and datatype combinations
90  if (handle == NULL) {
91  status = VXLIB_ERR_NULL_POINTER;
92  }
93  else if ((widthIn != widthOut) || (heightIn != heightOut)) {
95  }
96  else if (strideInElements < widthIn || strideOutElements < widthOut) {
98  }
100  status = VXLIB_ERR_INVALID_TYPE;
101  }
102  else {
103  status = VXLIB_SUCCESS;
104  }
105 
106  return status;
107 }
108 
109 /**********************************************************************************************************************/
110 /* */
111 /* VXLIB_accumulateSquareImage_exec_checkParams */
112 /* */
113 /**********************************************************************************************************************/
114 
115 // this method checks the execution parameters for the VXLIB_accumulateSquareImage kernel
117  const void *restrict pIn,
118  const void *restrict pOut,
119  const uint32_t shift)
120 {
121  VXLIB_STATUS status;
122 
123 #if VXLIB_DEBUGPRINT
124  printf("Enter VXLIB_accumulateSquareImage_exec_checkParams\n");
125 #endif
126  if ((handle == NULL) || (pIn == NULL) || (pOut == NULL)) {
127  status = VXLIB_ERR_NULL_POINTER;
128  }
129  else {
130  status = VXLIB_SUCCESS;
131  }
132 
133  return status;
134 }
135 
136 /**********************************************************************************************************************/
137 /* */
138 /* VXLIB_accumulateSquareImage_init */
139 /* */
140 /**********************************************************************************************************************/
141 
142 // this method is the user-level initialization function for the VXLIB_accumulateSquareImage kernel
144  VXLIB_bufParams2D_t *bufParamsIn,
145  VXLIB_bufParams2D_t *bufParamsOut,
146  const VXLIB_accumulateSquareImage_InitArgs *pKerInitArgs)
147 {
148  VXLIB_STATUS status = VXLIB_SUCCESS;
149  VXLIB_addSquare_PrivArgs *pKerPrivArgs = (VXLIB_addSquare_PrivArgs *) handle;
150 
151  // copy pKerinitArgs into pKerPrivargs
152  // cast the VXLIB_accumulateSquareImage_InitArgs to VXLIB_addSquare_InitArgs
153  VXLIB_addSquare_InitArgs *kerInitArgsAddSquare = (VXLIB_addSquare_InitArgs *) pKerInitArgs;
154 
155  pKerPrivArgs->pKerInitArgs = *kerInitArgsAddSquare;
156 
157  // set width and height of image
158  pKerPrivArgs->width = bufParamsIn->dim_x;
159  pKerPrivArgs->height = bufParamsIn->dim_y;
160 
161  // compute stride in elements as SE/SA params are set to work with given element type
162  pKerPrivArgs->strideIn0Elements = bufParamsIn->stride_y / VXLIB_sizeof(bufParamsIn->data_type);
163  pKerPrivArgs->strideIn1Elements = bufParamsOut->stride_y / VXLIB_sizeof(bufParamsOut->data_type);
164  pKerPrivArgs->strideOutElements = bufParamsOut->stride_y / VXLIB_sizeof(bufParamsOut->data_type);
165 
166 #if VXLIB_DEBUGPRINT
167  printf("VXLIB_DEBUGPRINT Enter VXLIB_accumulateSquareImage_init\n");
168 #endif
169 
170  // obtain buffer datatypes
171  uint32_t dTypeIn = bufParamsIn->data_type;
172  uint32_t dTypeOut = bufParamsOut->data_type;
173 
174  // determine natural C vs optimized function call
175  if (pKerInitArgs->funcStyle == VXLIB_FUNCTION_NATC) {
176 
177  // set function pointer for natural C function with appropriate template parameters based on datatypes
178 
181  }
182  else {
183  status = VXLIB_ERR_INVALID_TYPE;
184  }
185  }
186  else { // Optimized function
187 
188  // set function pointer for natural C function with appropriate template parameters based on datatypes
189 
192  status = VXLIB_addSquare_init_ci<VXLIB_ADDSQUARE_DTYPE_I8U_I16S_O16S>(handle, bufParamsIn, bufParamsOut,
193  bufParamsOut, kerInitArgsAddSquare);
194  }
195  else {
196  status = VXLIB_ERR_INVALID_TYPE;
197  }
198  }
199 
200  return status;
201 }
202 
203 /**********************************************************************************************************************/
204 /* */
205 /* VXLIB_accumulateSquareImage_exec */
206 /* */
207 /**********************************************************************************************************************/
208 
209 // this method is the user-level execution function for the VXLIB_accumulateSquareImage kernel
211 VXLIB_accumulateSquareImage_exec(VXLIB_kernelHandle handle, void *restrict pIn, void *restrict pOut, uint32_t shift)
212 {
213  VXLIB_STATUS status;
214 
215 #if VXLIB_DEBUGPRINT
216  printf("VXLIB_DEBUGPRINT Enter VXLIB_accumulateSquareImage_exec\n");
217 #endif
218 
219  VXLIB_addSquare_PrivArgs *pKerPrivArgs = (VXLIB_addSquare_PrivArgs *) handle;
220 
221  status = pKerPrivArgs->execute(handle, pIn, pOut, pOut, shift);
222 
223  return status;
224 }
225 
226 void VXLIB_accumulateSquareImage_perfEst(VXLIB_kernelHandle handle, size_t *archCycles, size_t *estCycles)
227 {
228 
229  // typecast handle (void) to struct pointer type associated to kernel
230  VXLIB_addSquare_PrivArgs *pKerPrivArgs = (VXLIB_addSquare_PrivArgs *) handle;
231 
232  // obtain loop count for compute loop
233  size_t numBlocks = pKerPrivArgs->numBlocks;
234  size_t overheadCnt = 17; // profiled code before entering compute loop
235  *archCycles = 7 + numBlocks * 2; // obtained from asm
236  *estCycles = overheadCnt + *archCycles;
237 }
Header file for kernel's internal use. For the kernel's interface. Note: The VXLIB_accumulateSquareIm...
#define VXLIB_ACCUMULATESQUAREIMAGE_I8U_O16S
Macros that will be useful to check for datatype combinations.
template VXLIB_STATUS VXLIB_addSquare_init_ci< VXLIB_ADDSQUARE_DTYPE_I8U_I16S_O16S >(VXLIB_kernelHandle handle, const VXLIB_bufParams2D_t *bufParamsIn0, const VXLIB_bufParams2D_t *bufParamsIn1, const VXLIB_bufParams2D_t *bufParamsOut, const VXLIB_addSquare_InitArgs *pKerInitArgs)
template VXLIB_STATUS VXLIB_addSquare_exec_ci< VXLIB_ADDSQUARE_TYPENAME_I8U_I16S_O16S >(VXLIB_kernelHandle handle, void *restrict pIn0, void *restrict pIn1, void *restrict pOut, uint32_t shift)
template VXLIB_STATUS VXLIB_addSquare_exec_cn< VXLIB_ADDSQUARE_TYPENAME_I8U_I16S_O16S >(VXLIB_kernelHandle handle, void *restrict pIn0, void *restrict pIn1, void *restrict pOut, uint32_t shift)
void * VXLIB_kernelHandle
Handle type for VXLIB operations.
Definition: VXLIB_types.h:247
VXLIB_STATUS_NAME
The enumeration of all status codes.
Definition: VXLIB_types.h:220
@ VXLIB_ERR_INVALID_DIMENSION
Definition: VXLIB_types.h:225
@ VXLIB_ERR_NOT_EQUAL_WIDTH_STRIDE
Definition: VXLIB_types.h:228
@ VXLIB_ERR_NULL_POINTER
Definition: VXLIB_types.h:226
@ VXLIB_SUCCESS
Definition: VXLIB_types.h:221
@ VXLIB_ERR_INVALID_TYPE
Definition: VXLIB_types.h:224
@ VXLIB_FUNCTION_NATC
Definition: VXLIB_types.h:251
static int32_t VXLIB_sizeof(uint32_t type)
Inline function returns number of bytes per element given a type of VXLIB_data_type_e.
VXLIB_STATUS VXLIB_accumulateSquareImage_exec(VXLIB_kernelHandle handle, void *restrict pIn, void *restrict pOut, uint32_t shift)
This function is the main kernel compute function.
void VXLIB_accumulateSquareImage_perfEst(VXLIB_kernelHandle handle, size_t *archCycles, size_t *estCycles)
VXLIB_STATUS VXLIB_accumulateSquareImage_init(VXLIB_kernelHandle handle, VXLIB_bufParams2D_t *bufParamsIn, VXLIB_bufParams2D_t *bufParamsOut, const VXLIB_accumulateSquareImage_InitArgs *pKerInitArgs)
This function should be called before the VXLIB_accumulateSquareImage_exec function is called....
VXLIB_STATUS VXLIB_accumulateSquareImage_exec_checkParams(VXLIB_kernelHandle handle, const void *restrict pIn, const void *restrict pOut, const uint32_t shift)
This function checks the validity of the parameters passed to VXLIB_accumulateSquareImage_exec functi...
int32_t VXLIB_accumulateSquareImage_getHandleSize(VXLIB_accumulateSquareImage_InitArgs *pKerInitArgs)
This is a query function to calculate the size of internal handle.
VXLIB_STATUS VXLIB_accumulateSquareImage_init_checkParams(VXLIB_kernelHandle handle, const VXLIB_bufParams2D_t *bufParamsIn, const VXLIB_bufParams2D_t *bufParamsOut, const VXLIB_accumulateSquareImage_InitArgs *pKerInitArgs)
This function checks the validity of the parameters passed to VXLIB_accumulateSquareImage_init functi...
Structure containing the parameters to initialize the kernel.
int8_t funcStyle
Variant of the function, refer to VXLIB_FUNCTION_STYLE
Structure containing the parameters to initialize the kernel.
Structure that is reserved for internal use by the kernel.
pFxnVXLIB_addSquare_exec execute
Function pointer to point to the right execution variant between VXLIB_addSquare_exec_cn and VXLIB_ad...
size_t strideIn0Elements
Stride of input0 in elements.
VXLIB_addSquare_InitArgs pKerInitArgs
Initargs of the kernel.
size_t strideIn1Elements
Stride of input1 in elements.
size_t numBlocks
Number of blocks to be processed after simidfication.
size_t strideOutElements
Stride of output in elements.
size_t width
Width of image
size_t height
Height of image
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.
uint32_t data_type
Values are of type VXLIB_data_type_e.
int32_t stride_y
Stride in Y dimension in bytes.