Files
kunlun/export/inc/cnn/cnn_k3d.h
2024-09-28 14:24:04 +08:00

79 lines
3.7 KiB
C

/****************************************************************************
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
be copied by any method or incorporated into another program without
the express written consent of Aerospace C.Power. This Information or any portion
thereof remains the property of Aerospace C.Power. The Information contained herein
is believed to be accurate and Aerospace C.Power assumes no responsibility or
liability for its use in any way and conveys no license or title under
any patent or copyright and makes no representation or warranty that this
Information is free from patent or copyright infringement.
****************************************************************************/
#ifndef CNN_K3D_H
#define CNN_K3D_H
#include "os_types_api.h"
#ifdef __cplusplus
extern "C" {
#endif
/** \defgroup cnn k3d API
* @brief cnn k3d APIs
* These functions could be used for mid_filter or depth calculation
* The formular for depth calculation is as below, where x is the input image, Z is the output, f_x_ir, L and d0, whose units are all millimeter, are constant independent from x,
* Z = f_x_ir * L / (f_x_ir * L / d0 - x)
* CNN engine will be used in these functions, except for cpu_prelu_ddr, cpu_prelu_before_depth, cpu_prelu_before_point, cpu_prelu_iram.
* For any features, every column will occupy a size which is a multiple of 32 bytes. Here column means the last dimension of a tensor
* For example, if a tensor of type int16_t named A is of size 4 * 30 * 300, it will be saved in the memory of this form so that every column occupies 608 bytes:
* A[0][0][0], A[0][0][1], ..., A[0][0][299], 0, 0, 0, ..., 0, A[0][1][0], A[0][1][1], ..., A[0][1][299], 0, 0, 0, 0, ..., 0, ..., A[0][29][0], ..., A[0][29][299], 0, ..., 0, A[1][0][0], ...
*
*
*
*/
/** @addtogroup cnn_k3d_APIs
* @{
*/
enum cnn_k3d_driver_to_do {
mid_filter_only = 2,
mid_filter_and_depth = 3,
depth_only = 4
};
struct cnn_k3d_config_bean {
uint32_t input_addr; // where the input is put
uint32_t output_addr; // where the output will be put
uint16_t input_height; // height of input image
uint16_t input_width; // width of input image
uint16_t output_height; // height of output image, you don't need to set it, this will be set after calculation
uint16_t output_width; // width of output image, you don't need to set it, this will be set after calculation
uint16_t padding_to_same; // 1: use "SAME" mode for padding, 0: use "VALID" mode for padding, ref: tensorflow doc
enum cnn_k3d_driver_to_do to_do; // 2: middle filter only, 3: middle filter and depth calculation, 4: depth calculation only
uint8_t feature_signed; // non-zero: input are signed numbers, zero: input are unsigned numbers, only valid when to_do is not 4 cause input need to be signed when to_do is 4
uint8_t int8_mode; // non-zero: 8bit mode, zero: 16bit mode, only valid when to_do is 2
int16_t F_L_d0_mu; // the value of f_x_ir * L / d0 in the formular for depth calculation, this number should be in form of S(16, 4), i.e. int16_t, with fraction of 4bits
uint16_t F_L_mu; // the value of f_x_ir * L in the formular for depth calculation, this number should be in form of US(16, 1), i.e. uint16_t, with fraction of 1bits
};
/* @brief cnn_k3d_driver() - do a middle filter or depth calculation in 16bit mode, middle filter's kernel is 3
* @param config: config info of the pooling process
* @return 0 -- succeed
* @return 2 -- input height is 0
* @return 3 -- input width is 0
*/
uint8_t cnn_k3d_driver(struct cnn_k3d_config_bean *config);
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif