diff --git a/mace/core/runtime/hexagon/hexagon_control_wrapper.cc b/mace/core/runtime/hexagon/hexagon_control_wrapper.cc index 62312744845055bc05370dc51bb6e8e7ed33c812..4e435ebf09d75b26d6cdb63262cc25de6949cd35 100644 --- a/mace/core/runtime/hexagon/hexagon_control_wrapper.cc +++ b/mace/core/runtime/hexagon/hexagon_control_wrapper.cc @@ -59,7 +59,11 @@ bool HexagonControlWrapper::Config() { bool HexagonControlWrapper::Init() { LOG(INFO) << "Hexagon init"; +#ifdef MACE_USE_NNLIB_OLD + nn_id_ = hexagon_nn_init(); +#else MACE_CHECK(hexagon_nn_init(&nn_id_) == 0, "hexagon_nn_init failed"); +#endif ResetPerfInfo(); return true; } @@ -141,6 +145,9 @@ bool HexagonControlWrapper::SetupGraph(const NetDef &net_def, } outputs.resize(op.output_shape().size()); for (int i = 0; i < op.output_shape().size(); ++i) { +#ifdef MACE_USE_NNLIB_OLD + outputs[i].max_size = op.out_max_byte_size()[i]; +#else outputs[i].rank = op.output_shape()[i].dims().size(); for (size_t j = 0; j < outputs[i].rank; ++j) { outputs[i].max_sizes[j] = op.output_shape()[i].dims()[j]; @@ -154,6 +161,7 @@ bool HexagonControlWrapper::SetupGraph(const NetDef &net_def, static_cast(op.output_type()[i])); outputs[i].zero_offset = 0; outputs[i].stepsize = 0; +#endif } cached_inputs.push_back(inputs); cached_outputs.push_back(outputs); diff --git a/third_party/nnlib/hexagon_nn.h b/third_party/nnlib/hexagon_nn.h index b7485c93f4db702b60091b66ac2a9af9b2438719..84933ddb5ea6d3f06a99174a431c8746226fd1b0 100644 --- a/third_party/nnlib/hexagon_nn.h +++ b/third_party/nnlib/hexagon_nn.h @@ -35,6 +35,198 @@ #ifndef THIRD_PARTY_NNLIB_HEXAGON_NN_H_ #define THIRD_PARTY_NNLIB_HEXAGON_NN_H_ + +#ifdef MACE_USE_NNLIB_OLD + +#ifndef __QAIC_HEADER +#define __QAIC_HEADER(ff) ff +#endif // __QAIC_HEADER + +#ifndef __QAIC_HEADER_EXPORT +#define __QAIC_HEADER_EXPORT +#endif // __QAIC_HEADER_EXPORT + +#ifndef __QAIC_HEADER_ATTRIBUTE +#define __QAIC_HEADER_ATTRIBUTE +#endif // __QAIC_HEADER_ATTRIBUTE + +#ifndef __QAIC_IMPL +#define __QAIC_IMPL(ff) ff +#endif // __QAIC_IMPL + +#ifndef __QAIC_IMPL_EXPORT +#define __QAIC_IMPL_EXPORT +#endif // __QAIC_IMPL_EXPORT + +#ifndef __QAIC_IMPL_ATTRIBUTE +#define __QAIC_IMPL_ATTRIBUTE +#endif // __QAIC_IMPL_ATTRIBUTE +#ifdef __cplusplus +extern "C" { +#endif +#if !defined(__QAIC_STRING1_OBJECT_DEFINED__) && !defined(__STRING1_OBJECT__) +#define __QAIC_STRING1_OBJECT_DEFINED__ +#define __STRING1_OBJECT__ +typedef struct _cstring1_s { + char *data; + int dataLen; +} _cstring1_t; + +#endif /* __QAIC_STRING1_OBJECT_DEFINED__ */ +typedef struct hexagon_nn_input hexagon_nn_input; +struct hexagon_nn_input { + unsigned int src_id; + unsigned int output_idx; +}; +typedef struct hexagon_nn_output hexagon_nn_output; +struct hexagon_nn_output { + unsigned int max_size; + unsigned int unused; +}; +typedef struct hexagon_nn_perfinfo hexagon_nn_perfinfo; +struct hexagon_nn_perfinfo { + unsigned int node_id; + unsigned int node_type; + unsigned int executions; + unsigned int unused; + unsigned int counter_lo; + unsigned int counter_hi; +}; +typedef int hexagon_nn_nn_id; +enum hexagon_nn_padding_type { + NN_PAD_NA, + NN_PAD_SAME, + NN_PAD_VALID, + NN_PAD_MIRROR_REFLECT, + NN_PAD_MIRROR_SYMMETRIC, + NN_PAD_SAME_CAFFE, + _32BIT_PLACEHOLDER_hexagon_nn_padding_type = 0x7fffffff +}; +typedef enum hexagon_nn_padding_type hexagon_nn_padding_type; +typedef struct hexagon_nn_tensordef hexagon_nn_tensordef; +struct hexagon_nn_tensordef { + unsigned int batches; + unsigned int height; + unsigned int width; + unsigned int depth; + unsigned char *data; + int dataLen; + unsigned int data_valid_len; + unsigned int unused; +}; +typedef struct hexagon_nn_op_node hexagon_nn_op_node; +struct hexagon_nn_op_node { + unsigned int node_id; + unsigned int operation; + hexagon_nn_padding_type padding; + hexagon_nn_input *inputs; + int inputsLen; + hexagon_nn_output *outputs; + int outputsLen; +}; +typedef struct hexagon_nn_const_node hexagon_nn_const_node; +struct hexagon_nn_const_node { + unsigned int node_id; + hexagon_nn_tensordef tensor; +}; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_config)(void) + __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_init)(void) + __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_set_debug_level)( + hexagon_nn_nn_id id, int level) __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_set_graph_mode)( + hexagon_nn_nn_id id, int mode) __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_snpprint)(hexagon_nn_nn_id id, + unsigned char *buf, + int bufLen) + __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_getlog)(hexagon_nn_nn_id id, + unsigned char *buf, + int bufLen) + __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_append_node)( + hexagon_nn_nn_id id, + unsigned int node_id, + unsigned int operation, + hexagon_nn_padding_type padding, + const hexagon_nn_input *inputs, + int inputsLen, + const hexagon_nn_output *outputs, + int outputsLen) __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_append_node_list)( + hexagon_nn_nn_id id, + const hexagon_nn_op_node *ops, + int opsLen) __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_append_const_node)( + hexagon_nn_nn_id id, + unsigned int node_id, + unsigned int batches, + unsigned int height, + unsigned int width, + unsigned int depth, + const unsigned char *data, + int dataLen) __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_append_const_node_list)( + hexagon_nn_nn_id id, + const hexagon_nn_const_node *consts, + int constsLen) __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_prepare)(hexagon_nn_nn_id id) + __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_execute)( + hexagon_nn_nn_id id, + unsigned int batches_in, + unsigned int height_in, + unsigned int width_in, + unsigned int depth_in, + const unsigned char *data_in, + int data_inLen, + unsigned int *batches_out, + unsigned int *height_out, + unsigned int *width_out, + unsigned int *depth_out, + unsigned char *data_out, + int data_outLen, + unsigned int *data_len_out) __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_teardown)(hexagon_nn_nn_id id) + __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_set_powersave_level)( + unsigned int level) __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_get_perfinfo)( + hexagon_nn_nn_id id, + hexagon_nn_perfinfo *info_out, + int info_outLen, + unsigned int *n_items) __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_reset_perfinfo)( + hexagon_nn_nn_id id, unsigned int event) __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_last_execution_cycles)( + hexagon_nn_nn_id id, + unsigned int *cycles_lo, + unsigned int *cycles_hi) __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_version)(int *ver) + __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_op_name_to_id)( + const char *name, unsigned int *node_id) __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_op_id_to_name)( + unsigned int node_id, char *name, int nameLen) __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_disable_dcvs)(void) + __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_GetHexagonBinaryVersion)( + int *ver) __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_PrintLog)( + const unsigned char *buf, int bufLen) __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_execute_new)( + hexagon_nn_nn_id id, + const hexagon_nn_tensordef *inputs, + int inputsLen, + hexagon_nn_tensordef *outputs, + int outputsLen) __QAIC_HEADER_ATTRIBUTE; +#ifdef __cplusplus +} +#endif + +#else // nnlib version + #ifndef __QAIC_HEADER #define __QAIC_HEADER(ff) ff #endif //__QAIC_HEADER @@ -226,4 +418,7 @@ __QAIC_HEADER_EXPORT unsigned int __QAIC_HEADER(hexagon_nn_get_dsp_offset)(void) #ifdef __cplusplus } #endif + +#endif // nnlib version + #endif // THIRD_PARTY_NNLIB_HEXAGON_NN_H_ diff --git a/third_party/nnlib/libhexagon_controller_old.so b/third_party/nnlib/libhexagon_controller_old.so new file mode 100755 index 0000000000000000000000000000000000000000..1c5a4111f9958eddfb0426c3010bc93ad8e13119 Binary files /dev/null and b/third_party/nnlib/libhexagon_controller_old.so differ diff --git a/third_party/nnlib/ops.h b/third_party/nnlib/ops.h index 43670832fbd693ffe50d4767a71586e4400f9f2e..48318c7048a58c2b8d741917a26325fbc909ff94 100644 --- a/third_party/nnlib/ops.h +++ b/third_party/nnlib/ops.h @@ -79,6 +79,147 @@ */ // NOLINT(build/header_guard) +#ifdef MACE_USE_NNLIB_OLD + +DEF_OP(INPUT) +DEF_OP(OUTPUT) +DEF_OP(Nop) +DEF_OP(Const) +DEF_OP(Check) +DEF_OP(Close_f) +DEF_OP(Close_quint8) +DEF_OP(Close_q_quint8) +DEF_OP(Close_int32) +DEF_OP(Close_qint32) +DEF_OP(PPrint_8) +DEF_OP(PPrint_32) +DEF_OP(PPrint_f) +DEF_OP(PreFree) +DEF_OP(Flatten) + +#ifndef DEF_OP_WREF +#define DEF_OP_WREF(NAME) DEF_OP(NAME) DEF_OP(NAME##_ref) +#define __SELF_DEF_OP_WREF +#endif + +DEF_OP_WREF(QuantizedConv2d_8x8to32) +DEF_OP_WREF(QuantizedMatMul_8x8to32) +DEF_OP_WREF(QuantizeDownAndShrinkRange_32to8) +DEF_OP_WREF(QuantizedRelu_8) +DEF_OP_WREF(QuantizedReluX_8) +DEF_OP_WREF(QuantizedMaxPool_8) +DEF_OP_WREF(QuantizedAvgPool_8) +DEF_OP_WREF(QuantizedConcat_8) +DEF_OP_WREF(QuantizedBiasAdd_8p8to32) +DEF_OP_WREF(Min_f) +DEF_OP_WREF(Max_f) +DEF_OP_WREF(Quantize) +DEF_OP_WREF(Dequantize) +DEF_OP_WREF(Supernode_8x8p8to8) + +DEF_OP(QuantizedFlatten) +DEF_OP(Softmax_f) +DEF_OP(Conv2d_f) +DEF_OP(MatMul_f) +DEF_OP(Relu_f) +DEF_OP(ReluX_f) +DEF_OP(AvgPool_f) +DEF_OP(MaxPool_f) +DEF_OP(Concat_f) +DEF_OP(BiasAdd_f) +DEF_OP(LRN_f) + +DEF_OP(Variable) +DEF_OP(Assign) +DEF_OP(Reshape) +DEF_OP(QuantizedReshape) +DEF_OP(Tanh_f) +DEF_OP(Sigmoid_f) +DEF_OP(Slice_8) +DEF_OP(Slice_f) +DEF_OP(QuantizedSlice_8) +DEF_OP(Add_f) +DEF_OP(Mul_f) +DEF_OP(Minimum_f) +DEF_OP(Maximum_f) + +DEF_OP_WREF(Requantize_32to8) +DEF_OP_WREF(RequantizationRange_32) + +DEF_OP(Neg_f) +DEF_OP(Sub_f) +DEF_OP(AddN_f) +DEF_OP(Range_int32) +DEF_OP(Rank_int32) +DEF_OP(Transpose_int32) +DEF_OP(Transpose_f) +DEF_OP(InstanceNorm_f) +DEF_OP_WREF(QuantizedInstanceNorm_8) +DEF_OP(Sub_int32) +DEF_OP(Add_int32) +DEF_OP(Split_f) +DEF_OP(Dequantize_qint32_f) +DEF_OP(PRelu_f) +DEF_OP_WREF(QuantizedPRelu_8) +DEF_OP(Sum_f) +DEF_OP(Prod_f) +DEF_OP(Mul_int32) +DEF_OP(LogicalAnd_int32) +DEF_OP(LogicalOr_int32) +DEF_OP(LogicalXor_int32) +DEF_OP(Shape_int32) +DEF_OP(Pack_int32) +DEF_OP(MirrorPad_f) +DEF_OP(ResizeNearestNeighbor_f) +DEF_OP(StridedSlice_int32) +DEF_OP(StridedSlice_f) +DEF_OP(ExpandDims_int32) +DEF_OP(ExpandDims_f) + +DEF_OP(LogSoftmax_f) +DEF_OP(Split_int32) +DEF_OP(QuantizedSplit_8) + +DEF_OP(Deconv_f) +DEF_OP_WREF(QuantizedDeconv_8x8to32) + +DEF_OP_WREF(QuantizedMul_8x8to32) +DEF_OP_WREF(QuantizedAdd_8p8to32) +DEF_OP_WREF(QuantizedSigmoid_8) +DEF_OP_WREF(QuantizedTanh_8) +DEF_OP_WREF(QuantizedSoftmax_8) +DEF_OP_WREF(QuantizedLRN_8) +DEF_OP_WREF(QuantizedSub_8p8to32) +DEF_OP_WREF(QuantizedMaximum_8) +DEF_OP_WREF(QuantizedMinimum_8) + +DEF_OP(Pad_f) +DEF_OP(SpaceToBatchND_f) +DEF_OP(BatchToSpaceND_f) +DEF_OP(QuantizedSpaceToBatchND_8) +DEF_OP(QuantizedBatchToSpaceND_8) +DEF_OP(QuantizedPad_8) +DEF_OP(ResizeBilinear_f) +DEF_OP(QuantizedResizeBilinear_8) +DEF_OP(ConcatV2_f) +DEF_OP(ConcatV2_int32) +DEF_OP(Prod_int32) +DEF_OP(Slice_int32) + +DEF_OP(QuantizedAdd_8p8to8) + +DEF_OP_WREF(AutoQuantize) +DEF_OP_WREF(QuantizedDepthwiseConv2d_8x8to32) +DEF_OP(DepthwiseConv2d_f) +DEF_OP(QuantizedBiasAdd_8p8to8) + +#ifdef __SELF_DEF_OP_WREF +#undef __SELF_DEF_OP_WREF +#undef DEF_OP_WREF +#endif + +#else // nnlib version + DEF_OP(INPUT) DEF_OP(OUTPUT) DEF_OP(Nop) @@ -285,3 +426,5 @@ DEF_OP(DepthToSpace_8) #undef __SELF_DEF_OP_WREF #undef DEF_OP_WREF #endif + +#endif // nnlib version