[nnpkg_run] implement dump (in h5 format) (#6669)
author이상규/On-Device Lab(SR)/Principal Engineer/삼성전자 <sg5.lee@samsung.com>
Mon, 26 Aug 2019 09:55:03 +0000 (05:55 -0400)
committer이춘석/On-Device Lab(SR)/Staff Engineer/삼성전자 <chunseok.lee@samsung.com>
Mon, 26 Aug 2019 09:55:03 +0000 (18:55 +0900)
It dumps outputs in h5 format.

Signed-off-by: Sanggyu Lee <sg5.lee@samsung.com>
tests/tools/nnpackage_run/src/nnpackage_run.cc

index eee0361..dce5dbd 100644 (file)
@@ -61,14 +61,6 @@ std::vector<float> randomData(RandomGenerator &randgen, uint64_t size)
 
 static const char *h5_value_grpname = "value";
 
-int dump(const std::string filename)
-{
-  hid_t file_id;
-  herr_t status;
-  file_id = H5Fcreate(filename.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-  return H5Fclose(file_id);
-}
-
 int main(const int argc, char **argv)
 {
   NNPackageRun::Args args(argc, argv);
@@ -229,8 +221,32 @@ int main(const int argc, char **argv)
 
   // dump output tensors
 
+  auto dumpOutputs = [session, num_outputs, &outputs](std::string filename) {
+    hid_t file_id = H5Fcreate(filename.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    for (uint32_t i = 0; i < num_outputs; i++)
+    {
+      nnfw_tensorinfo ti;
+      NNPR_ENSURE_STATUS(nnfw_output_tensorinfo(session, i, &ti));
+      std::vector<hsize_t> dims;
+      dims.resize(ti.rank);
+      for (uint32_t j = 0; j < ti.rank; ++j)
+      {
+        assert(ti.dims[j] >= 0);
+        dims[j] = ti.dims[j];
+      }
+      hid_t valgrp_id = H5Gcreate(file_id, h5_value_grpname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+      hid_t dsp_id = H5Screate_simple(ti.rank, dims.data(), NULL);
+      hid_t dset_id = H5Dcreate2(valgrp_id, std::to_string(i).c_str(), H5T_IEEE_F32BE, dsp_id,
+                                 H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+      H5Dwrite(dset_id, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, outputs[i].data());
+      H5Dclose(dset_id);
+      H5Sclose(dsp_id);
+    }
+    H5Fclose(file_id);
+  };
+
   if (!args.getDumpFilename().empty())
-    dump(args.getDumpFilename());
+    dumpOutputs(args.getDumpFilename());
 
   std::cout << "nnfw_prepare takes " << prepare_ms / 1e3 << " sec" << std::endl;
   std::cout << "nnfw_run     takes " << run_ms / 1e3 << " sec" << std::endl;