/**
* @brief Get metadata for NPU model
* @param[in] model The path of model binary file
- * @param[in] need_extra whether you want to extract the extra data in metadata
+ * @param[in] need_extended whether you want to extract the extended metadata in metadata
* @return the metadata structure to be filled if no error, otherwise NULL
*
- * @note For most npu-engine users, the extra data is not useful because it will be
- * used for second-party users (e.g., compiler, simulator).
- * Also, the caller needs to free the metadata.
- *
- * @note the caller needs to free the metadata
+ * @note For most npu-engine users, the extended metadata is not useful because
+ * it will be used for second-party users (e.g., compiler, simulator).
+ * @note the caller needs to free the metadata.
+ */
+npubin_meta *getNPUmodel_metadata (const char *model, bool need_extended);
+
+/**
+ * @brief Get total metadata size including extended metadata
+ * @param[in] meta the extracted metadata
+ * @return total metadata size
*/
-npubin_meta *getNPUmodel_metadata (const char *model, bool need_extra);
+static inline uint64_t
+getNPUmodel_metasize (npubin_meta *meta) {
+ if (meta == nullptr)
+ return 0;
+
+ uint64_t extended_metasize = meta->extended_metasize;
+ /* for backward compatibility */
+ if (extended_metasize == 0)
+ extended_metasize = NPUBIN_META_EXTENDED_SIZE (meta->magiccode);
+
+ return NPUBIN_META_SIZE + extended_metasize;
+}
/**
* @brief Send the NN model to NPU.
uint64_t getProgramSize () const { return meta_->program_size; }
uint64_t getWeightSize () const { return meta_->weight_size; }
uint64_t getBufferSize () const { return meta_->buffer_size; }
- uint32_t getMetaSize () const {
- return NPUBIN_META_TOTAL_SIZE (meta_->magiccode);
+ uint64_t getMetaSize () const {
+ return NPUBIN_META_SIZE + getMetaExtendedSize ();
}
- uint32_t getMetaExtendedSize () const {
- return NPUBIN_META_EXTENDED_SIZE (meta_->magiccode);
+ uint64_t getMetaExtendedSize () const {
+ if (meta_->extended_metasize == 0)
+ return NPUBIN_META_EXTENDED_SIZE (meta_->magiccode);
+ return meta_->extended_metasize;
}
uint32_t getTops () const { return NPU_VERSION_TOPS (getNPUVersion ()); }
npubin_meta *
getNPUmodel_metadata (const char *model, bool need_extended) {
npubin_meta *meta;
+ uint64_t extended_metasize;
FILE *fp;
size_t ret;
goto exit_free;
}
- if (need_extended && NPUBIN_META_NUM_EXTENDED (meta->magiccode) > 0) {
+ extended_metasize = meta->extended_metasize;
+ if (extended_metasize == 0)
+ extended_metasize = NPUBIN_META_EXTENDED_SIZE (meta->magiccode);
+ if (extended_metasize > UINT32_MAX) {
+ logwarn (TAG, "extended metasize is too large: %u\n", extended_metasize);
+ extended_metasize = 0;
+ }
+
+ if (need_extended && extended_metasize > 0) {
npubin_meta *new_meta;
- new_meta =
- (npubin_meta *) malloc (NPUBIN_META_TOTAL_SIZE (meta->magiccode));
+ new_meta = (npubin_meta *) malloc (NPUBIN_META_SIZE + extended_metasize);
if (!new_meta) {
logerr (TAG, "Failed to allocate extended metadata\n");
goto exit_free;
memcpy (new_meta, meta, NPUBIN_META_SIZE);
free (meta);
meta = nullptr;
- ret = fread (new_meta->reserved_extended, 1,
- NPUBIN_META_EXTENDED_SIZE (new_meta->magiccode), fp);
- if (ret != NPUBIN_META_EXTENDED_SIZE (new_meta->magiccode)) {
+ ret = fread (new_meta->reserved_extended, 1, extended_metasize, fp);
+ if (ret != extended_metasize) {
logerr (TAG, "Invalid extended metadata provided\n");
free (new_meta);
goto exit_err;
EXPECT_EQ (buffer->getInputTensor (0)->getSize (), exp_size_v1);
EXPECT_EQ (buffer->getOutputTensor (0)->getSize (), exp_size_v1);
- npubin_meta data;
+ npubin_meta data = {0};
/** with metadata v1 */
uint32_t input_size = 1024;
uint32_t output_size = 2048;
uint32_t input_num = 2;
uint32_t output_num = 3;
- npubin_meta data;
+ npubin_meta data = {0};
fill_test_metadata_v2 (data, input_num, output_num);
ASSERT_EQ (buffer->alloc (data.buffer_size), 0);
EXPECT_GT (model->getID (), (uint32_t) 0);
/** make dummy metadata */
- npubin_meta data;
+ npubin_meta data = {0};
data.magiccode = NPUBIN_MAGICCODE | 0x1; /* v1 */
data.size = 4096;
data.buffer_size = 4096;
EXPECT_NE (model->setMetadata (nullptr), 0);
/** make dummy metadata */
- npubin_meta data;
+ npubin_meta data = {0};
data.magiccode = NPUBIN_MAGICCODE | 0x1; /* v1 */
data.size = 4096;
data.buffer_size = 4096;
std::unique_ptr<Model> model (new Model (new HWmemDevice));
/** start with the valid metadata */
- npubin_meta data;
+ npubin_meta data = {0};
data.magiccode = NPUBIN_MAGICCODE | 0x1; /* v1 */
data.size = 8192;
data.program_size = 2048;
std::unique_ptr<Model> model (new Model (new HWmemDevice));
/** make dummy metadata v1 */
- npubin_meta data;
+ npubin_meta data = {0};
const uint32_t exp_meta_size_v1 = 4096;
const uint32_t exp_num_tensors_v1 = 1;
std::unique_ptr<Model> model (new Model (new HWmemDevice));
/** make dummy metadata v2 */
- npubin_meta data;
+ npubin_meta data = {0};
data.magiccode = NPUBIN_MAGICCODE | 0x2; /* v2 */
data.size = 8192;
std::unique_ptr<Model> model (new Model (new HWmemDevice));
/** make dummy metadata v3 */
- npubin_meta data;
+ npubin_meta data = {0};
data.magiccode = NPUBIN_MAGICCODE | 0x3; /* v3 */
data.size = 8192;
std::unique_ptr<Model> model (new Model (new HWmemDevice));
model->setDriverAPI (api.get ());
- npubin_meta meta;
+ npubin_meta meta = {0};
create_metadata_v3 (meta);
ASSERT_EQ (model->setMetadata (&meta), 0);
ASSERT_EQ (model->alloc (meta.size), 0);
std::unique_ptr<Model> model (new Model (new HWmemDevice));
model->setDriverAPI (api.get ());
- npubin_meta meta;
+ npubin_meta meta = {0};
create_metadata_v3 (meta);
ASSERT_EQ (model->setMetadata (&meta), 0);
ASSERT_EQ (model->alloc (meta.size), 0);
std::unique_ptr<Model> model (new Model (new HWmemDevice));
model->setDriverAPI (api.get ());
- npubin_meta meta;
+ npubin_meta meta = {0};
create_metadata_v3 (meta);
ASSERT_EQ (model->setMetadata (&meta), 0);
ASSERT_EQ (model->alloc (meta.size), 0);
<< "\n";
std::cout << " model format: " << NPUBIN_VERSION (meta_->magiccode) << "\n";
std::cout << " model size: " << meta_->size << "\n";
- std::cout << " - metadata size: "
- << NPUBIN_META_TOTAL_SIZE (meta_->magiccode) << "\n";
+ std::cout << " - metadata size: " << getNPUmodel_metasize (meta_) << "\n";
std::cout << " - program size: " << meta_->program_size << "\n";
std::cout << " - weight size: " << meta_->weight_size << "\n";
std::cout << "\n";
void
Inspector::dump () {
- size_t size_metadata = NPUBIN_META_TOTAL_SIZE (meta_->magiccode);
+ size_t size_metadata = getNPUmodel_metasize (meta_);
if (dump_meta_) {
std::ofstream ofs (dump_output_ + "/metadata.bin", std::ios::binary);