blob: 3a4af8299b07319a50ce93c745ea13f9cedabed9 [file]
/* Copyright Statement:
*
* This software/firmware and related documentation ("MediaTek Software") are
* protected under relevant copyright laws. The information contained herein
* is confidential and proprietary to MediaTek Inc. and/or its licensors.
* Without the prior written permission of MediaTek inc. and/or its licensors,
* any reproduction, modification, use or disclosure of MediaTek Software,
* and information contained herein, in whole or in part, shall be strictly
* prohibited.
*/
/* MediaTek Inc. (C) 2020. All rights reserved.
*
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY
* ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY
* THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK
* SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO
* RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN
* FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
* CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER
* WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
* ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER
* TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
*
* The following software/firmware and/or related documentation ("MediaTek
* Software") have been modified by MediaTek Inc. All revisions are subject to
* any receiver's applicable license agreements with MediaTek Inc.
*/
/**
* @file NeuronAdapter.h
*/
#pragma once
#ifdef __ANDROID__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wnullability-extension"
#include <android/hardware_buffer.h>
#pragma clang diagnostic pop
#endif
#include <stddef.h>
#include <stdint.h>
#include <sys/cdefs.h>
__BEGIN_DECLS
/**
* NeuronModel is an opaque type that contains a description of the mathematical
* operations that constitute the model.
*/
typedef struct NeuronModel NeuronModel;
/**
* NeuronCompilation is an opaque type that can be used to compile a machine
* learning model.
*/
typedef struct NeuronCompilation NeuronCompilation;
/**
* NeuronExecution is an opaque type that can be used to apply a machine
* learning model to a set of inputs.
*/
typedef struct NeuronExecution NeuronExecution;
/**
* NeuronDevice is an opaque type that represents a device.
*
* This type is used to query basic properties and supported operations of the
* corresponding device, and control which device(s) a model is to be run on.
*
* Available since 4.1.0
*/
typedef struct NeuronDevice NeuronDevice;
/**
* This type is used to represent shared memory, memory mapped files, and
* similar memories.
*
* It is the application's responsibility to ensure that there are no uses of
* the memory after calling NeuronMemory_free. This includes the execution which
* references this memory because of a call to
* NeuronExecution_setInputFromMemory or NeuronExecution_setOutputFromMemory.
*
* Available since 4.1.0
*/
typedef struct NeuronMemory NeuronMemory;
/**
* NeuronEvent is an opaque type that represents an event
* that will be signaled once an execution completes.
*
* Available since 5.0.0
*/
typedef struct NeuronEvent NeuronEvent;
/**
* Result codes.
*/
typedef enum {
NEURON_NO_ERROR = 0,
NEURON_OUT_OF_MEMORY = 1,
NEURON_INCOMPLETE = 2,
NEURON_UNEXPECTED_NULL = 3,
NEURON_BAD_DATA = 4,
NEURON_OP_FAILED = 5,
NEURON_UNMAPPABLE = 6,
NEURON_BAD_STATE = 7,
NEURON_BAD_VERSION = 8,
// Available since 5.0.0
NEURON_OUTPUT_INSUFFICIENT_SIZE = 9,
NEURON_UNAVAILABLE_DEVICE = 10,
NEURON_MISSED_DEADLINE_TRANSIENT = 11,
NEURON_MISSED_DEADLINE_PERSISTENT = 12,
NEURON_RESOURCE_EXHAUSTED_TRANSIENT = 13,
NEURON_RESOURCE_EXHAUSTED_PERSISTENT = 14,
NEURON_DEAD_OBJECT = 15,
} NeuronAdapterResultCode;
/**
* Operand values with size in bytes that are smaller or equal to this will be
* immediately copied into the model.
*/
enum { NEURON_MAX_SIZE_OF_IMMEDIATELY_COPIED_VALUES = 128 };
/**
* Size of the cache token, in bytes, required from the application.
*/
enum { NEURON_BYTE_SIZE_OF_CACHE_TOKEN = 32 };
/**
* Operand types.
* The type of operands that can be added to a model.
*
* Some notes on quantized tensors
*
* <p>NEURON_TENSOR_QUANT8_ASYMM
* <p>Attached to this tensor are two numbers that can be used to convert the 8
* bit integer to the real value and vice versa. These two numbers are:
* - scale: a 32 bit floating point value greater than zero.
* - zeroPoint: a 32 bit integer, in range [0, 255].
* <p>The formula is: real_value = (integer_value - zero_value) * scale.
*
* <p>NEURON_TENSOR_QUANT16_SYMM
* <p>Attached to this tensor is a number representing real value scale that is
* used to convert the 16 bit number to a real value in the following way:
* realValue = integerValue * scale. scale is a 32 bit floating point with value
* greater than zero.
*
* <p>NEURON_TENSOR_QUANT8_SYMM_PER_CHANNEL
* <p>This tensor is associated with additional fields that can be used to
* convert the 8 bit signed integer to the real value and vice versa. These
* fields are:
* - channelDim: a 32 bit unsigned integer indicating channel dimension.
* - scales: an array of positive 32 bit floating point values.
* <p>The size of the scales array must be equal to dimensions[channelDim].
* NeuronModel_setOperandSymmPerChannelQuantParams must be used to set the
* parameters for an Operand of this type. The channel dimension of this tensor
* must not be unknown (dimensions[channelDim] != 0). The formula is:
* realValue[..., C, ...] = integerValue[..., C, ...] * scales[C] where C is an
* index in the Channel dimension.
*
* <p>NEURON_TENSOR_QUANT16_ASYMM
* <p>Attached to this tensor are two numbers that can be used to convert the 16
* bit integer to the real value and vice versa. These two numbers are:
* - scale: a 32 bit floating point value greater than zero.
* - zeroPoint: a 32 bit integer, in range [0, 65535].
* <p>The formula is: real_value = (integer_value - zeroPoint) * scale.
*
* <p>NEURON_TENSOR_QUANT8_SYMM
* <p>Attached to this tensor is a number representing real value scale that is
* used to convert the 8 bit number to a real value in the following way:
* realValue = integerValue * scale. scale is a 32 bit floating point with value
* greater than zero.
*
* <p>NEURON_TENSOR_QUANT8_ASYMM_SIGNED
* <P>Attached to this tensor are two numbers that can be used to convert the 8
* bit integer to the real value and vice versa. These two numbers are:
* - scale: a 32 bit floating point value greater than zero.
* - zeroPoint: a 32 bit integer, in range [-128, 127].
* <p>The formula is: real_value = (integer_value - zeroPoint) * scale.
*/
enum {
/** A 32 bit floating point scalar value. */
NEURON_FLOAT32 = 0,
/** A signed 32 bit integer scalar value. */
NEURON_INT32 = 1,
/** An unsigned 32 bit integer scalar value. */
NEURON_UINT32 = 2,
/** A tensor of 32 bit floating point values. */
NEURON_TENSOR_FLOAT32 = 3,
/** A tensor of 32 bit integer values. */
NEURON_TENSOR_INT32 = 4,
/** A tensor of 8 bit integers that represent real numbers. */
NEURON_TENSOR_QUANT8_ASYMM = 5,
/** An 8 bit boolean scalar value. */
NEURON_BOOL = 6,
/** A tensor of 16 bit signed integers that represent real numbers. */
NEURON_TENSOR_QUANT16_SYMM = 7,
/** A tensor of IEEE 754 16 bit floating point values. */
NEURON_TENSOR_FLOAT16 = 8,
/** A tensor of 8 bit boolean values. */
NEURON_TENSOR_BOOL8 = 9,
/** An IEEE 754 16 bit floating point scalar value. */
NEURON_FLOAT16 = 10,
/** A tensor of 8 bit signed integers that represent real numbers. */
NEURON_TENSOR_QUANT8_SYMM_PER_CHANNEL = 11,
/** A tensor of 16 bit unsigned integers that represent real numbers. */
NEURON_TENSOR_QUANT16_ASYMM = 12,
/** A tensor of 8 bit signed integers that represent real numbers. */
NEURON_TENSOR_QUANT8_SYMM = 13,
/** A tensor of 8 bit signed integers that represent real numbers. */
NEURON_TENSOR_QUANT8_ASYMM_SIGNED = 14,
/** A reference to a model. */
NEURON_MODEL = 15,
/** Extended data type - tensor uint32 */
NEURON_EXT_TENSOR_UINT32 = 9001,
/** Extended data type -A tensor of 8 bit unsigned integers that represent
real numbers. */
NEURON_EXT_TENSOR_QUANT8_ASYMM_PER_CHANNEL = 9002,
/** Extended data type -A tensor of 4 bit unsigned integers that represent
real numbers. */
NEURON_EXT_TENSOR_QUANT4_ASYMM = 9003,
/** Extended data type -A tensor of 4 bit signed integers that represent real
numbers. */
NEURON_EXT_TENSOR_QUANT4_ASYMM_SIGNED = 9004,
/** Extended data type -A tensor of 4 bit signed integers that represent real
numbers. */
NEURON_EXT_TENSOR_QUANT4_SYMM = 9005,
/** Extended data type -A tensor of 16 bit signed integers that represent real
numbers. */
NEURON_EXT_TENSOR_QUANT16_ASYMM_SIGNED = 9006,
/** Extended data type -A raw tensor. */
NEURON_EXT_TENSOR_RAW = 9007,
/** Extended data type -A tensor of 8 bit signed integers that represent real
numbers. */
NEURON_EXT_TENSOR_QUANT8_ASYMM_SIGNED_PER_CHANNEL = 9008,
};
/**
* NeuronOperandType describes the type of an operand.
* This structure is used to describe both scalars and tensors.
*/
typedef struct NeuronOperandType {
/** The data type, e.g NEURON_INT8. */
int32_t type;
/** The number of dimensions. It should be 0 for scalars. */
uint32_t dimensionCount;
/** The dimensions of the tensor. It should be nullptr for scalars. */
const uint32_t* dimensions;
/**
* These two fields are only used for quantized tensors.
* They should be zero for scalars and non-fixed point tensors.
* The dequantized value of each entry is (value - zeroPoint) * scale.
*/
float scale;
/** Only used with scale for quantized tensors */
int32_t zeroPoint;
} NeuronOperandType;
/**
* Parameters for NEURON_TENSOR_QUANT8_SYMM_PER_CHANNEL operand.
*/
typedef struct NeuronSymmPerChannelQuantParams {
/** The index of the channel dimension. */
uint32_t channelDim;
/** The size of the scale array. Should be equal to dimension[channelDim] of
* the Operand. */
uint32_t scaleCount;
/** The array of scaling values for each channel. Each value must be greater
* than zero. */
const float* scales;
} NeuronSymmPerChannelQuantParams;
/**
* Parameters for NEURON_TENSOR_QUANT8_SYMM_PER_CHANNEL and
* NEURON_TENSOR_QUANT8_ASYMM_PER_CHANNEL operand.
*/
typedef struct NeuronPerChannelQuantParams {
/** The index of the channel dimension. */
uint32_t channelDim;
/** The size of the scale array. Should be equal to dimension[channelDim] of
* the Operand. */
uint32_t scaleCount;
/** The array of scaling values for each channel. Each value must be greater
* than zero. */
const float* scales;
/** The size of the zeroPoints. Should be equal to dimension[channelDim] of
* the Operand. */
uint32_t zeroPointCount;
/** The array of zero point values for each channel. */
const int32_t* zeroPoints;
} NeuronPerChannelQuantParams;
/**
* Operation Types
*
* Supported operations are listed with available versions. See
* Neuron_getVersion for querying version number.
*
* Attempting to compile models with operations marked as not available
* will get a compilation failure.
*
* Refer to the operation support status of each hardware platform.
* Attempting to compile models with operations supported by this library but
* not supported by the underlying hardware platform will get a compilation
* failure too.
*
* Compatible NNAPI levels are also listed.
*/
typedef enum {
NEURON_ADD = 0, ///< Available since 4.1.0. NNAPI level 30.
NEURON_AVERAGE_POOL_2D = 1, ///< Available since 4.1.0. NNAPI level 30.
NEURON_CONCATENATION = 2, ///< Available since 4.1.0. NNAPI level 30.
NEURON_CONV_2D = 3, ///< Available since 4.1.0. NNAPI level 30.
NEURON_DEPTHWISE_CONV_2D = 4, ///< Available since 4.1.0. NNAPI level 30.
NEURON_DEPTH_TO_SPACE = 5, ///< Available since 4.1.0. NNAPI level 30.
NEURON_DEQUANTIZE = 6, ///< Available since 4.1.0. NNAPI level 30.
NEURON_EMBEDDING_LOOKUP = 7, ///< Not available.
NEURON_FLOOR = 8, ///< Available since 4.1.0. NNAPI level 30.
NEURON_FULLY_CONNECTED = 9, ///< Available since 4.1.0. NNAPI level 30.
NEURON_HASHTABLE_LOOKUP = 10, ///< Not available.
NEURON_L2_NORMALIZATION = 11, ///< Available since 4.1.0. NNAPI level 30.
NEURON_L2_POOL_2D = 12, ///< Available since 4.1.0. NNAPI level 30.
NEURON_LOCAL_RESPONSE_NORMALIZATION = 13, ///< Not available.
NEURON_LOGISTIC = 14, ///< Available since 4.1.0. NNAPI level 30.
NEURON_LSH_PROJECTION = 15, ///< Not available.
NEURON_LSTM = 16, ///< Not available.
NEURON_MAX_POOL_2D = 17, ///< Available since 4.1.0. NNAPI level 30.
NEURON_MUL = 18, ///< Available since 4.1.0. NNAPI level 30.
NEURON_RELU = 19, ///< Available since 4.1.0. NNAPI level 30.
NEURON_RELU1 = 20, ///< Available since 4.1.0. NNAPI level 30.
NEURON_RELU6 = 21, ///< Available since 4.1.0. NNAPI level 30.
NEURON_RESHAPE = 22, ///< Available since 4.1.0. NNAPI level 30.
NEURON_RESIZE_BILINEAR = 23, ///< Available since 4.1.0. NNAPI level 30.
NEURON_RNN = 24, ///< Not available.
NEURON_SOFTMAX = 25, ///< Available since 4.1.0. NNAPI level 30.
NEURON_SPACE_TO_DEPTH = 26, ///< Available since 4.1.0. NNAPI level 30.
NEURON_SVDF = 27, ///< Not available.
NEURON_TANH = 28, ///< Available since 4.1.0. NNAPI level 30.
NEURON_BATCH_TO_SPACE_ND = 29, ///< Available since 4.1.0. NNAPI level 30.
NEURON_DIV = 30, ///< Available since 4.1.0. NNAPI level 30.
NEURON_MEAN = 31, ///< Available since 4.1.0. NNAPI level 30.
NEURON_PAD = 32, ///< Available since 4.1.0. NNAPI level 30.
NEURON_SPACE_TO_BATCH_ND = 33, ///< Available since 4.1.0. NNAPI level 30.
NEURON_SQUEEZE = 34, ///< Available since 4.1.0. NNAPI level 30.
NEURON_STRIDED_SLICE = 35, ///< Available since 4.1.0. NNAPI level 30.
NEURON_SUB = 36, ///< Available since 4.1.0. NNAPI level 30.
NEURON_TRANSPOSE = 37, ///< Available since 4.1.0. NNAPI level 30.
NEURON_ABS = 38, ///< Available since 4.1.0. NNAPI level 30.
NEURON_ARGMAX = 39, ///< Available since 4.1.0. NNAPI level 30.
NEURON_ARGMIN = 40, ///< Available since 4.1.0. NNAPI level 30.
NEURON_AXIS_ALIGNED_BBOX_TRANSFORM =
41, ///< Available since 4.1.0. NNAPI level 30.
NEURON_BIDIRECTIONAL_SEQUENCE_LSTM = 42, ///< Not available.
NEURON_BIDIRECTIONAL_SEQUENCE_RNN = 43, ///< Not available.
NEURON_BOX_WITH_NMS_LIMIT = 44, ///< Available since 4.1.0. NNAPI level 30.
NEURON_CAST = 45, ///< Available since 4.1.0. NNAPI level 30.
NEURON_CHANNEL_SHUFFLE = 46, ///< Available since 4.1.0. NNAPI level 30.
NEURON_DETECTION_POSTPROCESSING = 47, ///< Not available.
NEURON_EQUAL = 48, ///< Available since 4.1.0. NNAPI level 30.
NEURON_EXP = 49, ///< Available since 4.1.0. NNAPI level 30.
NEURON_EXPAND_DIMS = 50, ///< Available since 4.1.0. NNAPI level 30.
NEURON_GATHER = 51, ///< Available since 4.1.0. NNAPI level 30.
NEURON_GENERATE_PROPOSALS = 52, ///< Not available.
NEURON_GREATER = 53, ///< Available since 4.1.0. NNAPI level 30.
NEURON_GREATER_EQUAL = 54, ///< Available since 4.1.0. NNAPI level 30.
NEURON_GROUPED_CONV_2D = 55, ///< Available since 4.1.0. NNAPI level 30.
NEURON_HEATMAP_MAX_KEYPOINT = 56, ///< Available since 4.1.0. NNAPI level 30.
NEURON_INSTANCE_NORMALIZATION =
57, ///< Available since 4.1.0. NNAPI level 30.
NEURON_LESS = 58, ///< Available since 4.1.0. NNAPI level 30.
NEURON_LESS_EQUAL = 59, ///< Available since 4.1.0. NNAPI level 30.
NEURON_LOG = 60, ///< Not available.
NEURON_LOGICAL_AND = 61, ///< Available since 4.1.0. NNAPI level 30.
NEURON_LOGICAL_NOT = 62, ///< Available since 4.1.0. NNAPI level 30.
NEURON_LOGICAL_OR = 63, ///< Available since 4.1.0. NNAPI level 30.
NEURON_LOG_SOFTMAX = 64, ///< Not available.
NEURON_MAXIMUM = 65, ///< Available since 4.1.0. NNAPI level 30.
NEURON_MINIMUM = 66, ///< Available since 4.1.0. NNAPI level 30.
NEURON_NEG = 67, ///< Available since 4.1.0. NNAPI level 30.
NEURON_NOT_EQUAL = 68, ///< Available since 4.1.0. NNAPI level 30.
NEURON_PAD_V2 = 69, ///< Available since 4.1.0. NNAPI level 30.
NEURON_POW = 70, ///< Available since 4.1.0. NNAPI level 30.
NEURON_PRELU = 71, ///< Available since 4.1.0. NNAPI level 30.
NEURON_QUANTIZE = 72, ///< Available since 4.1.0. NNAPI level 30.
NEURON_QUANTIZED_16BIT_LSTM = 73, ///< Available since 4.1.0. NNAPI level 30.
NEURON_RANDOM_MULTINOMIAL = 74, ///< Not available.
NEURON_REDUCE_ALL = 75, ///< Available since 4.1.0. NNAPI level 30.
NEURON_REDUCE_ANY = 76, ///< Available since 4.1.0. NNAPI level 30.
NEURON_REDUCE_MAX = 77, ///< Available since 4.1.0. NNAPI level 30.
NEURON_REDUCE_MIN = 78, ///< Available since 4.1.0. NNAPI level 30.
NEURON_REDUCE_PROD = 79, ///< Not available.
NEURON_REDUCE_SUM = 80, ///< Available since 4.1.0. NNAPI level 30.
NEURON_ROI_ALIGN = 81, ///< Available since 4.1.0. NNAPI level 30.
NEURON_ROI_POOLING = 82, ///< Not available.
NEURON_RSQRT = 83, ///< Available since 4.1.0. NNAPI level 30.
NEURON_SELECT = 84, ///< Available since 4.1.0. NNAPI level 30.
NEURON_SIN = 85, ///< Not available.
NEURON_SLICE = 86, ///< Available since 4.1.0. NNAPI level 30.
NEURON_SPLIT = 87, ///< Available since 4.1.0. NNAPI level 30.
NEURON_SQRT = 88, ///< Available since 4.1.0. NNAPI level 30.
NEURON_TILE = 89, ///< Available since 4.1.0. NNAPI level 30.
NEURON_TOPK_V2 = 90, ///< Available since 4.1.0. NNAPI level 30.
NEURON_TRANSPOSE_CONV_2D = 91, ///< Available since 4.1.0. NNAPI level 30.
NEURON_UNIDIRECTIONAL_SEQUENCE_LSTM = 92, ///< Not available.
NEURON_UNIDIRECTIONAL_SEQUENCE_RNN = 93, ///< Not available.
NEURON_RESIZE_NEAREST_NEIGHBOR =
94, ///< Available since 4.1.0. NNAPI level 30.
NEURON_QUANTIZED_LSTM = 95, ///< Not available.
NEURON_IF = 96, ///< Available since 4.1.0. NNAPI level 30.
NEURON_WHILE = 97, ///< Available since 4.1.0. NNAPI level 30.
NEURON_ELU = 98, ///< Not available.
NEURON_HARD_SWISH = 99, ///< Available since 4.1.0. NNAPI level 30.
NEURON_FILL = 100, ///< Available since 4.1.0. NNAPI level 30.
NEURON_RANK = 101, ///< Not available.
NEURON_BATCH_MATMUL = 102, ///< Available since 5.1.2. NNAPI FL6.
NEURON_PACK = 103, ///< Not available.
NEURON_MIRROR_PAD = 104, ///< Not available.
NEURON_MIRROR_REVERSE = 105, ///< Not available.
/**
* Decompress HyFBC to YUV420 frame, support both YUV420_8BITS and
* YUV420_10BITS formats. HyFBC (Hybrid Frame Buffer Compression) is a
* compressed format used by video decoder (VDEC). This format uses YUV420 to
* compress.
*
* For input part, need to set two inputs with different shape, representing Y
* and UV plane respectively. The same HyFBC data will be used for both
* inputs. Similarly, the output part also needs to be set to two,
* representing Y and UV plane respectively.
*
* The shape of the two inputs/ outputs (inputY, inputUV, outputY, outputUV)
* depends on the original images' shape ([batches, height, width, channels]).
* Both height and width shold follow 64 alignment rule. For example, if
* original height is 480, its 64 alignment should be 512. For Y plane,
* channel size should be 1; for UV plane, channel size should be 2. Besides,
* the height and width of UV plane should be half of Y's height and width.
* Example:
*
* original_img.shape = [1, 384, 640, 3]
* inputY.shape = [1, 384, 640, 1]
* inputUV.shape = [1, 192, 320, 2]
* outputY.shape = [1, 384, 640, 1]
* outputUV.shape = [1, 192, 320, 2]
*
* Supported tensor {@link OperandCode}:
* * {@link NEURON_EXT_TENSOR_RAW} (for inputY, inputUV)
* * {@link NEURON_TENSOR_QUANT8_ASYMM} (for outputY, outputUV)
* * {@link NEURON_TENSOR_QUANT16_ASYMM} (for outputY, outputUV)
* Note:
* If image mode is YUV420_8BITS, use NEURON_TENSOR_QUANT8_ASYMM; if mode is
* YUV420_10BITS, use NEURON_TENSOR_QUANT16_ASYMM.
*
* Tensor rank: both input and output require rank 4, with "NHWC" data layout.
*
* Inputs:
* * 0: inputY, a 4-D {@link NEURON_EXT_TENSOR_RAW} tensor.
* * 1: inputUV, a 4-D {@link NEURON_EXT_TENSOR_RAW} tensor.
* * 2: YHeaderAlignment, an {@link NEURON_INT32} scalar, specifying
* the header alignment in Hyfbc format.
* * 3: UVHeaderAlignment, an {@link NEURON_INT32} scalar, specifying
* the header alignment in Hyfbc format.
* * 4: xAlign, an {@link NEURON_INT32} scalar, specifying the frame
* width alignment of video decoder.
* * 5: yAlign, an {@link NEURON_INT32} scalar, specifying the frame
* height alignment of video decoder.
* * 6: xOffset, an {@link NEURON_INT32} scalar, specifying the frame
* width offset of video decoder.
* * 7: yOffset, an {@link NEURON_INT32} scalar, specifying the frame
* height offset of video decoder.
* * 8: mode, an {@link NEURON_INT32} scalar. Set to 0 for
* YUV420_8BITS. Set to 1 for YUV420_10BITS. Note that 8b, 10b here means the
* compressed bit width in Hyfbc frame, where the decompressed YUV420 is 8b
* for Hyfbc_8b, and YUV420 is 16b for Hyfbc_10b.
* * 9: outPitchN, an {@link NEURON_INT32} scalar, specifying the
* YUV420 N-axis pitch. Must be set to 1, because only a single batch is
* supported for HyfbcDecompress.
* * 10: outPitchH, an {@link NEURON_INT32} scalar, specifying the
* YUV420 H-axis pitch. Set to the original compressed image height with video
* codec alignment.
* * 11: outPitchW, an {@link NEURON_INT32} scalar, specifying the
* YUV420 W-axis pitch. Set to the original compressed image width with video
* codec alignment.
* * 12: outPitchC, an {@link NEURON_INT32} scalar, specifying the
* YUV420 C-axis pitch. Set to 1 for interleaved YUV420.
*
* Outputs:
* * 0: output Y, a 4-D tensor. Tensor type can be either {@link
* NEURON_TENSOR_QUANT8_ASYMM} or {@link
* NEURON_TENSOR_QUANT16_ASYMM}, depends on YUV420 bit mode.
* * 1: output UV, a 4-D tensor. Tensor type can be either {@link
* NEURON_TENSOR_QUANT8_ASYMM} or {@link
* NEURON_TENSOR_QUANT16_ASYMM}, depends on YUV420 bit mode.
*
* Available since NeuroPilot 7.0.0.
*/
NEURON_HYFBCTOYUV420 = 106,
/**
* Compress YUV420 to AFBC frame, support both YUV420_8BITS and
* YUV420_10BITS formats. AFBC (Arm Frame Buffer Compression) is a lossless
* compressed image format, created by ARM to reduce the size of images.
*
* For input part, need to set two inputs with different shape, representing Y
* and UV plane respectively. For output part, need to set one output for
* AFBC.
*
* The shape of the two inputs (inputY, inputUV) and output (AFBC)
* depends on the original images' shape ([batches, height, width, channels]).
* Both height and width shold follow 64 alignment rule. For example, if
* original height is 480, its 64 alignment should be 512. For Y plane,
* channel size should be 1; for UV plane, channel size should be 2. Besides,
* the height and width of UV plane should be half of Y's height and width.
* For AFBC output, its height shoud be 3/2 of Y's height, and its width
* equals to Y's width. Example:
*
* original_img.shape = [1, 384, 640, 3]
* inputY.shape = [1, 384, 640, 1]
* inputUV.shape = [1, 192, 320, 2]
* output.shape = [1, 576, 640, 1]
*
* Supported tensor {@link OperandCode}:
* * {@link NEURON_EXT_TENSOR_RAW} (for output)
* * {@link NEURON_TENSOR_QUANT8_ASYMM} (for inputY, inputUV)
* * {@link NEURON_TENSOR_QUANT16_ASYMM} (for inputY, inputUV)
* Note:
* If image mode is YUV420_8BITS, use NEURON_TENSOR_QUANT8_ASYMM; if mode is
* YUV420_10BITS, use NEURON_TENSOR_QUANT16_ASYMM.
*
* Tensor rank: both input and output require rank 4, with "NHWC" data layout.
*
* Inputs:
* * 0: inputY, a 4-D tensor. Tensor type can be either {@link
* NEURON_TENSOR_QUANT8_ASYMM} or {@link
* NEURON_TENSOR_QUANT16_ASYMM}, depends on YUV420 bit mode.
* * 1: inputUV, a 4-D tensor. Tensor type can be either {@link
* NEURON_TENSOR_QUANT8_ASYMM} or {@link
* NEURON_TENSOR_QUANT16_ASYMM}, depends on YUV420 bit mode.
* * 2: HeaderAlignment, an {@link NEURON_INT32} scalar, specifying
* the header alignment in AFBC format.
* * 3: xAlign, an {@link NEURON_INT32} scalar, specifying the frame
* width alignment of AFBC format.
* * 4: yAlign, an {@link NEURON_INT32} scalar, specifying the frame
* height alignment of AFBC format.
* * 5: xOffset, an {@link NEURON_INT32} scalar, specifying the frame
* width offset of AFBC format.
* * 6: yOffset, an {@link NEURON_INT32} scalar, specifying the frame
* height offset of AFBC format.
* * 7: mode, an {@link NEURON_INT32} scalar. Set to 0 for
* YUV420_8BITS. Set to 1 for YUV420_10BITS. Note that 8b, 10b here means the
* compressed bit width in AFBC frame, where the YUV420 must be 8b for
* AFBC_8b, and must be 16b for AFBC_10b.
* * 8: inPitchN, an {@link NEURON_INT32} scalar, specifying the
* YUV420 N-axis pitch. Must be set to 1, because only a single batch is
* supported for AfbcCompress.
* * 9: inPitchH, an {@link NEURON_INT32} scalar, specifying the
* YUV420 H-axis pitch. Set to the expected compressed image height.
* * 10: inPitchW, an {@link NEURON_INT32} scalar, specifying the
* YUV420 W-axis pitch. Set to the expected compressed image height.
* * 11: inPitchC, an {@link NEURON_INT32} scalar, specifying the
* YUV420 C-axis pitch. Set to 1 for interleaved YUV420.
*
* Outputs:
* * 0: output, a 4-D {@link NEURON_EXT_TENSOR_RAW} tensor.
*
* Available since NeuroPilot 7.0.0.
*/
NEURON_YUV420TOAFBC = 107,
NEURON_NUMBER_OF_OPERATIONS,
} NeuronOperationType;
/**
* Fused activation function types.
*/
typedef enum {
// NO fused activation function.
NEURON_FUSED_NONE = 0,
// Fused ReLU activation function.
NEURON_FUSED_RELU = 1,
// Fused ReLU1 activation function.
NEURON_FUSED_RELU1 = 2,
// Fused ReLU6 activation function.
NEURON_FUSED_RELU6 = 3,
} NeuronAdapterFuseCode;
/**
* Implicit padding algorithms.
*/
typedef enum {
/**
* SAME padding.
* Padding on both ends are the "same":
* padding_to_beginning = total_padding / 2
* padding_to_end = (total_padding + 1)/2.
* i.e., for even number of padding, padding to both ends are exactly
* the same; for odd number of padding, padding to the ending is bigger
* than the padding to the beginning by 1.
*
* total_padding is a function of input, stride and filter size.
* It could be computed as follows:
* out_size = (input + stride - 1) / stride;
* needed_input = (out_size - 1) * stride + filter_size
* total_padding = max(0, needed_input - input_size)
* The computation is the same for the horizontal and vertical directions.
*/
NEURON_PADDING_SAME = 1,
/**
* VALID padding.
* No padding. When the input size is not evenly divisible by
* the filter size, the input at the end that could not fill
* the whole filter tile will simply be ignored.
*/
NEURON_PADDING_VALID = 2,
} NeuronAdapterPaddingCode;
/**
* Execution preferences.
*/
typedef enum {
/* Prefer executing in a way that minimizes battery drain. */
NEURON_PREFER_LOW_POWER = 0,
/* Prefer executing as fast as possible. (more power consumption)*/
NEURON_PREFER_FAST_SINGLE_ANSWER = 1,
/* Prefer maximizing the throughput of successive frames */
NEURON_PREFER_SUSTAINED_SPEED = 2,
/* Prefer executing with turbo boost. (most power consumption) */
NEURON_PREFER_TURBO_BOOST = 3,
} NeuronAdapterPreferenceCode;
/**
* Relative execution priority.
*/
typedef enum {
NEURON_PRIORITY_LOW = 90,
NEURON_PRIORITY_MEDIUM = 100,
NEURON_PRIORITY_HIGH = 110,
NEURON_PRIORITY_DEFAULT = NEURON_PRIORITY_MEDIUM,
} NeuronAdapterPriorityCode;
/**
* Compiler optimization hint.
*/
typedef enum {
/**
* Normal optimization.
* Available since 4.3.1
*/
NEURON_OPTIMIZATION_NORMAL = 0,
/**
* Reduce latency by utilizing as many APU cores as possible.
* Available since 4.3.1
*/
NEURON_OPTIMIZATION_LOW_LATENCY = 1 << 0,
/**
* Reducing DRAM access as more as possible.
* Available since 4.4.0
*/
NEURON_OPTIMIZATION_DEEP_FUSION = 1 << 1,
/**
* Reduce latency by using as many APU cores as possible in batch-dimension.
* (For models with batch > 1)
* Available since 4.4.0
*/
NEURON_OPTIMIZATION_BATCH_PROCESSING = 1 << 2,
/**
* Default optimization setting.
* Available since 4.3.1
*/
NEURON_OPTIMIZATION_DEFAULT = NEURON_OPTIMIZATION_NORMAL,
} OptimizationCode;
/**
* CPU cache flush hint.
*/
typedef enum {
/**
* Sync input buffer and invalidate output buffer.
* Available since 5.0.1
*/
NEURON_CACHE_FLUSH_ENABLE_ALL = 0,
/**
* Disable sync input buffer.
* Available since 5.0.1
*/
NEURON_CACHE_FLUSH_DISABLE_SYNC_INPUT = 1 << 0,
/**
* Disable invalidate output buffer.
* Available since 5.0.1
*/
NEURON_CACHE_FLUSH_DISABLE_INVALIDATE_OUTPUT = 1 << 1,
/**
* Default cache flush setting.
* Available since 5.0.1
*/
NEURON_CACHE_FLUSH_DEFAULT = NEURON_CACHE_FLUSH_ENABLE_ALL,
} CacheFlushCode;
/**
* Compilation Type.
*/
typedef enum {
/* Normal Compilation Available since 7.0.0 */
COMPILATION_TYPE_NORMAL = 0,
/* @deprecate */
COMPILATION_TYPE_DEBUG_PLUS = 1,
/* Batched Execution: Set input/output from memory every time.
* Available since 7.0.0
*/
COMPILATION_TYPE_BATCHED = 2,
/* One compilation with multi-executions could be created.
* Available since 7.0.0
*/
COMPILATION_TYPE_MULTI_EXECUTIONS = 3,
/* Batched Execution: Set input/output from memory 1st time and memcpy next
* time. Available since 7.0.1
*/
COMPILATION_TYPE_EXECUTION_CONTROLLER = 4,
} CompilationType;
/**
* Supported Feature
*/
typedef enum {
NEURON_FEATURE_NONE = 0,
NEURON_THROUGHPUT_MODE = 1,
} NeuronFeatureType;
/**
* The structure to represent the neuron version.
*/
typedef struct {
uint8_t major; ///< major version
uint8_t minor; ///< minor version
uint8_t patch; ///< patch version
} NeuronRuntimeVersion;
/**
* Get the version of Neuron runtime library.
*
* @param version the version of Neuron runtime library.
* @return NEURON_NO_ERROR
*/
int Neuron_getVersion(NeuronRuntimeVersion* version);
/**
* Get the supported status of feature.
*
* Available since 7.0.0
*
* @param type input feature @NeuronFeatureType to check supported or not
* @param supported return the supported status
* @return NEURON_NO_ERROR if successful.
*/
int Neuron_getFeatureSupportedStatus(NeuronFeatureType type, bool* supported);
/**
* Get the size of L1 memory in APU.
*
* Available since 4.3.0
*
* @param sizeKb L1 memory size in KB
* @return NEURON_NO_ERROR if successful.
*/
int Neuron_getL1MemorySizeKb(uint32_t* sizeKb);
/**
* Creates a shared memory object from a file descriptor.
*
* For ion descriptor, application should create the ion memory and descriptor
* first and then use it in this function.
*
* Available since 4.1.0 Only supports ion fd.
*
* @param size The requested size in bytes. Must not be larger than the file
* size.
* @protect The desired memory protection for the mapping. It is either
* PROT_NONE or the bitwise OR of one or more of the following flags: PROT_READ,
* PROT_WRITE.
* @fd The requested file descriptor. The file descriptor has to be mmap-able.
* @offset The offset to the beginning of the file of the area to map.
* @memory The memory object to be created. Set to NULL if unsuccessful.
*/
int NeuronMemory_createFromFd(
size_t size,
int protect,
int fd,
size_t offset,
NeuronMemory** memory);
#ifdef __ANDROID__
/**
* Creates a shared memory object from an AHardwareBuffer handle.
*
* We only support AHardwareBuffer with format AHARDWAREBUFFER_FORMAT_BLOB and
* it can only be used for Model inputs and outputs.
*
* The AHardwareBuffer with AHARDWAREBUFFER_FORMAT_BLOB format can be used the
* same way as shared memory created from a file handle. See NeuronMemory for
* description on how to use this shared memory.
*
* The provided AHardwareBuffer must outlive the NeuronMemory object.
*
* Available since 5.0.0
*
* @param ahwb The AHardwareBuffer handle.
* @param memory The memory object to be created.
* Set to NULL if unsuccessful.
*
* @return NEURON_NO_ERROR if the request completed normally.
*
*/
int NeuronMemory_createFromAHardwareBuffer(
const AHardwareBuffer* ahwb,
NeuronMemory** memory);
#else // __ANDROID__
/**
* Not supported at non-android platform
*
* @return NEURON_BAD_STATE
*/
int NeuronMemory_createFromAHardwareBuffer();
#endif
/**
* Delete a memory object.
*
* For ion memory, this function cleans up the internal resource associated with
* this memory. Applications should clean up the allocated ion memory after this
* function.
*
* Available since 4.1.0
*/
void NeuronMemory_free(NeuronMemory* memory);
/**
* Create an empty NeuronModel. The model should be constructed with calls to
* NeuronModel_addOperation and NeuronModel_addOperand.
*
* Available since 4.1.0
*
* @param model The NeuronModel to be created. Set to NULL if unsuccessful.
* @return NEURON_NO_ERROR if successful.
*/
int NeuronModel_create(NeuronModel** model);
/**
* Destroy a model. The model need not have been finished by a call to
* NeuronModel_finish.
*
* Available since 4.1.0
*
* @param model The model to be destroyed.
*/
void NeuronModel_free(NeuronModel* model);
/**
* Indicate that we have finished modifying a model. Required before calling
* NeuronCompilation_compile.
*
* Available since 4.1.0
*
* @param model The model to be finished.
* @return NEURON_NO_ERROR if successful.
*/
int NeuronModel_finish(NeuronModel* model);
/**
* Add an operand to a model. The order in which the operands are added is
* important. The first one added to a model will have the index value 0, the
* second 1, etc. These indexes are used as operand identifiers in
* NeuronModel_addOperation.
*
* Available since 4.1.0
*
* @param model The model to be modified.
* @param type The NeuronOperandType that describes the shape of the operand.
* Neither the NeuronOperandType nor the dimensions it points to need to outlive
* the call to NeuronModel_addOperand.
* @return NEURON_NO_ERROR if successful.
*/
int NeuronModel_addOperand(NeuronModel* model, const NeuronOperandType* type);
/**
* Sets an operand to a constant value.
* Values of length smaller or equal to
* NEURON_MAX_SIZE_OF_IMMEDIATELY_COPIED_VALUES are immediately copied into the
* model. For values of length greater than
* NEURON_MAX_SIZE_OF_IMMEDIATELY_COPIED_VALUES, a pointer to the buffer is
* stored within the model. The application must not change the content of this
* region until all executions using this model have completed. As the data may
* be copied during processing, modifying the data after this call yields
* undefined results.
*
* Attempting to modify a model once NeuronModel_finish has been called will
* return an error.
*
* A special notice on the buffer lifetime when the length is greater than
* NEURON_MAX_SIZE_OF_IMMEDIATELY_COPIED_VALUES. The provided buffer must
* outlive the compilation of this model. I.e. user must keep the buffer
* unchanged until NeuronCompilation_finish of this model. This is an internal
* optimization comparing to NNAPI. In NNAPI, NN runtime will copy the buffer to
* a shared memory between NN runtime and NNAPI HIDL service during
* ANNModel_finish, and it will be copied again to the compiled result during
* ANNCompilation_finish. In Neuron Adapter, there will be only one copying
* during NeuronCompilaiton_finish, so it is required to keep the buffer alive
* until NeuronCompilaiton_finish returned.
*
* Available since 4.1.0
*
* @param model The model to be modified.
* @param index The index of the model operand we're setting.
* @param buffer A pointer to the data to use.
* @param length The size in bytes of the data value.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronModel_setOperandValue(
NeuronModel* model,
int32_t index,
const void* buffer,
size_t length);
/**
* Sets an operand to a value that is a reference to another NeuronModel.
*
* The referenced model must already have been finished by a call to
* NeuronModel_finish.
*
* The NeuronModel_relaxComputationFloat32toFloat16 setting of referenced models
* is overridden by that setting of the main model of a compilation.
*
* The referenced model must outlive the model referring to it.
*
* Attempting to modify a model once NeuronModel_finish has been called will
* return an error.
*
* Available since 4.1.0
*
* @param model The model to be modified.
* @param index The index of the model operand we're setting.
* @param value The model to be referenced.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronModel_setOperandValueFromModel(
NeuronModel* model,
int32_t index,
const NeuronModel* value);
/**
* Sets an operand's per channel quantization parameters
* Sets parameters required by a tensor of type
* NEURON_TENSOR_QUANT8_SYMM_PER_CHANNEL This function must be called for every
* tensor of type NEURON_TENSOR_QUANT8_SYMM_PER_CHANNEL before calling
* NeuronModel_finish
*
* Available since 4.1.0
*
* @param model The model to be modified.
* @param index The index of the model operand we're setting.
* @param channelQuant The per channel quantization parameters for the operand.
* No memory in this struct needs to outlive the call to this function.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronModel_setOperandSymmPerChannelQuantParams(
NeuronModel* model,
int32_t index,
const NeuronSymmPerChannelQuantParams* channelQuant);
/**
* Sets an operand's per channel quantization parameters
* Sets parameters required by a tensor of type
* NEURON_TENSOR_QUANT8_SYMM_PER_CHANNEL or
* NEURON_TENSOR_QUANT8_ASYMM_PER_CHANNEL.
* This function must be called for every tensor of type
* NEURON_TENSOR_QUANT8_SYMM_PER_CHANNEL or
* NEURON_TENSOR_QUANT8_ASYMM_PER_CHANNEL before calling NeuronModel_finish.
*
* Available since 6.0.0
*
* @param model The model to be modified.
* @param index The index of the model operand we're setting.
* @param channelQuant The per channel quantization parameters(include
* per-channel offset) for the operand. No memory in this struct needs to
* outlive the call to this function.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronModel_setOperandPerChannelQuantParams(
NeuronModel* model,
int32_t index,
const NeuronPerChannelQuantParams* channelQuant);
/**
* Add an operation to a model.
* The operands specified by inputs and outputs must have been previously added
* by calls to NeuronModel_addOperand.
*
* Available since 4.1.0
*
* @param model The model to be modified.
* @param type The NeuronOperationType of the operation.
* @param inputCount The number of entries in the inputs array.
* @param inputs An array of indexes identifying each operand.
* @param outputCount The number of entries in the outputs array.
* @param outputs An array of indexes identifying each operand.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronModel_addOperation(
NeuronModel* model,
NeuronOperationType type,
uint32_t inputCount,
const uint32_t* inputs,
uint32_t outputCount,
const uint32_t* outputs);
/**
* Add an operation extension to a model.
* The operands specified by inputs and outputs must have been previously added
* by calls to NeuronModel_addOperand. User needs to specify the operation
* extension name and the desired device which will execute the operation
* extension.
*
* Available since 4.1.0
*
* @param model The model to be modified.
* @param name The name of the operation extension.
* @param vendor The name of the vendor which will implement the operation
* extension.
* @param device The device which will execute the operation extension.
* @param inputCount The number of entries in the inputs array.
* @param inputs An array of indexes identifying each operand.
* @param outputCount The number of entries in the outputs array.
* @param outputs An array of indexes identifying each operand.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronModel_addOperationExtension(
NeuronModel* model,
const char* name,
const char* vendor,
const NeuronDevice* device,
uint32_t inputCount,
const uint32_t* inputs,
uint32_t outputCount,
const uint32_t* outputs);
/**
* Specfifies which operands will be the model's inputs and outputs.
* An operand cannot be used for both input and output. Doing so will return an
* error.
*
* The operands specified by inputs and outputs must have been
* previously added by calls to NeuronModel_addOperand.
*
* Attempting to modify a model once NeuronModel_finish has been
* called will return an error.
*
* Available since 4.1.0
*
* @param model The model to be modified.
* @param inputCount The number of entries in the inputs array.
* @param inputs An array of indexes identifying the input operands.
* @param outputCount The number of entries in the outputs array.
* @param outputs An array of indexes identifying the output operands.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronModel_identifyInputsAndOutputs(
NeuronModel* model,
uint32_t inputCount,
const uint32_t* inputs,
uint32_t outputCount,
const uint32_t* outputs);
/**
* Gets the supported operations in a model.
* This function must be called after calling NeuronModel_finish
*
* Available since 4.1.0
*
* @param model The model to be queried.
* @param supported The boolean array to be filled. True means supported. The
* size of the boolean array must be at least as large as the number of
* operations in the model. The order of elements in the supported array matches
* the order in which the corresponding operations were added to the model.
* @param operationCount number of operations in the model
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronModel_getSupportedOperations(
NeuronModel* model,
bool* supported,
uint32_t operationCount);
/**
* Get the supported operations for a specified set of devices.
* If multiple devices are selected, the supported operation list is a union of
* supported operations of all selected devices.
*
* Available since 4.1.0
*
* @param model The model to be queried.
* @param devices Selected devices
* @param numDevices Number of selected devices
* @param supportedOps The boolean array to be filled. True means supported. The
* size of the boolean array must be as least as large as the number of
* operations in the model. The order of elements in the supportedOps array
* matches the order in which the corresponding operations were added to the
* model.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronModel_getSupportedOperationsForDevices(
const NeuronModel* model,
const NeuronDevice* const* devices,
uint32_t numDevices,
bool* supportedOps);
/**
* Specifies whether NEURON_TENSOR_FLOAT32 is allowed to be calculated with
* range and/or precision as low as that of the IEEE 754 16-bit floating-point
* format. By default, NEURON_TENSOR_FLOAT32 must be calculated using at least
* the range and precision of the IEEE 754 32-bit floating-point format.
*
* Available since 4.1.0
*
* @param model The model to be modified.
* @param allow 'true' indicates NEURON_TENSOR_FLOAT32 may be calculated with
* range and/or precision as low as that of the IEEE 754 16-bit floating point
* format. 'false' indicates NEURON_TENSOR_FLOAT32 must be calculated using at
* least the range and precision of the IEEE 754 32-bit floating point format.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronModel_relaxComputationFloat32toFloat16(
NeuronModel* model,
bool allow);
/**
* Hint compiler to suppress the input data conversion, the users have to
* convert the input data into platform-expected format before inference.
*
* Available since 4.2.0
*
* @param model The model to be modified.
* @param suppress True to suppress the input data conversion.
* @return NEURON_NO_ERROR if successful.
*/
int NeuronModel_suppressInputConversion(NeuronModel* model, bool suppress);
/**
* Hint compiler to suppress the output data conversion, the users have to
* convert the output data from platform-generated format before inference.
*
* Available since 4.2.0
*
* @param model The model to be modified.
* @param suppress True to suppress the output data conversion.
* @return NEURON_NO_ERROR if successful.
*/
int NeuronModel_suppressOutputConversion(NeuronModel* model, bool suppress);
/**
* Restore the compiled network using user provided buffer.
*
* The restored NeuronCompilaton could be used in creating executing instance.
* The restored NeuronModel cannot be recompiled.
*
* Available since 4.3.0
*
* @param model Restored model.
* @param compilation Restored compilation
* @param buffer User provided buffer to restore the compiled network.
* @param size Size of the user provided buffer in bytes.
* @return NEURON_NO_ERROR if compiled network is successfully copied to the
* user allocated buffer. NEURON_BAD_DATA if it fails to load the compiled
* network, this could either be the version is not matched or the data is
* corrupted.
*/
int NeuronModel_restoreFromCompiledNetwork(
NeuronModel** model,
NeuronCompilation** compilation,
const void* buffer,
const size_t size);
/**
* Restore the compiled network using user provided buffer.
* Support multiple compilation type; choices are: COMPILATION_TYPE_BATCHED,
* COMPILATION_TYPE_EXECUTION_CONTROLLER, COMPILATION_TYPE_EXECUTION_CONTROLLER,
* and COMPILATION_TYPE_NORMAL.
*
* There are two ways to use Batched Compilation:
* 1) load from DLA.
* 2) create batched compilation directly.
* To load DLA, one should call NeuronCompilation_create and
* NeuronModel_restoreFromCompiledNetworkV2. To create directly, one should call
* NeuronCompilation_createForBatch.
*
* The restored NeuronCompilaton could be used in creating executing instance.
* The restored NeuronModel cannot be recompiled.
*
* Available since 7.0.0
*
* @param model Restored model.
* @param compilation Restored compilation
* @param buffer User provided buffer to restore the compiled network.
* @param size Size of the user provided buffer in bytes.
* @param type Type of the compilation needed to be restored.
* @return NEURON_NO_ERROR if compiled network is successfully copied to the
* user allocated buffer. NEURON_BAD_DATA if it fails to load the compiled
* network, this could either be the version is not matched or the data is
* corrupted.
*/
int NeuronModel_restoreFromCompiledNetworkV2(
NeuronModel** model,
NeuronCompilation** compilation,
const void* buffer,
const size_t size,
const CompilationType& type);
/**
* Set a string into model that can be used for recognition for user.
* It's only used for debug, the string can be dumped into log and make users
* check the model behavior easily.
*
* Available since 7.0.0
*
* @param model The model to be modified.
* @param name The string, user can free buffer 'name' after calling this API.
* @return NEURON_NO_ERROR if the string is set success. NEURON_UNEXPECTED_NULL
* if the input param is nullptr.
*/
int NeuronModel_setName(NeuronModel* model, const char* name);
/**
* Create a NeuronCompilation to compile the given model.
*
* This function only creates the object. Compilation is only performed once
* NeuronCompilation_finish is invoked. NeuronCompilation_finish should be
* called once all desired properties have been set on the compilation.
* NeuronModel_free should be called once the compilation is no longer needed.
* The provided model must outlive the compilation. The model must already have
* been finished by a call to NeuronModel_finish.
*
* Available since 4.1.0
*
* @param model The NeuronModel to be compiled.
* @param compilation The newly created object or NULL if unsuccessful.
*
* @return NEURON_NO_ERROR if successful
*/
int NeuronCompilation_create(
NeuronModel* model,
NeuronCompilation** compilation);
/**
* Create a NeuronCompilation with different purpose to compile the given model.
*
* This function only creates the object. Compilation is only performed once
* NeuronCompilation_finish is invoked. NeuronCompilation_finish should be
* called once all desired properties have been set on the compilation.
* NeuronModel_free should be called once the compilation is no longer needed.
* The provided model must outlive the compilation. The model must already have
* been finished by a call to NeuronModel_finish.
*
* Available since 7.0.1
*
* @param model The NeuronModel to be compiled.
* @param type Type of the compilation needed to be created.
* @param options The options which used to create with compilation.
* @param compilation The newly created object or NULL if unsuccessful.
*
* @return NEURON_NO_ERROR if successful
*/
int NeuronCompilation_createV2(
NeuronModel* model,
CompilationType type,
const char* options,
NeuronCompilation** compilation);
/**
* Destroy a compilation.
*
* Available since 4.1.0
*
* @param compilation The compilation to be destroyed.
*/
void NeuronCompilation_free(NeuronCompilation* compilation);
/**
* Compilation is finished once NeuronCompilation_finish is invoked. Required
* before calling NeuronExecution_create. This function must only be called once
* for a given compilation.
*
* Available since 4.1.0
*
* @param compilation The compilation to be finished.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronCompilation_finish(NeuronCompilation* compilation);
/**
* Gets the supported operations in a model with specific optimized configures.
* This function must be called before calling NeuronCompilation_finish.
*
* Available since 7.0.0
*
* @param compilation The compilation to be queried.
* @param operationCount number of operations in the model
* @param supported The boolean array to be filled. True means supported. The
* size of the boolean array must be at least as large as the number of
* operations in the model. The order of elements in the supported array matches
* the order in which the corresponding operations were added to the model.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronCompilation_getSupportedOperations(
NeuronCompilation* compilation,
uint32_t operationCount,
bool* supported);
/**
* Provides optional caching information for faster re-compilation.
*
* Available since 4.1.0
*
* @param compilation The compilation to be cached.
* @param cacheDir The cache directory for storing and retrieving caching data.
* The user should choose a directory local to the application, and is
* responsible for managing the cache entries.
* @param token The token provided by the user to specify a model must be of
* length NEURON_BYTE_SIZE_OF_CACHE_TOKEN. The user should ensure that the token
* is unique to a model within the application. Neuron cannot detect token
* collisions; a collision will result in a failed execution or in a successful
* execution that produces incorrect output values.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronCompilation_setCaching(
NeuronCompilation* compilation,
const char* cacheDir,
const uint8_t* token);
/**
* Hint compiler with the size of L1 memory, this value should not be larger
* than real platform's settings. The user can get the platform's L1 memory size
* in KB by calling Neuron_getL1MemorySizeKb.
*
* Available since 4.3.0
*
* @param compilation The compilation to be modified.
* @param sizeKb L1 memory size in KB.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronCompilation_setL1MemorySizeKb(
NeuronCompilation* compilation,
uint32_t sizeKb);
/**
* Create a NeuronCompilation to compile the given model for a specified set of
* devices. The user must handle all compilation and execution failures from the
* specified set of devices. This is in contrast to a use of
* NeuronCompilation_create, where neuron will attempt to recover from such
* failures.
*
* Available since 4.1.0
*
* @param model The NeuronModel to be compiled.
* @param devices The set of devices. Must not contain duplicates.
* @param numDevices The number of devices in the set.
* @param compilation The newly created object or NULL if unsuccessful.
*
* @return NEURON_NO_ERROR if successful, NEURON_BAD_DATA if the model is
* invalid.
*/
int NeuronCompilation_createForDevices(
NeuronModel* model,
const NeuronDevice* const* devices,
uint32_t numDevices,
NeuronCompilation** compilation);
/**
* Create a NeuronCompilation. Which can divide one graph into several subgraph
* and use the information to debug.
*
* Only be used in debug purpose, no guarantees performance and thread safe.
*
* Available since 5.0.0
*
* @param model The NeuronModel to be compiled.
* @param compilation The newly created object or NULL if unsuccessful.
*
* @return NEURON_NO_ERROR if successful, NEURON_BAD_DATA if the model is
* invalid.
*/
int NeuronCompilation_createForDebug(
NeuronModel* model,
NeuronCompilation** compilation);
/**
* Sets the execution preference associated with this compilation.
*
* Default value of preference is PREFER_SINGLE_FAST_ANSWER
*
* Available since 4.1.0
*
* @param compilation The compilation to be modified.
* @param preference Either NEURON_PREFER_LOW_POWER,
* NEURON_PREFER_SINGLE_FAST_ANSWER, or NEURON_PREFER_SUSTAINED_SPEED.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronCompilation_setPreference(
NeuronCompilation* compilation,
int32_t preference);
/**
* Sets the execution priority associated with this compilation.
*
* Execution priorities are relative to other executions created by the same
* application (specifically same uid) for the same device. Specifically,
* priorities of executions from one application will not affect executions from
* another application.
*
* Higher priority executions may use more compute resources than lower priority
* executions, and may preempt or starve lower priority executions.
*
* Available since 4.1.0
*
* @param compilation The compilation to be modified.
* @param priority The relative priority of the execution compared to other
* executions created by the application. Must be one of NEURON_PRIORITY_*.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronCompilation_setPriority(NeuronCompilation* compilation, int priority);
/**
* Get the padded dimensional information of the specified input operand of the
* compilation. This function must be called after calling
* NeuronCompilation_finish. If NeuronModel_suppressInputConversion was not
* applied to the model to be compiled, the returned dimensions are the padded
* dimension after NeuronCompilation_finish to satisfy the optimization
* requirement from the underlying hardware accelerators.
* If NeuronModel_suppressInputConversion was applied to the model to be
* compiled, the returned dimensions are the same as the original dimensions
* given from user.
*
* Available since 4.2.0
*
* @param compilation The compilation to be queried.
* @param index The index of the input operand we are querying. It is an index
* into the lists passed to NeuronModel_identifyInputsAndOutputs. It is not the
* index associated with NeuronModel_addOperand.
* @param dimensions The dimension array to be filled. The size of the array
* must be exactly as large as the rank of the input operand to be queried in
* the model.
* @return NEURON_NO_ERROR if successful.
*/
int NeuronCompilation_getInputPaddedDimensions(
NeuronCompilation* compilation,
int32_t index,
uint32_t* dimensions);
/**
* Get the padded dimensional information of the specified output operand of the
* compilation. This function must be called after calling
* NeuronCompilation_finish. If NeuronModel_suppressOutputConversion was not
* applied to the model to be compiled, the returned dimensions are the padded
* dimension after NeuronCompilation_finish to satisfy the optimization
* requirement from the underlying hardware accelerators.
* If NeuronModel_suppressOutputConversion was applied to the model to be
* compiled, the returned dimensions are the same as the original dimensions
* given from user.
*
* Available since 4.2.0
*
* @param compilation The compilation to be queried.
* @param index The index of the output operand we are querying. It is an index
* into the lists passed to NeuronModel_identifyInputsAndOutputs. It is not the
* index associated with NeuronModel_addOperand.
* @param dimensions The dimension array to be filled. The size of the array
* must be exactly as large as the rank of the output operand to be queried in
* the model.
* @return NEURON_NO_ERROR if successful.
*/
int NeuronCompilation_getOutputPaddedDimensions(
NeuronCompilation* compilation,
int32_t index,
uint32_t* dimensions);
/**
* Get the expected buffer size (bytes) of the specified input operand of the
* compilation. If NeuronModel_suppressInputConversion was not applied to the
* model to be compiled, the returned size are the padded size after
* NeuronCompilation_finish to satisfy the optimization requirement from the
* underlying hardware accelerators. If NeuronModel_suppressInputConversion was
* applied to the model to be compiled, the returned size are the same as the
* original size given from user.
*
* Available since 4.2.0
*
* @param compilation The compilation to be queried.
* @param index The index of the input operand we are querying. It is an index
* into the lists passed to NeuronModel_identifyInputsAndOutputs. It is not the
* index associated with NeuronModel_addOperand.
* @param size the expected buffer size in bytes.
* @return NEURON_NO_ERROR if successful.
*/
int NeuronCompilation_getInputPaddedSize(
NeuronCompilation* compilation,
int32_t index,
size_t* size);
/**
* Get the expected buffer size (bytes) of the specified output operand of the
* compilation. If NeuronModel_suppressOutputConversion was not applied to the
* model to be compiled, the returned size are the padded size after
* NeuronCompilation_finish to satisfy the optimization requirement from the
* underlying hardware accelerators. If NeuronModel_suppressOutputConversion was
* applied to the model to be compiled, the returned size are the same as the
* original size given from user.
*
* Available since 4.2.0
*
* @param compilation The compilation to be queried.
* @param index The index of the output operand we are querying. It is an index
* into the lists passed to NeuronModel_identifyInputsAndOutputs. It is not the
* index associated with NeuronModel_addOperand.
* @param size the expected buffer size in bytes.
* @return NEURON_NO_ERROR if successful.
*/
int NeuronCompilation_getOutputPaddedSize(
NeuronCompilation* compilation,
int32_t index,
size_t* size);
/**
* Get the compiled network size of the compilation.
*
* This must be called after NeuronCompilation_finished and before
* NeuronExecution_create. It is not allowed to call this with a compilation
* restored from cache.
*
* Available since 4.3.0
*
* @param compilation The compilation to be queried.
* @param size The compiled network size in bytes.
* @return NEURON_NO_ERROR if successful.
*/
int NeuronCompilation_getCompiledNetworkSize(
NeuronCompilation* compilation,
size_t* size);
/**
* Store the compiled network.
*
* Users have to allocate the buffer with the specified size before calling this
* function.
*
* This must be called after NeuronCompilation_finished and before
* NeuronExecution_create. It is not allowed to call this with a compilation
* restored from cache.
*
* Available since 4.3.0
*
* @param compilation The compilation to be queried.
* @param buffer User allocated buffer to store the compiled network.
* @param size Size of the user allocated buffer in bytes.
* @return NEURON_NO_ERROR if compiled network is successfully copied to the
* user allocated buffer.
*/
int NeuronCompilation_storeCompiledNetwork(
NeuronCompilation* compilation,
void* buffer,
const size_t size);
/**
* Hint the compiler to apply the optimization strategy according to the user
* specified parameters.
*
* Available since 4.3.0
*
* @param compilation The compilation to be modified.
* @param optimizationCode User specified optimization strategy. Must be one of
* NEURON_OPTIMIZATION_* or the inclusive OR value of multiple
* NEURON_OPTIMIZATION_*.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronCompilation_setOptimizationHint(
NeuronCompilation* compilation,
uint32_t optimizationCode);
/**
* Hint the compiler to apply the optimization strategy according to the user
* specified arguments in a null-terminated string.
*
* Available since 4.6.0
*
* @param compilation The compilation to be modified.
* @param optimizationString A null-terminated string to represent the user
* specified optimization strategy.
* @return NEURON_NO_ERROR if successful.
*/
int NeuronCompilation_setOptimizationString(
NeuronCompilation* compilation,
const char* optimizationString);
/**
* Only allow users' optimization string(from
* NeuronCompilation_setOptimizationString), the system won't set any compiler
* options for them.
*
* Available since 6.0.5
*
* @param compilation The compilation to be modified.
* @param allow Allow only use user's setting or not.
* strategy.
* @return NEURON_NO_ERROR if successful.
*/
int NeuronCompilation_setOnlyAllowOptimizationString(
NeuronCompilation* compilation,
bool allow);
/**
* Get the compiler hints which are used to apply the optimization strategy
* according to the user specified arguments in a null-terminated string.
*
* Available since 6.0.5
*
* @param compilation The compilation to be modified.
* @param optimizationString A null-terminated string to represent the user
* specified optimization strategy.
* @return NEURON_NO_ERROR if successful.
*/
int NeuronCompilation_getOptimizationString(
NeuronCompilation* compilation,
const char** optimizationString);
/**
* Hint compiler to trim the model IO alignment.
*
* Available since 4.4.8
*
* @param compilation The compilation to be modified.
* @param enable 'true' for trimming model IO alignment.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronCompilation_setTrimIOAlignment(
NeuronCompilation* compilation,
bool enable);
/**
* Hint compiler to use software dilated convolution
*
* Available since 4.4.8
*
* @param compilation The compilation to be modified.
* @param enable 'true' indicates a hint to compiler to use software dilated
* convolution
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronCompilation_setSWDilatedConv(
NeuronCompilation* compilation,
bool enable);
/**
* Create a new execution instance by calling the NeuronExecution_create
* function. The provided compilation must outlive the execution.
*
* Available since 4.1.0
*
* @param compilation The NeuronCompilation to be evaluated.
* @param execution The newly created object or NULL if unsuccessful.
*
* @return NEURON_NO_ERROR if successful
*/
int NeuronExecution_create(
NeuronCompilation* compilation,
NeuronExecution** execution);
/**
* Destroy an execution.
*
* Available since 4.1.0
*
* @param execution The execution to be destroyed.
*/
void NeuronExecution_free(NeuronExecution* execution);
/**
* Associate a user buffer with an input of the model of the NeuronExecution.
* The provided buffer must outlive the execution.
*
* Available since 4.1.0
*
* @param execution The execution to be modified.
* @param index The index of the input argument we are setting. It is an index
* into the lists passed to NeuronModel_identifyInputsAndOutputs. It is not the
* index associated with NeuronModel_addOperand.
* @param type The NeuronOperandType of the operand. Currently NeuronAdapter
* only takes NULL.
* @param buffer The buffer containing the data.
* @param length The length in bytes of the buffer.
*
* @return NEURON_NO_ERROR if successful, NEURON_BAD_DATA if the name is not
* recognized or the buffer is too small for the input.
*/
int NeuronExecution_setInput(
NeuronExecution* execution,
int32_t index,
const NeuronOperandType* type,
const void* buffer,
size_t length);
/**
* Associate a user buffer with an output of the model of the NeuronExecution.
* The provided buffer must outlive the execution.
*
* Available since 4.1.0
*
* @param execution The execution to be modified.
* @param index The index of the output argument we are setting. It is an index
* into the lists passed to NeuronModel_identifyInputsAndOutputs. It is not the
* index associated with NeuronModel_addOperand.
* @param type The NeuronOperandType of the operand. Currently NeuronAdapter
* only takes NULL.
* @param buffer The buffer where the data is to be written.
* @param length The length in bytes of the buffer.
*
* @return NEURON_NO_ERROR if successful, NEURON_BAD_DATA if the name is not
* recognized or the buffer is too small for the output.
*/
int NeuronExecution_setOutput(
NeuronExecution* execution,
int32_t index,
const NeuronOperandType* type,
void* buffer,
size_t length);
/**
* Associate part of a memory object with an input of the model of the
* NeuronExecution.
*
* The provided memory must outlive the execution and should not be changed
* during computation.
*
* Available since 4.1.0
*
* @param execution The execution to be modified.
* @param index The index of the input argument we are setting. It is an index
* into the lists passed to NeuronModel_identifyInputsAndOutputs. It is not the
* index associated with Neuronodel_addOperand.
* @param type The NeuronOperandType of the operand. Currently NueronAdapter
* only takes NULL.
* @param memory The memory containing the data.
* @param offset This specifies the location of the data within the memory. The
* offset is in bytes from the start of memory.
* @param length The size in bytes of the data value.
*
* @return NEURON_NO_ERROR if successful, NEURON_BAD_DATA if the name is not
* recognized or the buffer is too small for the input.
*/
int NeuronExecution_setInputFromMemory(
NeuronExecution* execution,
uint32_t index,
const NeuronOperandType* type,
const NeuronMemory* memory,
size_t offset,
size_t length);
/**
* Associate part of a memory object with an output of the model of the
* NeuronExecution.
*
* The provided memory must outlive the execution and should not be changed
* during computation.
*
* Available since 4.1.0
*
* @param execution The execution to be modified.
* @param index The index of the output argument we are setting. It is an index
* into the lists passed to NeuronModel_identifyInputsAndOutputs. It is not the
* index associated with Neuronodel_addOperand.
* @param type The NeuronOperandType of the operand. Currently NueronAdapter
* only takes NULL.
* @param memory The memory containing the data.
* @param offset This specifies the location of the data within the memory. The
* offset is in bytes from the start of memory.
* @param length The size in bytes of the data value.
*
* @return NEURON_NO_ERROR if successful, NEURON_BAD_DATA if the name is not
* recognized or the buffer is too small for the input.
*/
int NeuronExecution_setOutputFromMemory(
NeuronExecution* execution,
uint32_t index,
const NeuronOperandType* type,
const NeuronMemory* memory,
size_t offset,
size_t length);
/**
* Schedule synchronous evaluation of the execution.
* Returns once the execution has completed and the outputs are ready to be
* consumed.
*
* Available since 4.1.0
*
* @param execution The execution to be scheduled and executed.
*
* @return NEURON_NO_ERROR if the execution completed normally. NEURON_BAD_STATE
* if the inference fails. Add two return code since 5.0.0
* (NEURON_MISSED_DEADLINE_TRANSIENT if inference timeout, and
* NEURON_OUTPUT_INSUFFICIENT_SIZE if given outsize is not sufficient for real
* output)
*
*/
int NeuronExecution_compute(NeuronExecution* execution);
/**
* Schedule asynchronous evaluation of the execution with dependencies.
*
* The execution will wait for all the depending events to be signaled before
* starting the evaluation. Once the execution has completed and the outputs
* are ready to be consumed, the returned event will be signaled. Depending on
* which devices are handling the execution, the event could be backed by a sync
* fence. Use NeuronEvent_wait to wait for that event.
*
* NeuronEvent_wait must be called to recurperate the resources used by the
* execution.
*
* If parts of the execution are scheduled on devices that do not support fenced
* execution, the function call may wait for such parts to finish before
* returning.
*
* The function will return an error if any of the events in dependencies is
* already in a bad state. After the execution is scheduled, if any of the
* events in dependencies does not complete normally, the execution will fail,
* and NeuronEvent_wait on the returned event will return an error.
*
* The function will return an error if any of the execution outputs has a
* tensor operand type that is not fully specified.
*
* @param execution The execution to be scheduled and executed.
* @param dependencies A set of depending events. The actual evaluation will not
* start until all the events are signaled.
* @param num_dependencies The number of events in the dependencies set.
* @param duration currently not used
* @param event The event that will be signaled on completion. event is set to
* NULL if there's an error.
*
* @return NEURON_NO_ERROR if the evaluation is successfully scheduled.
*
* Available since 5.0.0
*/
int NeuronExecution_startComputeWithDependencies(
NeuronExecution* execution,
const NeuronEvent* const* dependencies,
uint32_t num_dependencies,
uint64_t duration,
NeuronEvent** event);
/**
* Set the maximum duration of WHILE loops in the specified execution.
*
* @param execution The execution to be modified.
* @param duration The maximum amount of time in nanoseconds.
* @return NEURON_NO_ERROR if successful.
*
* Available since 5.0.0
*/
int NeuronExecution_setLoopTimeout(
NeuronExecution* execution,
uint64_t duration);
/**
* Get the default timeout value for WHILE loops.
*
* @return The default timeout value in nanoseconds.
*
* Available since 5.0.0
*/
uint64_t Neuron_getDefaultLoopTimeout();
/**
* Get the maximum timeout value for WHILE loops.
*
* @return The maximum timeout value in nanoseconds.
*
* Available since 5.0.0
*/
uint64_t Neuron_getMaximumLoopTimeout();
/**
* Sets the execution boost hint associated with this execution. Required before
* calling NeuronExecution_compute.
*
* Execution boost is the hint for the device frequency, ranged between 0
* (lowest) to 100 (highest). For the compilation with preference set as
* NEURON_PREFER_SUSTAINED_SPEED, scheduler guarantees that the executing boost
* value would equal to the boost value hint.
*
* On the other hand, for the compilation with preference set as
* NEURON_PREFER_LOW_POWER, scheduler would try to save power by configuring the
* executing boost value with some value that is not higher than the boost value
* hint.
*
* Available since 4.1.0
*
* @param execution The execution to be modified.
* @param boostValue The hint for the device frequency, ranged between 0
* (lowest) to 100 (highest).
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronExecution_setBoostHint(
NeuronExecution* execution,
uint8_t boostValue);
/**
* Sets the execution CPU cache flush hint associated with this execution.
* Required before calling NeuronExecution_setInputFromMemory and
* NeuronExecution_setOutputFromMemory.
*
* Default value of preference is NEURON_CACHE_FLUSH_ENABLE_ALL
*
* Available since 5.0.1
*
* @param execution The execution to be modified.
* @param hint It is either NEURON_CACHE_FLUSH_ENABLE_ALL or the bitwise OR
* of one or more of the following flags: NEURON_CACHE_FLUSH_DISABLE_SYNC_INPUT,
* NEURON_CACHE_FLUSH_DISABLE_INVALIDATE_OUTPUT.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronExecution_setCacheFlushHint(
NeuronExecution* execution,
uint8_t flushHint);
/**
* Get the dimensional information of the specified output operand of the model
* of the latest computation evaluated on {@link NeuronExecution}.
*
* This function may only be invoked when the execution is in the completed
* state.
*
* Available since 5.0.0
*
* @param execution The execution to be queried.
* @param index The index of the output argument we are querying. It is
* an index into the lists passed to {@link
* NeuronModel_identifyInputsAndOutputs}.
* @param rank The rank of the output operand.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronExecution_getOutputOperandRank(
NeuronExecution* execution,
int32_t index,
uint32_t* rank);
/**
* Get the dimensional information of the specified output operand of the model
* of the latest computation evaluated on {@link NeuronExecution}. The target
* output operand cannot be a scalar.
*
* This function may only be invoked when the execution is in the completed
* state.
*
* Available since 5.0.0
*
* @param execution The execution to be queried.
* @param index The index of the output argument we are querying. It is
* an index into the lists passed to {@link
* NeuronModel_identifyInputsAndOutputs}.
* @param dimensions The dimension array to be filled. The size of the array
* must be exactly as large as the rank of the output operand to be queried in
* the model.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronExecution_getOutputOperandDimensions(
NeuronExecution* execution,
int32_t index,
uint32_t* dimensions);
/**
* Create a NeuronCompilation which can create executions with shared static
* memory.
*
* This function only creates the object. Compilation is only performed once
* NeuronCompilation_finish is invoked. NeuronCompilation_finish should be
* called once all desired properties have been set on the compilation.
* NeuronModel_free should be called once the compilation is no longer needed.
* The provided model must outlive the compilation. The model must already have
* been finished by a call to NeuronModel_finish.
*
* Available since 7.0.0
*
* @param model The NeuronModel to be compiled.
* @param compilation The newly created object or NULL if unsuccessful.
*
* @return NEURON_NO_ERROR if successful
*/
int NeuronCompilation_createForBatch(
NeuronModel* model,
NeuronCompilation** compilation);
/**
* Set the size of runner pool, and create same number of runners.
*
* The execution must created by the following steps:
* NeuronCompilation_createForBatch, NeuronCompilation_finish,
* NeuronExecution_create.
*
* The execution created from this compilation has to use
* NeuronExecution_setRunnerPoolSize to create thread pool and then set a series
* of inputs & outputs into the execution. The execution will inference with the
* series of inputs.
*
* Available since 7.0.0
*
* @param execution The NeuronExecution to be utilized.
* @param numRunners The number of runner need to be created.
*
* @return NEURON_NO_ERROR if successful
* @return NEURON_BAD_STATE if the compilation is not created via
* NeuronCompilation_createForBatch.
*/
int NeuronExecution_setRunnerPoolSize(
NeuronExecution* execution,
uint8_t numRunners);
/**
* Notify the execution that all inputs / outputs have been set.
* Should be called after NeuronExecution_setInputFromMemory and
* NeuronExecution_setOutputFromMemory.
*
* The execution must created by the following steps:
* NeuronCompilation_createForBatch, NeuronCompilation_finish,
* NeuronExecution_create.
*
* Available since 7.0.0
*
* @param execution The NeuronExecution to be utilized.
*
* @return NEURON_NO_ERROR if successful
* @return NEURON_BAD_STATE if the compilation is not created via
* NeuronCompilation_createForBatch.
*/
int NeuronExecution_setBatchDone(NeuronExecution* execution);
/**
* Notify the execution that all inputs / outputs have been set.
* Should be called after NeuronExecution_setInputFromMemory and
* NeuronExecution_setOutputFromMemory.
*
* The execution must created by the following steps:
* 1. NeuronCompilation_createV2 with COMPILATION_TYPE_EXECUTION_CONTROLLER
* 2. NeuronCompilation_finish
* 3. NeuronExecution_create.
* or
* 1. NeuronModel_restoreFromCompiledNetworkV2 with
* COMPILATION_TYPE_EXECUTION_CONTROLLER
* 2. NeuronExecution_create.
*
* Available since 7.0.1
*
* @param execution The NeuronExecution to be utilized.
* @param idx The index of runner to set the previous inputs and outputs.
*
* @return NEURON_NO_ERROR if successful
* @return NEURON_BAD_STATE if the compilation is not created via
* COMPILATION_TYPE_EXECUTION_CONTROLLER.
*/
int NeuronExecution_setIODone(NeuronExecution* execution, int idx);
/**
* Create a NeuronCompilation which can create executions with shared static
* memory.
*
* This function only creates the object. Compilation is only performed once
* NeuronCompilation_finish is invoked. NeuronCompilation_finish should be
* called once all desired properties have been set on the compilation.
* NeuronModel_free should be called once the compilation is no longer needed.
* The provided model must outlive the compilation. The model must already have
* been finished by a call to NeuronModel_finish.
*
* The executions created from this compilation can be executed at the same
* time.
*
* Available since 7.0.0
*
* @param model The NeuronModel to be compiled.
* @param compilation The newly created object or NULL if unsuccessful.
*
* @return NEURON_NO_ERROR if successful
*/
int NeuronCompilation_createForMultiExecutions(
NeuronModel* model,
NeuronCompilation** compilation);
/**
* Set report path for debug plus.
*
* Only be used in debug purpose, the execution should be created by
* NeuronCompilation_createForDebug compilation.
*
* Available since 5.0.0
*
* @param model The model need to be debug.
* @param path The path of execution report.
*
* @return NEURON_NO_ERROR if successful, NEURON_BAD_DATA if the path is empty.
*/
int NeuronDebug_setReportPath(NeuronModel* model, const char* path);
/**
* Get the number of available devices.
*
* Available since 4.1.0
* @param numDevices The number of devices returned.
*
* @return NEURON_NO_ERROR if successful.
*/
int Neuron_getDeviceCount(uint32_t* numDevices);
/**
* Get the representation of the specified device.
*
* Available since 4.1.0
*
* @param devIndex The index of the specified device. Must be less than the
* number of available devices.
* @param device The representation of the specified device. The same
* representation will always be returned for the specified device.
*
* @return NEURONNO_ERROR if successful.
*/
int Neuron_getDevice(uint32_t devIndex, NeuronDevice** device);
/**
* Get the name of the specified device.
*
* Available since 4.1.0
*
* @param device The representation of the specified device.
* @param name The returned name of the specified device. The name will remain
* valid for the duration of the application.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronDevice_getName(const NeuronDevice* device, const char** name);
/**
* Get the description of the specified device.
*
* Available since 5.0.0
*
* @param device The representation of the specified device.
* @param description The returned description of the specified device. The
* description will remain valid for the duration of the application.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronDevice_getDescription(
const NeuronDevice* device,
const char** description);
/*
* Destroys the event.
*
* See NeuronExecution for information on multithreaded usage.
*
* Available since 5.0.0
*
* @param event The event object to be destroyed. Passing NULL is acceptable and
* results in no operation.
*/
void NeuronEvent_free(NeuronEvent* event);
/*
* Force destroys the event without calling NeuronEvent_wait().
* If user wants do wait before destroying the event, they should use
* NeuronEvent_free.
*
* See NeuronExecution for information on multithreaded usage.
*
* Available since 6.0.0
*
* @param event The event object to be destroyed. Passing NULL is acceptable and
* results in no operation.
*/
void NeuronEvent_freeForce(NeuronEvent* event);
/**
* Waits until the execution completes.
*
* More than one thread can wait on an event. When the execution completes,
* all threads will be released.
*
* SeeNeuronExecution for information on multithreaded usage.
*
* Available since 5.0.0
*
* @param event The event that will be signaled on completion.
* @return NEURON_NO_ERROR if the execution completed normally.
* NEURON_UNMAPPABLE if the execution input or output memory cannot
* be properly mapped.
*/
int NeuronEvent_wait(NeuronEvent* event);
/**
* Create a NeuronEventfrom a sync_fence file descriptor.
*
* The newly created NeuronEvent does not take ownership of the provided
* sync_fence_fd, it will instead dup the provided sync_fence_fd and own the
* duplicate.
*
* @param sync_fence_fd The sync_fence file descriptor.
* @param event The newly created object or NULL if unsuccessful.
*
* @return NEURON_NO_ERROR if successful.
*
* Available since 5.0.0
*/
int NeuronEvent_createFromSyncFenceFd(int sync_fence_fd, NeuronEvent** event);
/**
* Get sync_fence file descriptor from the event.
*
* If the NeuronEvent is not backed by a sync fence, the sync_fence_fd
* will be set to -1, and NEURON_BAD_DATA will be returned.
*
* See NeuronEvent_createFromSyncFenceFd and
* NeuronExecution_startComputeWithDependencies to see how to create an event
* backed by a sync fence.
*
* The user takes ownership of the returned fd, and must close the returned file
* descriptor when it is no longer needed.
*
* @param event An event that is backed by a sync fence.
* @param sync_fence_fd The sync_fence file descriptor. The file descriptor will
* be set to -1 if there is an error.
*
* @return NEURON_NO_ERROR if successful.
*
* Available since 5.0.0
*/
int NeuronEvent_getSyncFenceFd(const NeuronEvent* event, int* sync_fence_fd);
/**
* Queries whether an extension is supported by the driver implementation of the
* specified device.
*
* @param extension The extension name.
* @param isExtensionSupported The boolean value indicating whether the
* extension is supported.
*
* @return NEURON_NO_ERROR if successful.
*
* Available since 5.0.0
*/
// Note: Remove "device"
int NeuronDevice_getExtensionSupport(
const char* extensionName,
bool* isExtensionSupported);
/**
* Creates an operand type from an extension name and an extension operand code.
*
* See {@link NeuronModel} for information on multithreaded usage.
*
* Available since 5.0.0
*
* @param model The model to contain the operand.
* @param extensionName The extension name.
* @param operandCodeWithinExtension The extension operand code.
* @param type The operand type.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronModel_getExtensionOperandType(
NeuronModel* model,
const char* extensionName,
uint16_t operandCodeWithinExtension,
int32_t* type);
/**
* Creates an operation type from an extension name and an extension operation
* code.
*
* See {@link NeuronModel} for information on multithreaded usage.
*
* Available since 5.0.0
*
* @param model The model to contain the operation.
* @param extensionName The extension name.
* @param operationCodeWithinExtension The extension operation code.
* @param type The operation type.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronModel_getExtensionOperationType(
NeuronModel* model,
const char* extensionName,
uint16_t operationCodeWithinExtension,
int32_t* type);
/**
* Sets extension operand parameters.
*
* Available since 5.0.0
*
* @param model The model to be modified.
* @param index The index of the model operand we're setting.
* @param data A pointer to the extension operand data.
* The data does not have to outlive the call to this function.
* @param length The size in bytes of the data value.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronModel_setOperandExtensionData(
NeuronModel* model,
int32_t index,
const void* data,
size_t length);
/**
* Gets the execution preference associated with this compilation.
* This function must be called after calling NeuronCompilation_finish.
*
* Available since 6.0.0
*
* @param compilation The compilation to be queried.
* @param preference The execution preference will be one of NEURON_PREFER_*.
* Ignore preference value if this function doesn't return NEURON_NO_ERROR.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronCompilation_getPreference(
NeuronCompilation* compilation,
int* preference);
/**
* Gets the execution priority associated with this compilation.
* This function must be called after calling NeuronCompilation_finish.
*
* Available since 6.0.0
*
* @param compilation The compilation to be queried.
* @param priority The priority will be one of NEURON_PRIORITY_*. Ignore
* priority value if this function doesn't return NEURON_NO_ERROR.
*
* @return NEURON_NO_ERROR if successful.
*/
int NeuronCompilation_getPriority(
NeuronCompilation* compilation,
int* priority);
int NeuronCompilation_createWithOptions(
NeuronModel* model,
NeuronCompilation** compilation,
const char* options);
__END_DECLS