From: Dongju Chae Date: Thu, 14 Jan 2021 10:57:50 +0000 (+0900) Subject: [Profile] Implement vISA to layer (tensor name) mapping X-Git-Tag: accepted/tizen/unified/20220103.130045~231 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e2c0a4b993496f97cf3841ad974e4e0a58108446;p=platform%2Fadaptation%2Fnpu%2Ftrix-engine.git [Profile] Implement vISA to layer (tensor name) mapping This patch implements vISA to layer (tensor name) mapping. Signed-off-by: Dongju Chae --- diff --git a/src/core/npu/NPUdrvAPI_emul.cc b/src/core/npu/NPUdrvAPI_emul.cc index 1d07bca..f0433a7 100644 --- a/src/core/npu/NPUdrvAPI_emul.cc +++ b/src/core/npu/NPUdrvAPI_emul.cc @@ -654,18 +654,24 @@ TrinityEmulAPI::stop_target (int taskid) const void TrinityEmulAPI::manipulateProfile (EmulTask *task, npu_profile *profile) const { + std::vector profile_layers; + std::unordered_map 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 (elem->getAddr ()); - - fprintf (stderr, "%u %u\n", meta_profile->total_size, meta_profile->entry_num); + npubin_meta_profile *meta_profile = + static_cast (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