[Triv2] Fix calculating input/output tensor sizes on TRIV2 layout
authorDongju Chae <dongju.chae@samsung.com>
Mon, 6 Jul 2020 06:17:11 +0000 (15:17 +0900)
committer송욱/On-Device Lab(SR)/Staff Engineer/삼성전자 <wook16.song@samsung.com>
Thu, 9 Jul 2020 07:33:41 +0000 (16:33 +0900)
This patch fixes calculating input/output tensor sizes on TRIV2 layout

Signed-off-by: Dongju Chae <dongju.chae@samsung.com>
include/common/npubinfmt.h
src/core/ne-handler.cc
src/core/ne-model.cc
src/core/npu/NPUdrvAPI_emul.cc
tests/unittests/ne_core_buffer_test.cc
tests/unittests/ne_core_handler_test.cc

index 3bc83f1..ea9ed54 100644 (file)
@@ -47,6 +47,7 @@ static inline uint64_t NPUBIN_META_TOTAL_SIZE (uint64_t magiccode) {
 #define MAX_RANK    (4)
 #define MAX_SEGMENTS (256) /* 8-bit segment indexing */
 #define DATA_GRANULARITY (64) /* MPA_L */
+#define DATA_GRANULARITY_SHIFT (6)
 
 /* npubinfmt magiccode macros */
 #define NPUBIN_MAGICCODE (0x53524E5055000000ULL)  /* ASCII hex for 'SRNPU' */
index a93b0e4..6bd386b 100644 (file)
@@ -1281,8 +1281,8 @@ TrinityVision2::setModel (const generic_buffer *model_buf, Model ** model_ptr)
     return -EPERM;
   }
 
-       if (model_buf == nullptr || model_ptr == nullptr)
-               return -EINVAL;
+  if (model_buf == nullptr || model_ptr == nullptr)
+    return -EINVAL;
 
   Model *model;
   int status;
@@ -1478,13 +1478,14 @@ TrinityVision2::callback (Request *req, npuOutputNotify cb, void *cb_data)
     output.bufs[idx].type = BUFFER_MAPPED;
     output.bufs[idx].size = output_tensor_size;
     /** user needs to free this */
-    output.bufs[idx].addr = malloc (output_tensor_size);
+    output.bufs[idx].addr = calloc (1, output_tensor_size);
 
     auto func = std::bind (TrinityVision2::manipulateData, model, idx, false,
         std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
     int status = comm_.insertGenericBuffer (
         segt->getOutputSegment(idx)->getData() + segt->getOutputSegmentOffset(idx),
         &output.bufs[idx], func);
+
     if (status != 0) {
       logerr (TAG, "Failed to return output buffer: %d\n", status);
     }
index bcd4a81..0729d24 100644 (file)
@@ -146,7 +146,13 @@ Metadata_v2::getInputTensorSize (uint32_t idx, data_layout layout) const
   /** special handling for TRIV */
   if (layout == DATA_LAYOUT_SRNPU && dims[3] != 3 &&
       dims[3] % DATA_GRANULARITY != 0) {
-    tensor_size *= (1 + dims[3] / DATA_GRANULARITY);
+    uint32_t depth;
+
+    depth = (dims[3] + DATA_GRANULARITY - 1) >> DATA_GRANULARITY_SHIFT;
+    depth = depth * DATA_GRANULARITY;
+
+    tensor_size /= dims[3];
+    tensor_size *= depth;
   }
 
   return tensor_size;
@@ -168,7 +174,13 @@ Metadata_v2::getOutputTensorSize (uint32_t idx, data_layout layout) const
   /** special handling for TRIV */
   if (layout == DATA_LAYOUT_SRNPU && dims[3] != 3 &&
       dims[3] % DATA_GRANULARITY != 0) {
-    tensor_size *= (1 + dims[3] / DATA_GRANULARITY);
+    uint32_t depth;
+
+    depth = (dims[3] + DATA_GRANULARITY - 1) >> DATA_GRANULARITY_SHIFT;
+    depth = depth * DATA_GRANULARITY;
+
+    tensor_size /= dims[3];
+    tensor_size *= depth;
   }
 
   return tensor_size;
@@ -233,6 +245,18 @@ Metadata_v3::getInputTensorSize (uint32_t idx, data_layout layout) const
   for (uint32_t rank_idx = 0; rank_idx < MAX_RANK; rank_idx++)
     tensor_size *= dims[rank_idx];
 
+  /** special handling for TRIV2 */
+  if (layout == DATA_LAYOUT_TRIV2 && dims[3] != 3 &&
+      dims[3] % DATA_GRANULARITY != 0) {
+    uint32_t depth;
+
+    depth = (dims[3] + DATA_GRANULARITY - 1) >> DATA_GRANULARITY_SHIFT;
+    depth = depth * DATA_GRANULARITY;
+
+    tensor_size /= dims[3];
+    tensor_size *= depth;
+  }
+
   return tensor_size;
 }
 
