3 * Copyright (C) 2020 Samsung Electronics
4 * Copyright (C) 2020 Dongju Chae <dongju.chae@samsung.com>
7 * @file dummy_triv2_sync.cc
9 * @brief AppTest to test run_sync for TRIV2 with dummy input/output.
10 * @author Dongju Chae <dongju.chae@samsung.com>
11 * @bug No known bugs except for NYI items
14 #include <libnpuhost.h>
19 #define TRIV2_TYPE NPUCOND_TRIV2_CONN_SOCIP /** ./include/typedef.h */
21 /** @brief c++ class to describe how to use npu-engine library */
24 TesterTRIV2 () : dev_ (nullptr), model_id_ (0) {
25 memset (&input_, '\x00', sizeof (input_buffers));
29 /** release resources */
30 if (dev_ != nullptr) {
31 if (input_.num_buffers != 0)
32 cleanNPU_inputBuffers (dev_, &input_);
35 unregisterNPUmodel (dev_, model_id_);
41 /** @brief initilize the device handle */
43 int num_devices = getnumNPUdeviceByType (TRIV2_TYPE);
47 /** use any available TRIV2 device. (0 <= dev_id < num_devices) */
48 int dev_id = num_devices - 1;
49 return getNPUdeviceByType (&dev_, TRIV2_TYPE, dev_id);
52 /** @brief run the inference (with dummy data) */
54 int status = prepare_model ();
58 status = prepare_input ();
62 output_buffers output;
63 status = runNPU_sync (dev_, model_id_, &input_, &output);
67 return compare_result (output);
71 const uint64_t weight_size = 0x1000;
72 const uint32_t segment_size = 0x1000;
74 int prepare_model () {
78 memset (&meta, '\x00', sizeof (npubin_meta));
80 meta.magiccode = NPUBIN_MAGICCODE | 0x3; /** npubinfmt v3 for TRIV2 */
81 meta.program_size = 0;
82 meta.weight_size = weight_size;
83 meta.size = NPUBIN_META_SIZE + weight_size;
84 meta.type = SMODEL_OPS_NPU;
86 /** TRIV2 requires segment table */
88 for (uint32_t idx = 0; idx < meta.segment_num; idx++) meta.segment_size[idx] = segment_size;
90 meta.weight_seg_idx = 0;
92 meta.input_seg_num = 1;
93 meta.input_seg_idx[0] = 1;
94 meta.input_seg_off[0] = 0;
95 meta.input_seg_dims[0][0] = 1;
96 meta.input_seg_dims[0][1] = 1;
97 meta.input_seg_dims[0][2] = 1;
98 meta.input_seg_dims[0][3] = segment_size;
100 meta.output_seg_num = 1;
101 meta.output_seg_idx[0] = 1;
102 meta.output_seg_off[0] = 0;
103 meta.output_seg_dims[0][0] = 1;
104 meta.output_seg_dims[0][1] = 1;
105 meta.output_seg_dims[0][2] = 1;
106 meta.output_seg_dims[0][3] = segment_size;
108 model.type = BUFFER_MAPPED;
109 model.size = meta.size;
110 int status = allocNPU_modelBuffer (dev_, &model);
114 /** copy only metadata as it's dummy model */
115 memcpy (model.addr, &meta, NPUBIN_META_SIZE);
117 status = registerNPUmodel (dev_, &model, &model_id_);
118 cleanNPU_modelBuffer (dev_, &model);
123 int prepare_input () {
124 input_.num_buffers = 1;
125 input_.bufs[0].type = BUFFER_MAPPED;
126 input_.bufs[0].size = segment_size;
128 return allocNPU_inputBuffers (dev_, &input_);
131 int compare_result (output_buffers &output) {
132 /** return success as it's dummy, but need to free output buffers */
133 for (uint32_t idx = 0; idx < output.num_buffers; idx++) {
134 generic_buffer *buffer = &output.bufs[idx];
135 if (buffer->addr != NULL)
145 input_buffers input_;
148 /** @brief apptest main */
150 main (int argc, char **argv) {
151 #if defined(ENABLE_EMUL)
155 /** initialize triv2 device */
156 status = tester.init ();
160 /** run the inference with the device */
161 status = tester.run ();
165 std::cerr << "[APPTEST] " << argv[0] << ": PASSED\n";
169 std::cerr << "[APPTEST] " << argv[0] << ": FAILED (" << status << ")\n";
172 std::cerr << "[APPTEST] " << argv[0] << ": SKIPPED\n";