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++) {
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