From fbf80ad582c9f6ad529063d4ad497da9b950255f Mon Sep 17 00:00:00 2001 From: Yin Li Date: Wed, 1 Nov 2017 14:28:22 +0800 Subject: [PATCH] Fix perf op type --- mace/dsp/hexagon/android.min | 37 ---------- mace/dsp/hexagon/hexagon_controller.h | 21 ++++++ mace/dsp/hexagon/hexagon_nn.h | 52 +++++++------- mace/dsp/hexagon/libhexagon_controller.so | Bin 16056 -> 17180 bytes mace/dsp/hexagon_control_wrapper.cc | 82 +++++++++++++++++----- mace/dsp/hexagon_control_wrapper.h | 6 +- mace/dsp/hexagon_control_wrapper_test.cc | 24 +++++-- mace/dsp/hexagon_nn_ops.h | 11 +++ 8 files changed, 146 insertions(+), 87 deletions(-) delete mode 100644 mace/dsp/hexagon/android.min create mode 100644 mace/dsp/hexagon/hexagon_controller.h diff --git a/mace/dsp/hexagon/android.min b/mace/dsp/hexagon/android.min deleted file mode 100644 index 14c9422c..00000000 --- a/mace/dsp/hexagon/android.min +++ /dev/null @@ -1,37 +0,0 @@ -$(info ------------------------------------------) -$(info --- V = $(V)) -$(info --- GLUE_DIR = $(GLUE_DIR)) -$(info --- HEXAGON_SDK_ROOT = $(HEXAGON_SDK_ROOT)) -$(info ------------------------------------------) - -INCDIRS += ../../../libs/common/adspmsgd/ship/android_Release -LIBDIRS += ../../../libs/common/adspmsgd/ship/android_Release - -BUILD_DLLS=libhexagon_controller - -hexagon_controller_lib_QAICIDLS += \ -interface/hexagon_nn \ -$(MAKE_D_DSPCV_INCDIR)/dspCV - -# hexagon interface -hexagon_controller_lib_C_SRCS += \ -$V/hexagon_nn_stub \ -$V/dspCV_stub - -hexagon_controller_lib_DLLS += libcdsprpc -hexagon_controller_lib_LIBS += rpcmem adspmsgd -hexagon_controller_lib_LD_FLAGS += -llog -hexagon_controller_lib_DEFINES += VERIFY_PRINT_ERROR - -libhexagon_controller_QAICIDLS += $(hexagon_controller_lib_QAICIDLS) -libhexagon_controller_C_SRCS += $(hexagon_controller_lib_C_SRCS) -libhexagon_controller_DLLS += $(hexagon_controller_lib_DLLS) -libhexagon_controller_LIBS += $(hexagon_controller_lib_LIBS) -libhexagon_controller_LD_FLAGS += $(hexagon_controller_lib_LD_FLAGS) -libhexagon_controller_DEFINES += $(hexagon_controller_lib_DEFINES) - -BUILD_COPIES = \ - $(DLLS) \ - $(EXES) \ - $(LIBS) \ - $(SHIP_DIR)/ ; diff --git a/mace/dsp/hexagon/hexagon_controller.h b/mace/dsp/hexagon/hexagon_controller.h new file mode 100644 index 00000000..3558f2aa --- /dev/null +++ b/mace/dsp/hexagon/hexagon_controller.h @@ -0,0 +1,21 @@ +#ifndef MACE_DSP_HEXAGON_DSP_CONTROLLER_H_ +#define MACE_DSP_HEXAGON_DSP_CONTROLLER_H_ + +#include "hexagon_nn.h" + +#ifdef __cplusplus +extern "C" { +#else +#include +#endif // __cplusplus + +int hexagon_controller_InitHexagonWithMaxAttributes(int enable_dcvs, + int bus_usage); + +int hexagon_controller_DeInitHexagon(); + +#ifdef __cplusplus +} +#endif // __cplusplus + +#endif // MACE_DSP_HEXAGON_DSP_CONTROLLER_H_ \ No newline at end of file diff --git a/mace/dsp/hexagon/hexagon_nn.h b/mace/dsp/hexagon/hexagon_nn.h index 88502b1d..acde71d9 100644 --- a/mace/dsp/hexagon/hexagon_nn.h +++ b/mace/dsp/hexagon/hexagon_nn.h @@ -30,49 +30,51 @@ extern "C" { #define __QAIC_STRING1_OBJECT_DEFINED__ #define __STRING1_OBJECT__ typedef struct _cstring1_s { - char* data; - int dataLen; + 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; + 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; + 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 executions; - unsigned int counter_lo; - unsigned int counter_hi; + 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 + 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; + 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; }; __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; diff --git a/mace/dsp/hexagon/libhexagon_controller.so b/mace/dsp/hexagon/libhexagon_controller.so index 6b49b9d9ba3d83199dac6959f50c1cf4713df6bf..da6f257e152d486dc82e686e2fe6cad2f60bd173 100755 GIT binary patch literal 17180 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 diff --git a/mace/dsp/hexagon_control_wrapper.cc b/mace/dsp/hexagon_control_wrapper.cc index 80238273..db3ff22a 100644 --- a/mace/dsp/hexagon_control_wrapper.cc +++ b/mace/dsp/hexagon_control_wrapper.cc @@ -7,6 +7,16 @@ namespace mace { +#define MAX_NODE 2048 * 8 + +enum { + NN_GRAPH_PERFEVENT_CYCLES = 0, + NN_GRAPH_PERFEVENT_USER0 = 1, + NN_GRAPH_PERFEVENT_USER1 = 2, + NN_GRAPH_PERFEVENT_HWPMU = 3, + NN_GRAPH_PERFEVENT_UTIME = 5, +}; + int HexagonControlWrapper::GetVersion() { int version; hexagon_nn_version(&version); @@ -20,15 +30,15 @@ bool HexagonControlWrapper::Config() { bool HexagonControlWrapper::Init() { LOG(INFO) << "Hexagon init"; - op_map_.Init(); - // TODO(liyin): dspCV init + hexagon_controller_InitHexagonWithMaxAttributes(0, 100); nn_id_ = hexagon_nn_init(); + ResetPerfInfo(); return true; } bool HexagonControlWrapper::Finalize() { LOG(INFO) << "Hexagon finalize"; - // TODO(liyin): dspCV deinit + hexagon_controller_DeInitHexagon(); return true; } @@ -36,7 +46,8 @@ bool HexagonControlWrapper::SetupGraph(NetDef net_def) { LOG(INFO) << "Hexagon setup graph"; // const node for (const TensorProto& tensor_proto: net_def.tensors()) { - vector tensor_shape(tensor_proto.dims().begin(), tensor_proto.dims().end()); + vector tensor_shape(tensor_proto.dims().begin(), + tensor_proto.dims().end()); while (tensor_shape.size() < 4) { tensor_shape.insert(tensor_shape.begin(), 1); } @@ -49,7 +60,8 @@ bool HexagonControlWrapper::SetupGraph(NetDef net_def) { NULL, 0); } else { - unique_ptr tensor = serializer_.Deserialize(tensor_proto, DeviceType::CPU); + unique_ptr tensor = serializer_.Deserialize(tensor_proto, + DeviceType::CPU); VLOG(0) << "Tensor size: " << tensor->size(); hexagon_nn_append_const_node(nn_id_, node_id(tensor_proto.node_id()), tensor_shape[0], tensor_shape[1], @@ -58,14 +70,17 @@ bool HexagonControlWrapper::SetupGraph(NetDef net_def) { tensor->raw_data()), tensor->raw_size()); } - VLOG(0) << "Const: " << tensor_proto.name() << ", node_id: " << node_id(tensor_proto.node_id()) - << "\n\t shape: " << tensor_shape[0] << " " << tensor_shape[1] << " " << tensor_shape[2] << " " << tensor_shape[3]; + VLOG(0) << "Const: " << tensor_proto.name() + << ", node_id: " << node_id(tensor_proto.node_id()) + << "\n\t shape: " << tensor_shape[0] << " " << tensor_shape[1] + << " " << tensor_shape[2] << " " << tensor_shape[3]; } // op node for (const OperatorDef& op: net_def.op()) { - int op_id = op_map_.GetOpId(op.type()); - MACE_CHECK(op_id != OP_INVALID, "invalid op: ", op.name()); + unsigned int op_id; + MACE_CHECK(hexagon_nn_op_name_to_id(op.type().data(), &op_id) == 0, + "invalid op: ", op.name()); vector inputs(op.node_input_size()); for (size_t i = 0; i < op.node_input_size(); ++i) { inputs[i].src_id = node_id(op.node_input(i).node_id()); @@ -80,9 +95,13 @@ bool HexagonControlWrapper::SetupGraph(NetDef net_def) { op.padding()); hexagon_nn_append_node(nn_id_, node_id(op.node_id()), op_id, padding_type, - inputs.data(), inputs.size(), outputs.data(), outputs.size()); + inputs.data(), inputs.size(), + outputs.data(), outputs.size()); - VLOG(0) << "Op: " << op.name() << ", type: " << op.type() << ", node_id: " << node_id(op.node_id()) << ", padding_type: " << padding_type; + VLOG(0) << "Op: " << op.name() + << ", type: " << op.type() + << ", node_id: " << node_id(op.node_id()) + << ", padding_type: " << padding_type; for (const auto& input: inputs) { VLOG(0) << "\t input: " << input.src_id << ":" << input.output_idx; } @@ -121,7 +140,6 @@ bool HexagonControlWrapper::SetupGraph(const std::string& model_file) { return SetupGraph(net_def); } - bool HexagonControlWrapper::TeardownGraph() { LOG(INFO) << "Hexagon teardown graph"; return hexagon_nn_teardown(nn_id_) == 0; @@ -156,15 +174,47 @@ void HexagonControlWrapper::SetDebugLevel(int level) { void HexagonControlWrapper::GetPerfInfo() { LOG(INFO) << "Get perf info"; - vector perf_info(10000); + vector perf_info(MAX_NODE); unsigned int n_items; - hexagon_nn_get_perfinfo(nn_id_, perf_info.data(), 10000, &n_items); + hexagon_nn_get_perfinfo(nn_id_, perf_info.data(), MAX_NODE, &n_items); + + std::unordered_map node_id_counters; + std::unordered_map> node_type_counters; + float total_duration = 0.0; for (int i = 0; i < n_items; ++i) { + unsigned int node_id = perf_info[i].node_id; + unsigned int node_type_id = perf_info[i].node_type; + node_id_counters[node_id] = ((static_cast(perf_info[i].counter_hi) << 32) + + perf_info[i].counter_lo) * 1.0f / perf_info[i].executions; + LOG(INFO) << "node id: " << perf_info[i].node_id + << ", node type: " << perf_info[i].node_type << ", executions: " << perf_info[i].executions - << ", counter_hi: " << perf_info[i].counter_hi - << ", counter_lo: " << perf_info[i].counter_lo; + << ", duration: " << node_id_counters[node_id]; + + + char node_type_buf[1280]; + hexagon_nn_op_id_to_name(node_type_id, node_type_buf, 1280); + std::string node_type(node_type_buf); + if (node_type_counters.find(node_type) == node_type_counters.end()) { + node_type_counters[node_type] = {0, 0.0}; + } + ++node_type_counters[node_type].first; + node_type_counters[node_type].second += node_id_counters[node_id]; + total_duration += node_id_counters[node_id]; + } + + for (auto& node_type_counter: node_type_counters) { + LOG(INFO) << "node type: " << node_type_counter.first + << ", time: " << node_type_counter.second.first + << ", duration: " << node_type_counter.second.second; } + LOG(INFO) << "total duration: " << total_duration; +} + +void HexagonControlWrapper::ResetPerfInfo() { + LOG(INFO) << "Reset perf info"; + hexagon_nn_reset_perfinfo(nn_id_, NN_GRAPH_PERFEVENT_UTIME); } } // namespace mace \ No newline at end of file diff --git a/mace/dsp/hexagon_control_wrapper.h b/mace/dsp/hexagon_control_wrapper.h index 57f633e6..0547b977 100644 --- a/mace/dsp/hexagon_control_wrapper.h +++ b/mace/dsp/hexagon_control_wrapper.h @@ -5,7 +5,7 @@ #ifndef MACE_DSP_HEXAGON_CONTROL_WRAPPER_H_ #define MACE_DSP_HEXAGON_CONTROL_WRAPPER_H_ -#include "mace/dsp/hexagon/hexagon_nn.h" +#include "mace/dsp/hexagon/hexagon_controller.h" #include "mace/dsp/hexagon_nn_ops.h" #include "mace/core/common.h" #include "mace/core/tensor.h" @@ -57,18 +57,18 @@ class HexagonControlWrapper { void PrintLog(); void PrintGraph(); void GetPerfInfo(); + void ResetPerfInfo(); void SetDebugLevel(int level); private: // CAVEAT: Need offset as HVX library reserves some ids static constexpr int NODE_ID_OFFSET = 10000; - uint32_t node_id(uint32_t nodeid) { + inline uint32_t node_id(uint32_t nodeid) { return NODE_ID_OFFSET + nodeid; } int nn_id_; - OpMap op_map_; Serializer serializer_; vector input_shape_; diff --git a/mace/dsp/hexagon_control_wrapper_test.cc b/mace/dsp/hexagon_control_wrapper_test.cc index fcc4176e..48a743c6 100644 --- a/mace/dsp/hexagon_control_wrapper_test.cc +++ b/mace/dsp/hexagon_control_wrapper_test.cc @@ -13,22 +13,34 @@ TEST(HexagonControlerWrapper, GetVersion) { HexagonControlWrapper wrapper; VLOG(0) << "version: " << wrapper.GetVersion(); wrapper.Init(); - wrapper.SetDebugLevel(3); + wrapper.SetDebugLevel(0); wrapper.Config(); - VLOG(0) << wrapper.SetupGraph("quantized_test_dsp.pb"); + VLOG(0) << wrapper.SetupGraph("quantized_icnet_dsp.pb"); wrapper.PrintGraph(); Tensor input_tensor; Tensor output_tensor; - input_tensor.Resize({1, 28, 28, 3}); + input_tensor.Resize({1, 480, 480, 3}); float *input_data = input_tensor.mutable_data(); for (int i = 0; i < input_tensor.size(); ++i) { - input_data[i] = i; + input_data[i] = i % 256; } - VLOG(0) << wrapper.ExecuteGraph(input_tensor, &output_tensor); - wrapper.PrintLog(); + wrapper.ResetPerfInfo(); + timeval tv1, tv2; + gettimeofday(&tv1, NULL); + int round = 2; + for (int i = 0; i < round; ++i) { + VLOG(0) << wrapper.ExecuteGraph(input_tensor, &output_tensor); + } + gettimeofday(&tv2, NULL); + VLOG(0) << "avg duration: " + << ((tv2.tv_sec - tv1.tv_sec) * 1000 + + (tv2.tv_usec - tv1.tv_usec) / 1000) / + round; + wrapper.GetPerfInfo(); + wrapper.PrintLog(); const float *output_data = output_tensor.data(); VLOG(0) << output_tensor.size() << output_tensor.dtype(); diff --git a/mace/dsp/hexagon_nn_ops.h b/mace/dsp/hexagon_nn_ops.h index 26622973..e66548d4 100644 --- a/mace/dsp/hexagon_nn_ops.h +++ b/mace/dsp/hexagon_nn_ops.h @@ -12,6 +12,9 @@ namespace mace { #define OP_INVALID -1 +// The following macros are deprecated unless we found cache op meta in stub +// is necessary for performance or other causes. + typedef enum op_type_enum { #define DEF_OP(NAME, ...) OP_##NAME, @@ -21,6 +24,14 @@ typedef enum op_type_enum { #undef DEF_OP } op_type; + +#define DEF_OP(NAME,...) #NAME, +static const char *hexagon_nn_op_names[NN_OPS_MAX] = { +#include "mace/dsp/ops.h" +}; +#undef DEF_OP + + class OpMap { public: void Init() { -- GitLab