[Profile] Get per-layer profiling info. from extended metadata
authorDongju Chae <dongju.chae@samsung.com>
Tue, 12 Jan 2021 07:21:07 +0000 (16:21 +0900)
committer파리차이카푸르/On-Device Lab(SR)/Engineer/삼성전자 <pk.kapoor@samsung.com>
Fri, 15 Jan 2021 01:53:59 +0000 (10:53 +0900)
This patch gets per-layer profiling info. from extended metadata.
The detail parsing will be implemented soon.

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

index 2790207..f280d81 100644 (file)
@@ -839,11 +839,33 @@ TrinityVision2::setModel (const generic_buffer *model_buf, Model ** model_ptr)
     config.dbuf_fd = hwmem_prog->getDmabuf ();
     config.program_size = hwmem_prog->getSize ();
     config.program_offset_addr = 0;
+    config.metadata_dbuf_fd = model->getDmabuf ();
 
     /** for metadata extended section */
-    config.metadata_dbuf_fd = model->getDmabuf ();
-    config.metadata_extra_addr = NPUBIN_META_SIZE;
-    config.metadata_extra_size = model->getMetadata()->getMetaExtendedSize ();
+    size_t extended_size = model->getMetadata()->getMetaExtendedSize();
+    if (extended_size > 0) {
+      HWmem * hwmem_extended = new HWmem (new HWmemDevice);
+      hwmem_extended->setDriverAPI (api_.get ());
+
+      model->setExtendedMetadata (hwmem_extended);
+
+      status = hwmem_extended->alloc (extended_size);
+      if (status != 0) {
+        logerr (TAG, "Failed to allocate extended metadata: %d\n", status);
+        goto delete_exit;
+      }
+
+      /** FIXME: the variable name should be changed */
+      config.metadata_extra_addr = hwmem_extended->getDmabuf ();
+      config.metadata_extra_size = extended_size;
+
+      status = comm_.extractGenericBuffer (model_buf, hwmem_extended->getData (),
+          nullptr, NPUBIN_META_SIZE, extended_size);
+      if (status != 0) {
+        logerr (TAG, "Failed to extract generic buffer: %d\n", status);
+        goto delete_exit;
+      }
+    }
 
     status = api_->registerModel (&config, model->getMetadata()->getNPUVersion());
     if (status != 0)
index dd7e08d..6933f18 100644 (file)
@@ -344,7 +344,8 @@ Metadata_v3::getOutputTensorSize (uint32_t idx, data_layout layout) const
 
 /** @brief constructor of model class */
 Model::Model (const HWmemImpl* impl)
-  : HWmem (impl), weight_data_ (nullptr), program_data_ (nullptr), meta_ (nullptr)
+  : HWmem (impl), weight_data_ (nullptr), program_data_ (nullptr),
+  extended_meta_ (nullptr), meta_ (nullptr)
 {
   model_id_ = global_model_id_.fetch_add(1);
   internal_id_ = 0xFFFFFFFFFFFFFFFF;
@@ -369,6 +370,8 @@ Model::~Model ()
     delete weight_data_;
   if (program_data_ != nullptr)
     delete program_data_;
+  if (extended_meta_ != nullptr)
+    delete extended_meta_;
 }
 
 /**
index 958b5b7..e60be65 100644 (file)
@@ -334,6 +334,7 @@ class Model : public HWmem {
     void setConstraint (const npuConstraint& constraint) { constraint_ = constraint; }
     int setDataInfo (const tensors_data_info *in, const tensors_data_info *out);
     int setMetadata (void *data);
+    void setExtendedMetadata (HWmem *data) { extended_meta_ = data; }
     void setWeightData (HWmem *data) { weight_data_ = data; }
     void setProgramData (HWmem *data) { program_data_ = data; }
     void setInternalID (uint64_t id) { internal_id_ = id; }
@@ -363,10 +364,11 @@ class Model : public HWmem {
   private:
     static std::atomic<uint32_t> global_model_id_;  /**< global model id */
     uint32_t model_id_;         /**< model id */
