Kernels are computation functions that form the fundamental building blocks of the data flow graph specifications. Kernels are declared as ordinary C/C++ functions that return void and can use special data types as arguments (discussed in Window and Streaming Data API). Each kernel should be defined in its own source file. This organization is recommended for reusable and faster compilation. Furthermore, the kernel source files should include all relevant header files to allow for independent compilation. It is recommended that a header file (kernels.h in this documentation) should declare the function prototypes for all kernels used in a graph. An example is shown below.
#ifndef _KERNELS_16B_H_
#define _KERNELS_16B_H_
#include <adf/stream/types.h>
#include <adf/window/types.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#define PARALLEL_FACTOR_16b 16 // Parallelization factor for 16b operations (16x mults)
#define SRS_SHIFT 10 // SRS shift used can be increased if input data likewise adjusted)
void filter2D(input_window_int16* input, const int16_t (&coeff)[16], output_window_int16* output);
#endif
Vitis Vision AIE library functions packaged with Vitis Vision AIE library are pre optimized vector implementations for various computer vision tasks. These functions can be directly included in user kernel (as shown in example below)
#include "imgproc/xf_filter2d_16b_aie.hpp"
#include "kernels.h"
void filter2D(input_window_int16* input, const int16_t (&coeff)[16], output_window_int16* output) {
xf::cv::aie::filter2D_k3_border(input, coeff, output);
};