@@ -251,6 +275,18 @@ Metadata_v3::getOutputTensorSize (uint32_t idx, data_layout layout) const
   for (uint32_t rank_idx = 0; rank_idx < MAX_RANK; rank_idx++)
     tensor_size *= dims[rank_idx];
 
+  /** special handling for TRIV2 */
+  if (layout == DATA_LAYOUT_TRIV2 && dims[3] != 3 &&
+      dims[3] % DATA_GRANULARITY != 0) {
+    uint32_t depth;
+
+    depth = (dims[3] + DATA_GRANULARITY - 1) >> DATA_GRANULARITY_SHIFT;
+    depth = depth * DATA_GRANULARITY;
+
+    tensor_size /= dims[3];
+    tensor_size *= depth;
+  }
+
   return tensor_size;
 }
 
index 0219bfa..ec534b6 100644 (file)
@@ -126,6 +126,7 @@ TrinityEmulAPI::TrinityEmulAPI (int dev_id, dev_type type)
 TrinityEmulAPI::~TrinityEmulAPI ()
 {
   elem_map_.clear();
+  stat_map_.clear();
 }
 
 /**
index 9628113..e064ac7 100644 (file)
@@ -49,8 +49,9 @@ fill_test_metadata_v2 (npubin_meta & data, uint32_t input_num, uint32_t output_n
   for (uint32_t i = 0; i < data.input_num; i++) {
     data.input_offsets[i] = 100 * (i + 1);
     data.input_elem_size[i] = 1 * (i + 1);
-    for (uint32_t j = 0; j < MAX_RANK; j++)
-      data.input_dims[i][j] = 2 * (i + 1);
+    for (uint32_t j = 0; j < MAX_RANK - 1; j++)
+      data.input_dims[i][j] = 1 * (i + 1);
+    data.input_dims[i][MAX_RANK - 1] = DATA_GRANULARITY;
     data.input_quant_z[i] = 3 * (i + 1);
     data.input_quant_s[i] = 4 * (i + 1);
   }
@@ -59,8 +60,9 @@ fill_test_metadata_v2 (npubin_meta & data, uint32_t input_num, uint32_t output_n
   for (uint32_t i = 0; i < data.output_num; i++) {
     data.output_offsets[i] = 100 * (i + 1);
     data.output_elem_size[i] = 1 * (i + 1);
-    for (uint32_t j = 0; j < MAX_RANK; j++)
-      data.output_dims[i][j] = 2 * (i + 1);
+    for (uint32_t j = 0; j < MAX_RANK -1; j++)
+      data.output_dims[i][j] = 1 * (i + 1);
+    data.output_dims[i][MAX_RANK - 1] = DATA_GRANULARITY;
     data.output_quant_z[i] = 3 * (i + 1);
     data.output_quant_s[i] = 4 * (i + 1);
   }
index 4a07752..6ab1479 100644 (file)
@@ -293,10 +293,12 @@ create_model_buffer_v2 (generic_buffer & model_buf)
 
     meta.input_offsets[i] = 0;
     meta.output_offsets[i] = 0;
-    for (uint32_t j = 0; j < MAX_RANK; j++) {
-      meta.input_dims[i][j] = 8;
-      meta.output_dims[i][j] = 8;
+    for (uint32_t j = 0; j < MAX_RANK - 1; j++) {
+      meta.input_dims[i][j] = 2;
+      meta.output_dims[i][j] = 2;
     }
+    meta.input_dims[i][MAX_RANK - 1] = DATA_GRANULARITY;
+    meta.output_dims[i][MAX_RANK - 1] = DATA_GRANULARITY;
   }
   /* no instructions */
   meta.program_size = 0;