return n;
};
-std::vector<float> randomData(RandomGenerator &randgen, const uint64_t size)
+std::vector<float> randomData(RandomGenerator &randgen, uint64_t size)
{
std::vector<float> vec(size);
for (uint64_t i = 0; i < size; i++)
- {
vec[i] = randgen.generate<float>();
- }
return vec;
}
+static const char *h5_value_grpname = "value";
+
int dump(const std::string filename)
{
hid_t file_id;
NNPR_ENSURE_STATUS(nnfw_prepare(session));
prepare_ms = NowMicros() - prepare_ms;
- // Set input (with random values)
+ // prepare input
+
std::vector<std::vector<float>> inputs(num_inputs);
- const int seed = 1; /* TODO Add an option for seed value */
- RandomGenerator randgen{seed, 0.0f, 2.0f};
- for (uint32_t i = 0; i < num_inputs; ++i)
- {
- nnfw_tensorinfo ti;
- NNPR_ENSURE_STATUS(nnfw_input_tensorinfo(session, i, &ti));
- auto input_num_elements = num_elems(&ti);
- inputs[i] = randomData(randgen, input_num_elements);
- NNPR_ENSURE_STATUS(nnfw_set_input(session, i, NNFW_TYPE_TENSOR_FLOAT32, inputs[i].data(),
- sizeof(float) * input_num_elements));
- }
- // Set output
+ auto loadInputs = [session, num_inputs, &inputs](std::string filename) {
+ hid_t file_id = H5Fopen(filename.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT);
+ if (file_id < 0)
+ {
+ std::cerr << "error during opening file " << filename << "." << std::endl;
+ exit(-1);
+ }
+ hid_t valgrp_id = H5Gopen(file_id, h5_value_grpname, H5P_DEFAULT);
+ if (valgrp_id < 0)
+ {
+ std::cerr << "error during opening group " << h5_value_grpname << "." << std::endl;
+ H5Fclose(file_id);
+ exit(-1);
+ }
+ for (uint32_t i = 0; i < num_inputs; ++i)
+ {
+ nnfw_tensorinfo ti;
+ NNPR_ENSURE_STATUS(nnfw_input_tensorinfo(session, i, &ti));
+
+ hid_t dset_id = H5Dopen(valgrp_id, std::to_string(i).c_str(), H5P_DEFAULT);
+ if (dset_id < 0)
+ {
+ std::cerr << "error during opening dataset " << std::to_string(i) << "." << std::endl;
+ H5Gclose(valgrp_id);
+ H5Fclose(file_id);
+ exit(-1);
+ }
+
+ // check type
+ hid_t type = H5Dget_type(dset_id);
+ if (!H5Tequal(type, H5T_IEEE_F32BE))
+ {
+ std::cerr << "h5 input has non-float32 type. nnpkg_run supports float32 only." << std::endl;
+ H5Dclose(dset_id);
+ H5Gclose(valgrp_id);
+ H5Fclose(file_id);
+ exit(-1);
+ }
+ // allocate memory for data
+ auto sz = num_elems(&ti);
+ inputs[i].resize(sz);
+ // read data
+ H5Dread(dset_id, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, inputs[i].data());
+
+ NNPR_ENSURE_STATUS(nnfw_set_input(session, i, NNFW_TYPE_TENSOR_FLOAT32, inputs[i].data(),
+ sizeof(float) * num_elems(&ti)));
+ // clean up
+ H5Dclose(dset_id);
+ }
+ H5Gclose(valgrp_id);
+ H5Fclose(file_id);
+ };
+
+ auto generateInputs = [session, num_inputs, &inputs]() {
+ // generate random data
+ const int seed = 1;
+ RandomGenerator randgen{seed, 0.0f, 2.0f};
+ for (uint32_t i = 0; i < num_inputs; ++i)
+ {
+ nnfw_tensorinfo ti;
+ NNPR_ENSURE_STATUS(nnfw_input_tensorinfo(session, i, &ti));
+ auto input_num_elements = num_elems(&ti);
+ inputs[i] = randomData(randgen, input_num_elements);
+ NNPR_ENSURE_STATUS(nnfw_set_input(session, i, NNFW_TYPE_TENSOR_FLOAT32, inputs[i].data(),
+ sizeof(float) * input_num_elements));
+ }
+ };
+
+ if (!args.getLoadFilename().empty())
+ loadInputs(args.getLoadFilename());
+ else
+ generateInputs();
+
+ // prepare output
+
uint32_t num_outputs = 0;
NNPR_ENSURE_STATUS(nnfw_output_size(session, &num_outputs));
std::vector<std::vector<float>> outputs(num_outputs);
NNPR_ENSURE_STATUS(nnfw_run(session));
run_ms = NowMicros() - run_ms;
- // Dump output tensors
+ // dump output tensors
+
if (!args.getDumpFilename().empty())
dump(args.getDumpFilename());