[Format] Revise the format of whole source codes
[platform/adaptation/npu/trix-engine.git] / tests / apptests / dummy_triv2_sync.cc
1 /**
2  * Proprietary
3  * Copyright (C) 2020 Samsung Electronics
4  * Copyright (C) 2020 Dongju Chae <dongju.chae@samsung.com>
5  */
6 /**
7  * @file dummy_triv2_sync.cc
8  * @date 27 Apr 2020
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
12  */
13
14 #include <libnpuhost.h>
15 #include <string.h>
16
17 #include <iostream>
18
19 #define TRIV2_TYPE NPUCOND_TRIV2_CONN_SOCIP /** ./include/typedef.h */
20
21 /** @brief c++ class to describe how to use npu-engine library */
22 class TesterTRIV2 {
23  public:
24   TesterTRIV2 () : dev_ (nullptr), model_id_ (0) {
25     memset (&input_, '\x00', sizeof (input_buffers));
26   }
27
28   ~TesterTRIV2 () {
29     /** release resources */
30     if (dev_ != nullptr) {
31       if (input_.num_buffers != 0)
32         cleanNPU_inputBuffers (dev_, &input_);
33
34       if (model_id_ > 0)
35         unregisterNPUmodel (dev_, model_id_);
36
37       putNPUdevice (dev_);
38     }
39   }
40
41   /** @brief initilize the device handle */
42   int init () {
43     int num_devices = getnumNPUdeviceByType (TRIV2_TYPE);
44     if (num_devices <= 0)
45       return -ENODEV;
46
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);
50   }
51
52   /** @brief run the inference (with dummy data) */
53   int run () {
54     int status = prepare_model ();
55     if (status != 0)
56       return status;
57
58     status = prepare_input ();
59     if (status != 0)
60       return status;
61
62     output_buffers output;
63     status = runNPU_sync (dev_, model_id_, &input_, &output);
64     if (status < 0)
65       return status;
66
67     return compare_result (output);
68   }
69
70  private:
71   const uint64_t weight_size = 0x1000;
72   const uint32_t segment_size = 0x1000;
73
74   int prepare_model () {
75     generic_buffer model;
76     npubin_meta meta;
77
78     memset (&meta, '\x00', sizeof (npubin_meta));
79
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;
85
86     /** TRIV2 requires segment table */
87     meta.segment_num = 3;
88     for (uint32_t idx = 0; idx < meta.segment_num; idx++) meta.segment_size[idx] = segment_size;
89
90     meta.weight_seg_idx = 0;
91
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;
99
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;
107
108     model.type = BUFFER_MAPPED;
109     model.size = meta.size;
110     int status = allocNPU_modelBuffer (dev_, &model);
111     if (status != 0)
112       return status;
113
114     /** copy only metadata as it's dummy model */
115     memcpy (model.addr, &meta, NPUBIN_META_SIZE);
116
117     status = registerNPUmodel (dev_, &model, &model_id_);
118     cleanNPU_modelBuffer (dev_, &model);
119
120     return status;
121   }
122
123   int prepare_input () {
124     input_.num_buffers = 1;
125     input_.bufs[0].type = BUFFER_MAPPED;
126     input_.bufs[0].size = segment_size;
127
128     return allocNPU_inputBuffers (dev_, &input_);
129   }
130
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)
136         free (buffer->addr);
137     }
138
139     return 0;
140   }
141
142   npudev_h dev_;
143
144   uint32_t model_id_;
145   input_buffers input_;
146 };
147
148 /** @brief apptest main  */
149 int
150 main (int argc, char **argv) {
151 #if defined(ENABLE_EMUL)
152   TesterTRIV2 tester;
153   int status;
154
155   /** initialize triv2 device */
156   status = tester.init ();
157   if (status != 0)
158     goto err;
159
160   /** run the inference with the device */
161   status = tester.run ();
162   if (status != 0)
163     goto err;
164
165   std::cerr << "[APPTEST] " << argv[0] << ": PASSED\n";
166   return 0;
167
168 err:
169   std::cerr << "[APPTEST] " << argv[0] << ": FAILED (" << status << ")\n";
170   return status;
171 #else
172   std::cerr << "[APPTEST] " << argv[0] << ": SKIPPED\n";
173   return 0;
174 #endif
175 }