[Profile] Implement vISA to layer (tensor name) mapping
authorDongju Chae <dongju.chae@samsung.com>
Thu, 14 Jan 2021 10:57:50 +0000 (19:57 +0900)
committer채동주/On-Device Lab(SR)/Staff Engineer/삼성전자 <dongju.chae@samsung.com>
Fri, 15 Jan 2021 09:40:42 +0000 (18:40 +0900)
This patch implements vISA to layer (tensor name) mapping.

Signed-off-by: Dongju Chae <dongju.chae@samsung.com>
src/core/npu/NPUdrvAPI_emul.cc

index 1d07bca..f0433a7 100644 (file)
@@ -654,18 +654,24 @@ TrinityEmulAPI::stop_target (int taskid) const
 void
 TrinityEmulAPI::manipulateProfile (EmulTask *task, npu_profile *profile) const
 {
+  std::vector<npu_profile_layer *> profile_layers;
+  std::unordered_map<std::string, npu_profile_layer *> profile_layer_map;
   int dbuf_fd = task->get_extended_dbuf_fd ();
   size_t size = task->get_extended_size ();
 
   EmulElement *elem = elem_map_.find (dbuf_fd);
-  if (elem == nullptr || elem->getAddr () == nullptr)
+  if (elem == nullptr || elem->getAddr () == nullptr) {
+    std::cerr << "No available extended metadata" << std::endl;
     return;
-  if (elem->getSize () != size)
+  }
+  if (elem->getSize () != size) {
+    std::cerr << "Extended metadata size mismatch: ";
+    std::cerr << elem->getSize () << " vs. " << size << std::endl;
     return;
+  }
 
-  npubin_meta_profile *meta_profile = static_cast<npubin_meta_profile *> (elem->getAddr ());
-
-  fprintf (stderr, "%u %u\n", meta_profile->total_size, meta_profile->entry_num);
+  npubin_meta_profile *meta_profile =
+         static_cast<npubin_meta_profile *> (elem->getAddr ());
 
   uint32_t pos = 0;
   for (uint32_t i = 0; i < meta_profile->entry_num; i++) {
@@ -674,16 +680,56 @@ TrinityEmulAPI::manipulateProfile (EmulTask *task, npu_profile *profile) const
     memcpy (&id, meta_profile->entry_data + pos, sizeof(id));
     pos += sizeof (id);
 
+    if (id != i) {
+      std::cerr << "Invalid instruction index detected: ";
+      std::cerr << id << " vs. " << i << std::endl;
+      return;
+    }
+
     memcpy (&len, meta_profile->entry_data + pos, sizeof(len));
     pos += sizeof (len);
 
+    npu_profile_layer * layer;
     if (len != 0) {
       std::string str (meta_profile->entry_data + pos);
       pos += len;
 
-      // TODO: DO SOMETHING
+      auto it = profile_layer_map.find (str);
+      if (it != profile_layer_map.end ()) {
+        layer = it->second;
+
+        layer->running_cycles += profile->layers[i].running_cycles;
+        layer->dram_read_bytes += profile->layers[i].dram_read_bytes;
+        layer->dram_write_bytes += profile->layers[i].dram_write_bytes;
+        layer->sram_read_bytes += profile->layers[i].sram_read_bytes;
+        layer->sram_write_bytes += profile->layers[i].sram_write_bytes;
+      } else {
+        layer = &profile->layers[i];
+
+        snprintf (layer->name, NPU_OPNAME_MAX - 1, "%s", str.c_str ());
+        layer->name[NPU_OPNAME_MAX - 1] = '\x00';
+
+        profile_layers.push_back (layer);
+        profile_layer_map.insert (std::make_pair (str, layer));
+      }
+    } else {
+      layer = &profile->layers[i];
+      profile_layers.push_back (layer);
     }
   }
+
+  size_t num_layers = profile_layers.size ();
+  if (num_layers > 0) {
+    npu_profile_layer * new_layers = new npu_profile_layer[num_layers];
+
+    for (size_t i = 0; i < num_layers; i++)
+      memcpy (&new_layers[i], profile_layers[i], sizeof (npu_profile_layer));
+
+    delete [] profile->layers;
+
+    profile->layers = new_layers;
+    profile->num_layers = num_layers;
+  }
 }
 
 int