-    uint64_t internal_id_;     /**< model id internally managed by the device */
+    uint64_t internal_id_;      /**< model id internally managed by the device */
 
-    HWmem * weight_data_;        /**< weight data */
-    HWmem * program_data_;        /**< weight data */
+    HWmem * weight_data_;       /**< weight data */
+    HWmem * program_data_;      /**< weight data */
+    HWmem * extended_meta_;     /**< extended metadata */
 
     std::unique_ptr<Metadata> meta_;            /**< metadata */
     npuConstraint constraint_;  /**< per-model constraint (e.g., timeout/priority) */
index 68d2d71..b76081c 100644 (file)
@@ -204,6 +204,7 @@ class TrinityEmulAPI : public DriverAPI {
     int deregisterModel (unsigned long long id) const;
 
     int getProfile (int task_id, npu_profile *profile) const;
+    void manipulateProfile (EmulTask *task, npu_profile *profile) const;
 
   private:
     static std::atomic<int> global_fd_;
index 142025b..1d07bca 100644 (file)
@@ -29,7 +29,9 @@
 
 class EmulTask {
   public:
-    EmulTask (int taskid) : taskid_ (taskid), stop_ (false), first_run_ (false) {}
+    EmulTask (int taskid) :
+      taskid_ (taskid), stop_ (false), first_run_ (false),
+      extended_dbuf_fd_ (0), extended_size_ (0) {}
 
     void run_emul (char *prog, char **segt, char *metadata,
         std::string cmd_path, std::string prof_path) {
@@ -55,6 +57,19 @@ class EmulTask {
       task_.join ();
     }
 
+    void set_extended (int dbuf_fd, size_t size) {
+      extended_dbuf_fd_ = dbuf_fd;
+      extended_size_ = size;
+    }
+
+    int get_extended_dbuf_fd () {
+      return extended_dbuf_fd_;
+    }
+
+    size_t get_extended_size () {
+      return extended_size_;
+    }
+
     void get_profile (npu_profile *profile) {
       std::string path (DEFAULT_PROFILE_PATH);
       path += "/ne_profile." + std::to_string (taskid_) + ".rec";
@@ -131,6 +146,9 @@ class EmulTask {
     bool stop_;
     bool first_run_;
     std::thread task_;
+
+    int extended_dbuf_fd_;
+    size_t extended_size_;
 };
 
 /**
@@ -584,6 +602,7 @@ TrinityEmulAPI::runInput (input_config_t *input_config) const
         prog, segment_table, static_cast <char*> (elem_metadata->getAddr ()),
         cmd_path, prof_path);
 
+    task->set_extended (model->metadata_extra_addr, model->metadata_extra_size);
     task->run (func);
     status = taskid;
 
@@ -632,6 +651,41 @@ TrinityEmulAPI::stop_target (int taskid) const
   return 0;
 }
 
+void
+TrinityEmulAPI::manipulateProfile (EmulTask *task, npu_profile *profile) const
+{
+  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)
+    return;
+  if (elem->getSize () != size)
+    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);
+
+  uint32_t pos = 0;
+  for (uint32_t i = 0; i < meta_profile->entry_num; i++) {
+    uint32_t id, len;
+
+    memcpy (&id, meta_profile->entry_data + pos, sizeof(id));
+    pos += sizeof (id);
+
+    memcpy (&len, meta_profile->entry_data + pos, sizeof(len));
+    pos += sizeof (len);
+
+    if (len != 0) {
+      std::string str (meta_profile->entry_data + pos);
+      pos += len;
+
+      // TODO: DO SOMETHING
+    }
+  }
+}
+
 int
 TrinityEmulAPI::getProfile (int taskid, npu_profile *profile) const
 {
@@ -643,6 +697,10 @@ TrinityEmulAPI::getProfile (int taskid, npu_profile *profile) const
     return -ENOENT;
 
   task->get_profile (profile);
+
+  if (task->get_extended_size () != 0)
+    manipulateProfile (task, profile);
+
   task_map_.remove (taskid);
 
   return 0;