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>
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)
/** @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;
delete weight_data_;
if (program_data_ != nullptr)
delete program_data_;
+ if (extended_meta_ != nullptr)
+ delete extended_meta_;
}
/**
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; }
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) */
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_;
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) {
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";
bool stop_;
bool first_run_;
std::thread task_;
+
+ int extended_dbuf_fd_;
+ size_t extended_size_;
};
/**
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;
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
{
return -ENOENT;
task->get_profile (profile);
+
+ if (task->get_extended_size () != 0)
+ manipulateProfile (task, profile);
+
task_map_.remove (taskid);
return 0;