From c12c02ff63bb21ccc1ee0b2e693df3d09d48231f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=85?= Date: Wed, 8 Aug 2018 17:01:29 +0800 Subject: [PATCH] Make hexagon runtime compatible to nnlib-old --- .../hexagon/hexagon_control_wrapper.cc | 8 + third_party/nnlib/hexagon_nn.h | 195 ++++++++++++++++++ .../nnlib/libhexagon_controller_old.so | Bin 0 -> 15564 bytes third_party/nnlib/ops.h | 143 +++++++++++++ 4 files changed, 346 insertions(+) create mode 100755 third_party/nnlib/libhexagon_controller_old.so diff --git a/mace/core/runtime/hexagon/hexagon_control_wrapper.cc b/mace/core/runtime/hexagon/hexagon_control_wrapper.cc index 62312744..4e435ebf 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 b7485c93..84933ddb 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 GIT binary patch literal 15564 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