xref: /dpdk/lib/mldev/rte_mldev.h (revision fe8eba692c59a92c9308f1fe429b101b9f2377bf)
1d82cac58SJerin Jacob /* SPDX-License-Identifier: BSD-3-Clause
2d82cac58SJerin Jacob  * Copyright (c) 2022 Marvell.
3d82cac58SJerin Jacob  */
4d82cac58SJerin Jacob 
5d82cac58SJerin Jacob #ifndef RTE_MLDEV_H
6d82cac58SJerin Jacob #define RTE_MLDEV_H
7d82cac58SJerin Jacob 
8d82cac58SJerin Jacob /**
9d82cac58SJerin Jacob  * @file rte_mldev.h
10d82cac58SJerin Jacob  *
11d82cac58SJerin Jacob  * @warning
12d82cac58SJerin Jacob  * @b EXPERIMENTAL:
13d82cac58SJerin Jacob  * All functions in this file may be changed or removed without prior notice.
14d82cac58SJerin Jacob  *
15d82cac58SJerin Jacob  * ML (Machine Learning) device API.
16d82cac58SJerin Jacob  *
17d82cac58SJerin Jacob  * The ML framework is built on the following model:
18d82cac58SJerin Jacob  *
19d82cac58SJerin Jacob  *
20d82cac58SJerin Jacob  *     +-----------------+               rte_ml_[en|de]queue_burst()
21d82cac58SJerin Jacob  *     |                 |                          |
22d82cac58SJerin Jacob  *     |     Machine     o------+     +--------+    |
23d82cac58SJerin Jacob  *     |     Learning    |      |     | queue  |    |    +------+
24d82cac58SJerin Jacob  *     |     Inference   o------+-----o        |<===o===>|Core 0|
25d82cac58SJerin Jacob  *     |     Engine      |      |     | pair 0 |         +------+
26d82cac58SJerin Jacob  *     |                 o----+ |     +--------+
27d82cac58SJerin Jacob  *     |                 |    | |
28d82cac58SJerin Jacob  *     +-----------------+    | |     +--------+
29d82cac58SJerin Jacob  *              ^             | |     | queue  |         +------+
30d82cac58SJerin Jacob  *              |             | +-----o        |<=======>|Core 1|
31d82cac58SJerin Jacob  *              |             |       | pair 1 |         +------+
32d82cac58SJerin Jacob  *              |             |       +--------+
33d82cac58SJerin Jacob  *     +--------+--------+    |
34d82cac58SJerin Jacob  *     | +-------------+ |    |       +--------+
35d82cac58SJerin Jacob  *     | |   Model 0   | |    |       | queue  |         +------+
36d82cac58SJerin Jacob  *     | +-------------+ |    +-------o        |<=======>|Core N|
37d82cac58SJerin Jacob  *     | +-------------+ |            | pair N |         +------+
38d82cac58SJerin Jacob  *     | |   Model 1   | |            +--------+
39d82cac58SJerin Jacob  *     | +-------------+ |
40d82cac58SJerin Jacob  *     | +-------------+ |<------> rte_ml_model_load()
41d82cac58SJerin Jacob  *     | |   Model ..  | |-------> rte_ml_model_info_get()
42d82cac58SJerin Jacob  *     | +-------------+ |<------- rte_ml_model_start()
43d82cac58SJerin Jacob  *     | +-------------+ |<------- rte_ml_model_stop()
44d82cac58SJerin Jacob  *     | |   Model N   | |<------- rte_ml_model_params_update()
45d82cac58SJerin Jacob  *     | +-------------+ |<------- rte_ml_model_unload()
46d82cac58SJerin Jacob  *     +-----------------+
47d82cac58SJerin Jacob  *
48d82cac58SJerin Jacob  * ML Device: A hardware or software-based implementation of ML device API for
49d82cac58SJerin Jacob  * running inferences using a pre-trained ML model.
50d82cac58SJerin Jacob  *
51d82cac58SJerin Jacob  * ML Model: An ML model is an algorithm trained over a dataset. A model consists of
52d82cac58SJerin Jacob  * procedure/algorithm and data/pattern required to make predictions on live data.
53d82cac58SJerin Jacob  * Once the model is created and trained outside of the DPDK scope, the model can be loaded
54d82cac58SJerin Jacob  * via rte_ml_model_load() and then start it using rte_ml_model_start() API.
55d82cac58SJerin Jacob  * The rte_ml_model_params_update() can be used to update the model parameters such as weight
56d82cac58SJerin Jacob  * and bias without unloading the model using rte_ml_model_unload().
57d82cac58SJerin Jacob  *
58d82cac58SJerin Jacob  * ML Inference: ML inference is the process of feeding data to the model via
59d82cac58SJerin Jacob  * rte_ml_enqueue_burst() API and use rte_ml_dequeue_burst() API to get the calculated
60d82cac58SJerin Jacob  * outputs/predictions from the started model.
61d82cac58SJerin Jacob  *
62d82cac58SJerin Jacob  * In all functions of the ML device API, the ML device is designated by an
63d82cac58SJerin Jacob  * integer >= 0 named as device identifier *dev_id*.
64d82cac58SJerin Jacob  *
65d82cac58SJerin Jacob  * The functions exported by the ML device API to setup a device designated by
66d82cac58SJerin Jacob  * its device identifier must be invoked in the following order:
67d82cac58SJerin Jacob  *
68d82cac58SJerin Jacob  *      - rte_ml_dev_configure()
69d82cac58SJerin Jacob  *      - rte_ml_dev_queue_pair_setup()
70d82cac58SJerin Jacob  *      - rte_ml_dev_start()
71d82cac58SJerin Jacob  *
72d82cac58SJerin Jacob  * A model is required to run the inference operations with the user specified inputs.
73d82cac58SJerin Jacob  * Application needs to invoke the ML model API in the following order before queueing
74d82cac58SJerin Jacob  * inference jobs.
75d82cac58SJerin Jacob  *
76d82cac58SJerin Jacob  *      - rte_ml_model_load()
77d82cac58SJerin Jacob  *      - rte_ml_model_start()
78d82cac58SJerin Jacob  *
79d82cac58SJerin Jacob  * A model can be loaded on a device only after the device has been configured and can be
80d82cac58SJerin Jacob  * started or stopped only after a device has been started.
81d82cac58SJerin Jacob  *
82d82cac58SJerin Jacob  * The rte_ml_model_info_get() API is provided to retrieve the information related to the model.
83d82cac58SJerin Jacob  * The information would include the shape and type of input and output required for the inference.
84d82cac58SJerin Jacob  *
85d82cac58SJerin Jacob  * Data quantization and dequantization is one of the main aspects in ML domain. This involves
86d82cac58SJerin Jacob  * conversion of input data from a higher precision to a lower precision data type and vice-versa
87d82cac58SJerin Jacob  * for the output. APIs are provided to enable quantization through rte_ml_io_quantize() and
88d82cac58SJerin Jacob  * dequantization through rte_ml_io_dequantize(). These APIs have the capability to handle input
89d82cac58SJerin Jacob  * and output buffers holding data for multiple batches.
90d82cac58SJerin Jacob  *
91d82cac58SJerin Jacob  * Two utility APIs rte_ml_io_input_size_get() and rte_ml_io_output_size_get() can used to get the
92d82cac58SJerin Jacob  * size of quantized and de-quantized multi-batch input and output buffers.
93d82cac58SJerin Jacob  *
94d82cac58SJerin Jacob  * User can optionally update the model parameters with rte_ml_model_params_update() after
95d82cac58SJerin Jacob  * invoking rte_ml_model_stop() API on a given model ID.
96d82cac58SJerin Jacob  *
97d82cac58SJerin Jacob  * The application can invoke, in any order, the functions exported by the ML API to enqueue
98d82cac58SJerin Jacob  * inference jobs and dequeue inference response.
99d82cac58SJerin Jacob  *
100d82cac58SJerin Jacob  * If the application wants to change the device configuration (i.e., call
101d82cac58SJerin Jacob  * rte_ml_dev_configure() or rte_ml_dev_queue_pair_setup()), then application must stop the
102d82cac58SJerin Jacob  * device using rte_ml_dev_stop() API. Likewise, if model parameters need to be updated then
103d82cac58SJerin Jacob  * the application must call rte_ml_model_stop() followed by rte_ml_model_params_update() API
104d82cac58SJerin Jacob  * for the given model. The application does not need to call rte_ml_dev_stop() API for
105d82cac58SJerin Jacob  * any model re-configuration such as rte_ml_model_params_update(), rte_ml_model_unload() etc.
106d82cac58SJerin Jacob  *
107d82cac58SJerin Jacob  * Once the device is in the start state after invoking rte_ml_dev_start() API and the model is in
108d82cac58SJerin Jacob  * start state after invoking rte_ml_model_start() API, then the application can call
109d82cac58SJerin Jacob  * rte_ml_enqueue_burst() and rte_ml_dequeue_burst() API on the destined device and model ID.
110d82cac58SJerin Jacob  *
111d82cac58SJerin Jacob  * Finally, an application can close an ML device by invoking the rte_ml_dev_close() function.
112d82cac58SJerin Jacob  *
113d82cac58SJerin Jacob  * Typical application utilisation of the ML API will follow the following
114d82cac58SJerin Jacob  * programming flow.
115d82cac58SJerin Jacob  *
116d82cac58SJerin Jacob  * - rte_ml_dev_configure()
117d82cac58SJerin Jacob  * - rte_ml_dev_queue_pair_setup()
118d82cac58SJerin Jacob  * - rte_ml_model_load()
119d82cac58SJerin Jacob  * - rte_ml_dev_start()
120d82cac58SJerin Jacob  * - rte_ml_model_start()
121d82cac58SJerin Jacob  * - rte_ml_model_info_get()
122d82cac58SJerin Jacob  * - rte_ml_enqueue_burst()
123d82cac58SJerin Jacob  * - rte_ml_dequeue_burst()
124d82cac58SJerin Jacob  * - rte_ml_model_stop()
125d82cac58SJerin Jacob  * - rte_ml_model_unload()
126d82cac58SJerin Jacob  * - rte_ml_dev_stop()
127d82cac58SJerin Jacob  * - rte_ml_dev_close()
128d82cac58SJerin Jacob  *
129d82cac58SJerin Jacob  * Regarding multi-threading, by default, all the functions of the ML Device API exported by a PMD
130d82cac58SJerin Jacob  * are lock-free functions which assume to not be invoked in parallel on different logical cores
131d82cac58SJerin Jacob  * on the same target object. For instance, the dequeue function of a poll mode driver cannot be
132d82cac58SJerin Jacob  * invoked in parallel on two logical cores to operate on same queue pair. Of course, this function
133d82cac58SJerin Jacob  * can be invoked in parallel by different logical core on different queue pair.
134d82cac58SJerin Jacob  * It is the responsibility of the user application to enforce this rule.
135d82cac58SJerin Jacob  */
136d82cac58SJerin Jacob 
137d82cac58SJerin Jacob #include <rte_common.h>
138d82cac58SJerin Jacob #include <rte_log.h>
139d82cac58SJerin Jacob #include <rte_mempool.h>
140d82cac58SJerin Jacob 
141d82cac58SJerin Jacob #ifdef __cplusplus
142d82cac58SJerin Jacob extern "C" {
143d82cac58SJerin Jacob #endif
144d82cac58SJerin Jacob 
145d82cac58SJerin Jacob /* Logging Macro */
146d82cac58SJerin Jacob extern int rte_ml_dev_logtype;
14797433132SDavid Marchand #define RTE_LOGTYPE_MLDEV rte_ml_dev_logtype
148d82cac58SJerin Jacob 
1490f1dc8cbSTyler Retzlaff #define RTE_MLDEV_LOG(level, ...) \
1500f1dc8cbSTyler Retzlaff 	RTE_LOG_LINE_PREFIX(level, MLDEV, "%s(): ", __func__, __VA_ARGS__)
151d82cac58SJerin Jacob 
152d82cac58SJerin Jacob #define RTE_ML_STR_MAX 128
153d82cac58SJerin Jacob /**< Maximum length of name string */
154d82cac58SJerin Jacob 
155d82cac58SJerin Jacob #define RTE_MLDEV_DEFAULT_MAX 32
156d82cac58SJerin Jacob /** Maximum number of devices if rte_ml_dev_init() is not called. */
157d82cac58SJerin Jacob 
158d82cac58SJerin Jacob /* Device operations */
159d82cac58SJerin Jacob 
160d82cac58SJerin Jacob /**
161d82cac58SJerin Jacob  * Initialize the device array before probing devices. If not called, the first device probed would
162d82cac58SJerin Jacob  * initialize the array to a size of RTE_MLDEV_DEFAULT_MAX.
163d82cac58SJerin Jacob  *
164d82cac58SJerin Jacob  * @param dev_max
165d82cac58SJerin Jacob  *   Maximum number of devices.
166d82cac58SJerin Jacob  *
167d82cac58SJerin Jacob  * @return
168d82cac58SJerin Jacob  *   0 on success, -rte_errno otherwise:
169d82cac58SJerin Jacob  *   - ENOMEM if out of memory
170d82cac58SJerin Jacob  *   - EINVAL if 0 size
171d82cac58SJerin Jacob  *   - EBUSY if already initialized
172d82cac58SJerin Jacob  */
173d82cac58SJerin Jacob __rte_experimental
174d82cac58SJerin Jacob int
175d82cac58SJerin Jacob rte_ml_dev_init(size_t dev_max);
176d82cac58SJerin Jacob 
177d82cac58SJerin Jacob /**
178d82cac58SJerin Jacob  * Get the total number of ML devices that have been successfully initialised.
179d82cac58SJerin Jacob  *
180d82cac58SJerin Jacob  * @return
181d82cac58SJerin Jacob  *   - The total number of usable ML devices.
182d82cac58SJerin Jacob  */
183d82cac58SJerin Jacob __rte_experimental
184d82cac58SJerin Jacob uint16_t
185d82cac58SJerin Jacob rte_ml_dev_count(void);
186d82cac58SJerin Jacob 
187d82cac58SJerin Jacob /**
188d82cac58SJerin Jacob  * Check if the device is in ready state.
189d82cac58SJerin Jacob  *
190d82cac58SJerin Jacob  * @param dev_id
191d82cac58SJerin Jacob  *   The identifier of the device.
192d82cac58SJerin Jacob  *
193d82cac58SJerin Jacob  * @return
194d82cac58SJerin Jacob  *   - 0 if device state is not in ready state.
195d82cac58SJerin Jacob  *   - 1 if device state is ready state.
196d82cac58SJerin Jacob  */
197d82cac58SJerin Jacob __rte_experimental
198d82cac58SJerin Jacob int
199d82cac58SJerin Jacob rte_ml_dev_is_valid_dev(int16_t dev_id);
200d82cac58SJerin Jacob 
201d82cac58SJerin Jacob /**
202d82cac58SJerin Jacob  * Return the NUMA socket to which a device is connected.
203d82cac58SJerin Jacob  *
204d82cac58SJerin Jacob  * @param dev_id
205d82cac58SJerin Jacob  *   The identifier of the device.
206d82cac58SJerin Jacob  *
207d82cac58SJerin Jacob  * @return
208d82cac58SJerin Jacob  *   - The NUMA socket id to which the device is connected
209d82cac58SJerin Jacob  *   - 0 If the socket could not be determined.
210d82cac58SJerin Jacob  *   - -EINVAL: if the dev_id value is not valid.
211d82cac58SJerin Jacob  */
212d82cac58SJerin Jacob __rte_experimental
213d82cac58SJerin Jacob int
214d82cac58SJerin Jacob rte_ml_dev_socket_id(int16_t dev_id);
215d82cac58SJerin Jacob 
216d82cac58SJerin Jacob /**  ML device information */
217d82cac58SJerin Jacob struct rte_ml_dev_info {
218d82cac58SJerin Jacob 	const char *driver_name;
219d82cac58SJerin Jacob 	/**< Driver name */
220d82cac58SJerin Jacob 	uint16_t max_models;
221d82cac58SJerin Jacob 	/**< Maximum number of models supported by the device.
222d82cac58SJerin Jacob 	 * @see struct rte_ml_dev_config::nb_models
223d82cac58SJerin Jacob 	 */
224d82cac58SJerin Jacob 	uint16_t max_queue_pairs;
225d82cac58SJerin Jacob 	/**< Maximum number of queues pairs supported by the device.
226d82cac58SJerin Jacob 	 * @see struct rte_ml_dev_config::nb_queue_pairs
227d82cac58SJerin Jacob 	 */
228d82cac58SJerin Jacob 	uint16_t max_desc;
229d82cac58SJerin Jacob 	/**< Maximum allowed number of descriptors for queue pair by the device.
230d82cac58SJerin Jacob 	 * @see struct rte_ml_dev_qp_conf::nb_desc
231d82cac58SJerin Jacob 	 */
23224364292SSrikanth Yalavarthi 	uint16_t max_io;
23324364292SSrikanth Yalavarthi 	/**< Maximum number of inputs/outputs supported per model. */
234d82cac58SJerin Jacob 	uint16_t max_segments;
235d82cac58SJerin Jacob 	/**< Maximum number of scatter-gather entries supported by the device.
236d82cac58SJerin Jacob 	 * @see struct rte_ml_buff_seg  struct rte_ml_buff_seg::next
237d82cac58SJerin Jacob 	 */
23824364292SSrikanth Yalavarthi 	uint16_t align_size;
23924364292SSrikanth Yalavarthi 	/**< Alignment size of IO buffers used by the device. */
240d82cac58SJerin Jacob };
241d82cac58SJerin Jacob 
242d82cac58SJerin Jacob /**
243d82cac58SJerin Jacob  * Retrieve the information of the device.
244d82cac58SJerin Jacob  *
245d82cac58SJerin Jacob  * @param dev_id
246d82cac58SJerin Jacob  *   The identifier of the device.
247d82cac58SJerin Jacob  * @param dev_info
248d82cac58SJerin Jacob  *   A pointer to a structure of type *rte_ml_dev_info* to be filled with the info of the device.
249d82cac58SJerin Jacob  *
250d82cac58SJerin Jacob  * @return
251d82cac58SJerin Jacob  *   - 0: Success, driver updates the information of the ML device
252d82cac58SJerin Jacob  *   - < 0: Error code returned by the driver info get function.
253d82cac58SJerin Jacob  */
254d82cac58SJerin Jacob __rte_experimental
255d82cac58SJerin Jacob int
256d82cac58SJerin Jacob rte_ml_dev_info_get(int16_t dev_id, struct rte_ml_dev_info *dev_info);
257d82cac58SJerin Jacob 
258d82cac58SJerin Jacob /** ML device configuration structure */
259d82cac58SJerin Jacob struct rte_ml_dev_config {
260d82cac58SJerin Jacob 	int socket_id;
261d82cac58SJerin Jacob 	/**< Socket to allocate resources on. */
262d82cac58SJerin Jacob 	uint16_t nb_models;
263d82cac58SJerin Jacob 	/**< Number of models to be loaded on the device.
264d82cac58SJerin Jacob 	 * This value cannot exceed the max_models which is previously provided in
265d82cac58SJerin Jacob 	 * struct rte_ml_dev_info::max_models
266d82cac58SJerin Jacob 	 */
267d82cac58SJerin Jacob 	uint16_t nb_queue_pairs;
268d82cac58SJerin Jacob 	/**< Number of queue pairs to configure on this device.
269d82cac58SJerin Jacob 	 * This value cannot exceed the max_models which is previously provided in
270d82cac58SJerin Jacob 	 * struct rte_ml_dev_info::max_queue_pairs
271d82cac58SJerin Jacob 	 */
272d82cac58SJerin Jacob };
273d82cac58SJerin Jacob 
274d82cac58SJerin Jacob /**
275d82cac58SJerin Jacob  * Configure an ML device.
276d82cac58SJerin Jacob  *
277d82cac58SJerin Jacob  * This function must be invoked first before any other function in the API.
278d82cac58SJerin Jacob  *
279d82cac58SJerin Jacob  * ML Device can be re-configured, when in a stopped state. Device cannot be re-configured after
280d82cac58SJerin Jacob  * rte_ml_dev_close() is called.
281d82cac58SJerin Jacob  *
282d82cac58SJerin Jacob  * The caller may use rte_ml_dev_info_get() to get the capability of each resources available for
283d82cac58SJerin Jacob  * this ML device.
284d82cac58SJerin Jacob  *
285d82cac58SJerin Jacob  * @param dev_id
286d82cac58SJerin Jacob  *   The identifier of the device to configure.
287d82cac58SJerin Jacob  * @param config
288d82cac58SJerin Jacob  *   The ML device configuration structure.
289d82cac58SJerin Jacob  *
290d82cac58SJerin Jacob  * @return
291d82cac58SJerin Jacob  *   - 0: Success, device configured.
292d82cac58SJerin Jacob  *   - < 0: Error code returned by the driver configuration function.
293d82cac58SJerin Jacob  */
294d82cac58SJerin Jacob __rte_experimental
295d82cac58SJerin Jacob int
296d82cac58SJerin Jacob rte_ml_dev_configure(int16_t dev_id, const struct rte_ml_dev_config *config);
297d82cac58SJerin Jacob 
298d82cac58SJerin Jacob /* Forward declaration */
299d82cac58SJerin Jacob struct rte_ml_op;
300d82cac58SJerin Jacob 
301d82cac58SJerin Jacob /**< Callback function called during rte_ml_dev_stop(), invoked once per flushed ML op */
302d82cac58SJerin Jacob typedef void (*rte_ml_dev_stop_flush_t)(int16_t dev_id, uint16_t qp_id, struct rte_ml_op *op);
303d82cac58SJerin Jacob 
304d82cac58SJerin Jacob /** ML device queue pair configuration structure. */
305d82cac58SJerin Jacob struct rte_ml_dev_qp_conf {
306d82cac58SJerin Jacob 	uint32_t nb_desc;
307d82cac58SJerin Jacob 	/**< Number of descriptors per queue pair.
308d82cac58SJerin Jacob 	 * This value cannot exceed the max_desc which previously provided in
309d82cac58SJerin Jacob 	 * struct rte_ml_dev_info:max_desc
310d82cac58SJerin Jacob 	 */
311d82cac58SJerin Jacob 	rte_ml_dev_stop_flush_t cb;
312d82cac58SJerin Jacob 	/**< Callback function called during rte_ml_dev_stop(), invoked once per active ML op.
313d82cac58SJerin Jacob 	 * Value NULL is allowed, in which case callback will not be invoked.
314d82cac58SJerin Jacob 	 * This function can be used to properly dispose of outstanding ML ops from all
315d82cac58SJerin Jacob 	 * queue pairs, for example ops containing  memory pointers.
316d82cac58SJerin Jacob 	 * @see rte_ml_dev_stop()
317d82cac58SJerin Jacob 	 */
318d82cac58SJerin Jacob };
319d82cac58SJerin Jacob 
320d82cac58SJerin Jacob /**
321804786f1SSrikanth Yalavarthi  * Get the number of queue pairs on a specific ML device.
322804786f1SSrikanth Yalavarthi  *
323804786f1SSrikanth Yalavarthi  * @param dev_id
324804786f1SSrikanth Yalavarthi  *   The identifier of the device.
325804786f1SSrikanth Yalavarthi  *
326804786f1SSrikanth Yalavarthi  * @return
327804786f1SSrikanth Yalavarthi  *   - The number of configured queue pairs.
328804786f1SSrikanth Yalavarthi  */
329804786f1SSrikanth Yalavarthi __rte_experimental
330804786f1SSrikanth Yalavarthi uint16_t
331804786f1SSrikanth Yalavarthi rte_ml_dev_queue_pair_count(int16_t dev_id);
332804786f1SSrikanth Yalavarthi 
333804786f1SSrikanth Yalavarthi /**
334d82cac58SJerin Jacob  * Set up a queue pair for a device. This should only be called when the device is stopped.
335d82cac58SJerin Jacob  *
336d82cac58SJerin Jacob  * @param dev_id
337d82cac58SJerin Jacob  *   The identifier of the device.
338d82cac58SJerin Jacob  * @param queue_pair_id
339d82cac58SJerin Jacob  *   The index of the queue pairs to set up. The value must be in the range [0, nb_queue_pairs - 1]
340d82cac58SJerin Jacob  * previously supplied to rte_ml_dev_configure().
341d82cac58SJerin Jacob  * @param qp_conf
342d82cac58SJerin Jacob  *   The pointer to the configuration data to be used for the queue pair.
343d82cac58SJerin Jacob  * @param socket_id
344d82cac58SJerin Jacob  *   The *socket_id* argument is the socket identifier in case of NUMA.
345d82cac58SJerin Jacob  * The value can be *SOCKET_ID_ANY* if there is no NUMA constraint for the memory allocated
346d82cac58SJerin Jacob  * for the queue pair.
347d82cac58SJerin Jacob  *
348d82cac58SJerin Jacob  * @return
349d82cac58SJerin Jacob  *   - 0: Success, queue pair correctly set up.
350d82cac58SJerin Jacob  *   - < 0: Queue pair configuration failed.
351d82cac58SJerin Jacob  */
352d82cac58SJerin Jacob __rte_experimental
353d82cac58SJerin Jacob int
354d82cac58SJerin Jacob rte_ml_dev_queue_pair_setup(int16_t dev_id, uint16_t queue_pair_id,
355d82cac58SJerin Jacob 			    const struct rte_ml_dev_qp_conf *qp_conf, int socket_id);
356d82cac58SJerin Jacob 
357d82cac58SJerin Jacob /**
358d82cac58SJerin Jacob  * Start an ML device.
359d82cac58SJerin Jacob  *
360d82cac58SJerin Jacob  * The device start step consists of setting the configured features and enabling the ML device
361d82cac58SJerin Jacob  * to accept inference jobs.
362d82cac58SJerin Jacob  *
363d82cac58SJerin Jacob  * @param dev_id
364d82cac58SJerin Jacob  *   The identifier of the device.
365d82cac58SJerin Jacob  *
366d82cac58SJerin Jacob  * @return
367d82cac58SJerin Jacob  *   - 0: Success, device started.
368d82cac58SJerin Jacob  *   - <0: Error code of the driver device start function.
369d82cac58SJerin Jacob  */
370d82cac58SJerin Jacob __rte_experimental
371d82cac58SJerin Jacob int
372d82cac58SJerin Jacob rte_ml_dev_start(int16_t dev_id);
373d82cac58SJerin Jacob 
374d82cac58SJerin Jacob /**
375d82cac58SJerin Jacob  * Stop an ML device. A stopped device cannot accept inference jobs.
376d82cac58SJerin Jacob  * The device can be restarted with a call to rte_ml_dev_start().
377d82cac58SJerin Jacob  *
378d82cac58SJerin Jacob  * @param dev_id
379d82cac58SJerin Jacob  *   The identifier of the device.
380d82cac58SJerin Jacob  *
381d82cac58SJerin Jacob  * @return
382d82cac58SJerin Jacob  *   - 0: Success, device stopped.
383d82cac58SJerin Jacob  *   - <0: Error code of the driver device stop function.
384d82cac58SJerin Jacob  */
385d82cac58SJerin Jacob __rte_experimental
386d82cac58SJerin Jacob int
387d82cac58SJerin Jacob rte_ml_dev_stop(int16_t dev_id);
388d82cac58SJerin Jacob 
389d82cac58SJerin Jacob /**
390d82cac58SJerin Jacob  * Close an ML device. The device cannot be restarted!
391d82cac58SJerin Jacob  *
392d82cac58SJerin Jacob  * @param dev_id
393d82cac58SJerin Jacob  *   The identifier of the device.
394d82cac58SJerin Jacob  *
395d82cac58SJerin Jacob  * @return
396d82cac58SJerin Jacob  *  - 0 on successfully closing device.
397d82cac58SJerin Jacob  *  - <0 on failure to close device.
398d82cac58SJerin Jacob  */
399d82cac58SJerin Jacob __rte_experimental
400d82cac58SJerin Jacob int
401d82cac58SJerin Jacob rte_ml_dev_close(int16_t dev_id);
402d82cac58SJerin Jacob 
403d82cac58SJerin Jacob /** Status of ML operation */
404d82cac58SJerin Jacob enum rte_ml_op_status {
405d82cac58SJerin Jacob 	RTE_ML_OP_STATUS_SUCCESS = 0,
406d82cac58SJerin Jacob 	/**< Operation completed successfully */
407d82cac58SJerin Jacob 	RTE_ML_OP_STATUS_NOT_PROCESSED,
408d82cac58SJerin Jacob 	/**< Operation has not yet been processed by the device. */
409d82cac58SJerin Jacob 	RTE_ML_OP_STATUS_ERROR,
410d82cac58SJerin Jacob 	/**< Operation completed with error.
411d82cac58SJerin Jacob 	 * Application can invoke rte_ml_op_error_get() to get PMD specific
412d82cac58SJerin Jacob 	 * error code if needed.
413d82cac58SJerin Jacob 	 */
414d82cac58SJerin Jacob };
415d82cac58SJerin Jacob 
416d82cac58SJerin Jacob /** ML operation's input and output buffer representation as scatter gather list
417d82cac58SJerin Jacob  */
418d82cac58SJerin Jacob struct rte_ml_buff_seg {
419d82cac58SJerin Jacob 	rte_iova_t iova_addr;
420d82cac58SJerin Jacob 	/**< IOVA address of segment buffer. */
421d82cac58SJerin Jacob 	void *addr;
422d82cac58SJerin Jacob 	/**< Virtual address of segment buffer. */
423d82cac58SJerin Jacob 	uint32_t length;
424d82cac58SJerin Jacob 	/**< Segment length. */
425d82cac58SJerin Jacob 	uint32_t reserved;
426d82cac58SJerin Jacob 	/**< Reserved for future use. */
427d82cac58SJerin Jacob 	struct rte_ml_buff_seg *next;
428d82cac58SJerin Jacob 	/**< Points to next segment. Value NULL represents the last segment. */
429d82cac58SJerin Jacob };
430d82cac58SJerin Jacob 
431d82cac58SJerin Jacob /**
432d82cac58SJerin Jacob  * ML Operation.
433d82cac58SJerin Jacob  *
434d82cac58SJerin Jacob  * This structure contains data related to performing an ML operation on the buffers using
435d82cac58SJerin Jacob  * the model specified through model_id.
436d82cac58SJerin Jacob  */
437c6552d9aSTyler Retzlaff struct __rte_cache_aligned rte_ml_op {
438d82cac58SJerin Jacob 	uint16_t model_id;
439d82cac58SJerin Jacob 	/**< Model ID to be used for the operation. */
440d82cac58SJerin Jacob 	uint16_t nb_batches;
441d82cac58SJerin Jacob 	/**< Number of batches. Minimum value must be one.
442d82cac58SJerin Jacob 	 * Input buffer must hold inference data for each batch as contiguous.
443d82cac58SJerin Jacob 	 */
444d82cac58SJerin Jacob 	uint32_t reserved;
445d82cac58SJerin Jacob 	/**< Reserved for future use. */
446d82cac58SJerin Jacob 	struct rte_mempool *mempool;
447d82cac58SJerin Jacob 	/**< Pool from which operation is allocated. */
44824364292SSrikanth Yalavarthi 	struct rte_ml_buff_seg **input;
44924364292SSrikanth Yalavarthi 	/**< Array of buffer segments to hold the inference input data.
45024364292SSrikanth Yalavarthi 	 *
45124364292SSrikanth Yalavarthi 	 * When the model supports IO layout RTE_ML_IO_LAYOUT_PACKED, size of
45224364292SSrikanth Yalavarthi 	 * the array is 1.
45324364292SSrikanth Yalavarthi 	 *
45424364292SSrikanth Yalavarthi 	 * When the model supports IO layout RTE_ML_IO_LAYOUT_SPLIT, size of
45524364292SSrikanth Yalavarthi 	 * the array is rte_ml_model_info::nb_inputs.
45624364292SSrikanth Yalavarthi 	 *
45724364292SSrikanth Yalavarthi 	 * @see struct rte_ml_dev_info::io_layout
45824364292SSrikanth Yalavarthi 	 */
45924364292SSrikanth Yalavarthi 	struct rte_ml_buff_seg **output;
46024364292SSrikanth Yalavarthi 	/**< Array of buffer segments to hold the inference output data.
46124364292SSrikanth Yalavarthi 	 *
46224364292SSrikanth Yalavarthi 	 * When the model supports IO layout RTE_ML_IO_LAYOUT_PACKED, size of
46324364292SSrikanth Yalavarthi 	 * the array is 1.
46424364292SSrikanth Yalavarthi 	 *
46524364292SSrikanth Yalavarthi 	 * When the model supports IO layout RTE_ML_IO_LAYOUT_SPLIT, size of
46624364292SSrikanth Yalavarthi 	 * the array is rte_ml_model_info::nb_outputs.
46724364292SSrikanth Yalavarthi 	 *
46824364292SSrikanth Yalavarthi 	 * @see struct rte_ml_dev_info::io_layout
46924364292SSrikanth Yalavarthi 	 */
470d82cac58SJerin Jacob 	union {
471d82cac58SJerin Jacob 		uint64_t user_u64;
472d82cac58SJerin Jacob 		/**< User data as uint64_t.*/
473d82cac58SJerin Jacob 		void *user_ptr;
474d82cac58SJerin Jacob 		/**< User data as void*.*/
475d82cac58SJerin Jacob 	};
476d82cac58SJerin Jacob 	enum rte_ml_op_status status;
477d82cac58SJerin Jacob 	/**< Operation status. */
478d82cac58SJerin Jacob 	uint64_t impl_opaque;
479d82cac58SJerin Jacob 	/**< Implementation specific opaque value.
480d82cac58SJerin Jacob 	 * An implementation may use this field to hold
481d82cac58SJerin Jacob 	 * implementation specific value to share between
482d82cac58SJerin Jacob 	 * dequeue and enqueue operation.
483d82cac58SJerin Jacob 	 * The application should not modify this field.
484d82cac58SJerin Jacob 	 */
485c6552d9aSTyler Retzlaff };
486d82cac58SJerin Jacob 
487d82cac58SJerin Jacob /* Enqueue/Dequeue operations */
488d82cac58SJerin Jacob 
489d82cac58SJerin Jacob /**
490d82cac58SJerin Jacob  * Enqueue a burst of ML inferences for processing on an ML device.
491d82cac58SJerin Jacob  *
492d82cac58SJerin Jacob  * The rte_ml_enqueue_burst() function is invoked to place ML inference
493d82cac58SJerin Jacob  * operations on the queue *qp_id* of the device designated by its *dev_id*.
494d82cac58SJerin Jacob  *
495d82cac58SJerin Jacob  * The *nb_ops* parameter is the number of inferences to process which are
496d82cac58SJerin Jacob  * supplied in the *ops* array of *rte_ml_op* structures.
497d82cac58SJerin Jacob  *
498d82cac58SJerin Jacob  * The rte_ml_enqueue_burst() function returns the number of inferences it
499d82cac58SJerin Jacob  * actually enqueued for processing. A return value equal to *nb_ops* means that
500d82cac58SJerin Jacob  * all packets have been enqueued.
501d82cac58SJerin Jacob  *
502d82cac58SJerin Jacob  * @param dev_id
503d82cac58SJerin Jacob  *   The identifier of the device.
504d82cac58SJerin Jacob  * @param qp_id
505d82cac58SJerin Jacob  *   The index of the queue pair which inferences are to be enqueued for processing.
506d82cac58SJerin Jacob  * The value must be in the range [0, nb_queue_pairs - 1] previously supplied to
507d82cac58SJerin Jacob  * *rte_ml_dev_configure*.
508d82cac58SJerin Jacob  * @param ops
509d82cac58SJerin Jacob  *   The address of an array of *nb_ops* pointers to *rte_ml_op* structures which contain the
510d82cac58SJerin Jacob  * ML inferences to be processed.
511d82cac58SJerin Jacob  * @param nb_ops
512d82cac58SJerin Jacob  *   The number of operations to process.
513d82cac58SJerin Jacob  *
514d82cac58SJerin Jacob  * @return
515d82cac58SJerin Jacob  *   The number of inference operations actually enqueued to the ML device.
516d82cac58SJerin Jacob  * The return value can be less than the value of the *nb_ops* parameter when the ML device queue
517d82cac58SJerin Jacob  * is full or if invalid parameters are specified in a *rte_ml_op*.
518d82cac58SJerin Jacob  */
519d82cac58SJerin Jacob __rte_experimental
520d82cac58SJerin Jacob uint16_t
521d82cac58SJerin Jacob rte_ml_enqueue_burst(int16_t dev_id, uint16_t qp_id, struct rte_ml_op **ops, uint16_t nb_ops);
522d82cac58SJerin Jacob 
523d82cac58SJerin Jacob /**
524d82cac58SJerin Jacob  * Dequeue a burst of processed ML inferences operations from a queue on the ML device.
525d82cac58SJerin Jacob  * The dequeued operations are stored in *rte_ml_op* structures whose pointers are supplied
526d82cac58SJerin Jacob  * in the *ops* array.
527d82cac58SJerin Jacob  *
528d82cac58SJerin Jacob  * The rte_ml_dequeue_burst() function returns the number of inferences actually dequeued,
529d82cac58SJerin Jacob  * which is the number of *rte_ml_op* data structures effectively supplied into the *ops* array.
530d82cac58SJerin Jacob  *
531d82cac58SJerin Jacob  * A return value equal to *nb_ops* indicates that the queue contained at least nb_ops* operations,
532d82cac58SJerin Jacob  * and this is likely to signify that other processed operations remain in the devices output queue.
533d82cac58SJerin Jacob  * Application implementing a "retrieve as many processed operations as possible" policy can check
534d82cac58SJerin Jacob  * this specific case and keep invoking the rte_ml_dequeue_burst() function until a value less than
535d82cac58SJerin Jacob  * *nb_ops* is returned.
536d82cac58SJerin Jacob  *
537d82cac58SJerin Jacob  * The rte_ml_dequeue_burst() function does not provide any error notification to avoid
538d82cac58SJerin Jacob  * the corresponding overhead.
539d82cac58SJerin Jacob  *
540d82cac58SJerin Jacob  * @param dev_id
541d82cac58SJerin Jacob  *   The identifier of the device.
542d82cac58SJerin Jacob  * @param qp_id
543d82cac58SJerin Jacob  *   The index of the queue pair from which to retrieve processed packets.
544d82cac58SJerin Jacob  * The value must be in the range [0, nb_queue_pairs - 1] previously supplied to
545d82cac58SJerin Jacob  * rte_ml_dev_configure().
546d82cac58SJerin Jacob  * @param ops
547d82cac58SJerin Jacob  *   The address of an array of pointers to *rte_ml_op* structures that must be large enough to
548d82cac58SJerin Jacob  * store *nb_ops* pointers in it.
549d82cac58SJerin Jacob  * @param nb_ops
550d82cac58SJerin Jacob  *   The maximum number of inferences to dequeue.
551d82cac58SJerin Jacob  *
552d82cac58SJerin Jacob  * @return
553d82cac58SJerin Jacob  *   The number of operations actually dequeued, which is the number of pointers
554d82cac58SJerin Jacob  * to *rte_ml_op* structures effectively supplied to the *ops* array.
555d82cac58SJerin Jacob  */
556d82cac58SJerin Jacob __rte_experimental
557d82cac58SJerin Jacob uint16_t
558d82cac58SJerin Jacob rte_ml_dequeue_burst(int16_t dev_id, uint16_t qp_id, struct rte_ml_op **ops, uint16_t nb_ops);
559d82cac58SJerin Jacob 
560d82cac58SJerin Jacob /**
561d82cac58SJerin Jacob  * Verbose error structure definition.
562d82cac58SJerin Jacob  */
563d82cac58SJerin Jacob struct rte_ml_op_error {
564d82cac58SJerin Jacob 	char message[RTE_ML_STR_MAX]; /**< Human-readable error message. */
565d82cac58SJerin Jacob 	uint64_t errcode;	      /**< Vendor specific error code. */
566d82cac58SJerin Jacob };
567d82cac58SJerin Jacob 
568d82cac58SJerin Jacob /**
569d82cac58SJerin Jacob  * Get PMD specific error information for an ML op.
570d82cac58SJerin Jacob  *
571d82cac58SJerin Jacob  * When an ML operation completed with RTE_ML_OP_STATUS_ERROR as status,
572d82cac58SJerin Jacob  * This API allows to get PMD specific error details.
573d82cac58SJerin Jacob  *
574d82cac58SJerin Jacob  * @param[in] dev_id
575d82cac58SJerin Jacob  *   Device identifier
576d82cac58SJerin Jacob  * @param[in] op
577d82cac58SJerin Jacob  *   Handle of ML operation
578d82cac58SJerin Jacob  * @param[in] error
579d82cac58SJerin Jacob  *   Address of structure rte_ml_op_error to be filled
580d82cac58SJerin Jacob  *
581d82cac58SJerin Jacob  * @return
582d82cac58SJerin Jacob  *   - Returns 0 on success
583d82cac58SJerin Jacob  *   - Returns negative value on failure
584d82cac58SJerin Jacob  */
585d82cac58SJerin Jacob __rte_experimental
586d82cac58SJerin Jacob int
587d82cac58SJerin Jacob rte_ml_op_error_get(int16_t dev_id, struct rte_ml_op *op, struct rte_ml_op_error *error);
588d82cac58SJerin Jacob 
589d82cac58SJerin Jacob /* Statistics operations */
590d82cac58SJerin Jacob 
591d82cac58SJerin Jacob /** Device statistics. */
592d82cac58SJerin Jacob struct rte_ml_dev_stats {
593d82cac58SJerin Jacob 	uint64_t enqueued_count;
594d82cac58SJerin Jacob 	/**< Count of all operations enqueued */
595d82cac58SJerin Jacob 	uint64_t dequeued_count;
596d82cac58SJerin Jacob 	/**< Count of all operations dequeued */
597d82cac58SJerin Jacob 	uint64_t enqueue_err_count;
598d82cac58SJerin Jacob 	/**< Total error count on operations enqueued */
599d82cac58SJerin Jacob 	uint64_t dequeue_err_count;
600d82cac58SJerin Jacob 	/**< Total error count on operations dequeued */
601d82cac58SJerin Jacob };
602d82cac58SJerin Jacob 
603d82cac58SJerin Jacob /**
604d82cac58SJerin Jacob  * Retrieve the general I/O statistics of a device.
605d82cac58SJerin Jacob  *
606d82cac58SJerin Jacob  * @param dev_id
607d82cac58SJerin Jacob  *   The identifier of the device.
608d82cac58SJerin Jacob  * @param stats
609d82cac58SJerin Jacob  *   Pointer to structure to where statistics will be copied.
610d82cac58SJerin Jacob  * On error, this location may or may not have been modified.
611d82cac58SJerin Jacob  * @return
612d82cac58SJerin Jacob  *   - 0 on success
613d82cac58SJerin Jacob  *   - -EINVAL: If invalid parameter pointer is provided.
614d82cac58SJerin Jacob  */
615d82cac58SJerin Jacob __rte_experimental
616d82cac58SJerin Jacob int
617d82cac58SJerin Jacob rte_ml_dev_stats_get(int16_t dev_id, struct rte_ml_dev_stats *stats);
618d82cac58SJerin Jacob 
619d82cac58SJerin Jacob /**
620d82cac58SJerin Jacob  * Reset the statistics of a device.
621d82cac58SJerin Jacob  *
622d82cac58SJerin Jacob  * @param dev_id
623d82cac58SJerin Jacob  *   The identifier of the device.
624d82cac58SJerin Jacob  */
625d82cac58SJerin Jacob __rte_experimental
626d82cac58SJerin Jacob void
627d82cac58SJerin Jacob rte_ml_dev_stats_reset(int16_t dev_id);
628d82cac58SJerin Jacob 
629d82cac58SJerin Jacob /**
630f06968e9SSrikanth Yalavarthi  * Selects the component of the mldev to retrieve statistics from.
631f06968e9SSrikanth Yalavarthi  */
632f06968e9SSrikanth Yalavarthi enum rte_ml_dev_xstats_mode {
633f06968e9SSrikanth Yalavarthi 	RTE_ML_DEV_XSTATS_DEVICE,
634f06968e9SSrikanth Yalavarthi 	/**< Device xstats */
635f06968e9SSrikanth Yalavarthi 	RTE_ML_DEV_XSTATS_MODEL,
636f06968e9SSrikanth Yalavarthi 	/**< Model xstats */
637f06968e9SSrikanth Yalavarthi };
638f06968e9SSrikanth Yalavarthi 
639f06968e9SSrikanth Yalavarthi /**
640d82cac58SJerin Jacob  * A name-key lookup element for extended statistics.
641d82cac58SJerin Jacob  *
642d82cac58SJerin Jacob  * This structure is used to map between names and ID numbers for extended ML device statistics.
643d82cac58SJerin Jacob  */
644d82cac58SJerin Jacob struct rte_ml_dev_xstats_map {
645d82cac58SJerin Jacob 	uint16_t id;
646d82cac58SJerin Jacob 	/**< xstat identifier */
647d82cac58SJerin Jacob 	char name[RTE_ML_STR_MAX];
648d82cac58SJerin Jacob 	/**< xstat name */
649d82cac58SJerin Jacob };
650d82cac58SJerin Jacob 
651d82cac58SJerin Jacob /**
652f06968e9SSrikanth Yalavarthi  * Retrieve names of extended statistics of an ML device.
653f06968e9SSrikanth Yalavarthi  *
654f06968e9SSrikanth Yalavarthi  * @param dev_id
655f06968e9SSrikanth Yalavarthi  *   The identifier of the device.
656f06968e9SSrikanth Yalavarthi  * @param mode
657f06968e9SSrikanth Yalavarthi  *   Mode of statistics to retrieve. Choices include the device statistics and model statistics.
658f06968e9SSrikanth Yalavarthi  * @param model_id
659f06968e9SSrikanth Yalavarthi  *   Used to specify the model number in model mode, and is ignored in device mode.
660f06968e9SSrikanth Yalavarthi  * @param[out] xstats_map
661f06968e9SSrikanth Yalavarthi  *   Block of memory to insert names and ids into. Must be at least size in capacity. If set to
662f06968e9SSrikanth Yalavarthi  * NULL, function returns required capacity. The id values returned can be passed to
663f06968e9SSrikanth Yalavarthi  * *rte_ml_dev_xstats_get* to select statistics.
664f06968e9SSrikanth Yalavarthi  * @param size
665f06968e9SSrikanth Yalavarthi  *   Capacity of xstats_names (number of xstats_map).
666f06968e9SSrikanth Yalavarthi  * @return
667f06968e9SSrikanth Yalavarthi  *   - Positive value lower or equal to size: success. The return value is the number of entries
668f06968e9SSrikanth Yalavarthi  * filled in the stats table.
669f06968e9SSrikanth Yalavarthi  *   - Positive value higher than size: error, the given statistics table is too small. The return
670f06968e9SSrikanth Yalavarthi  * value corresponds to the size that should be given to succeed. The entries in the table are not
671f06968e9SSrikanth Yalavarthi  * valid and shall not be used by the caller.
672f06968e9SSrikanth Yalavarthi  *   - Negative value on error:
673f06968e9SSrikanth Yalavarthi  *        -ENODEV for invalid *dev_id*.
674f06968e9SSrikanth Yalavarthi  *        -EINVAL for invalid mode, model parameters.
675f06968e9SSrikanth Yalavarthi  *        -ENOTSUP if the device doesn't support this function.
676f06968e9SSrikanth Yalavarthi  */
677f06968e9SSrikanth Yalavarthi __rte_experimental
678f06968e9SSrikanth Yalavarthi int
679f06968e9SSrikanth Yalavarthi rte_ml_dev_xstats_names_get(int16_t dev_id, enum rte_ml_dev_xstats_mode mode, int32_t model_id,
680f06968e9SSrikanth Yalavarthi 			    struct rte_ml_dev_xstats_map *xstats_map, uint32_t size);
681f06968e9SSrikanth Yalavarthi 
682f06968e9SSrikanth Yalavarthi /**
683f06968e9SSrikanth Yalavarthi  * Retrieve the value of a single stat by requesting it by name.
684f06968e9SSrikanth Yalavarthi  *
685f06968e9SSrikanth Yalavarthi  * @param dev_id
686f06968e9SSrikanth Yalavarthi  *   The identifier of the device.
687f06968e9SSrikanth Yalavarthi  * @param name
688f06968e9SSrikanth Yalavarthi  *   Name of stat name to retrieve.
689f06968e9SSrikanth Yalavarthi  * @param[out] stat_id
690f06968e9SSrikanth Yalavarthi  *   If non-NULL, the numerical id of the stat will be returned, so that further requests for the
691f06968e9SSrikanth Yalavarthi  * stat can be got using rte_ml_dev_xstats_get, which will be faster as it doesn't need to scan a
692f06968e9SSrikanth Yalavarthi  * list of names for the stat. If the stat cannot be found, the id returned will be (unsigned)-1.
693f06968e9SSrikanth Yalavarthi  * @param[out] value
694f06968e9SSrikanth Yalavarthi  *   Value of the stat to be returned.
695f06968e9SSrikanth Yalavarthi  * @return
696f06968e9SSrikanth Yalavarthi  *   - Zero: No error.
697f06968e9SSrikanth Yalavarthi  *   - Negative value: -EINVAL if stat not found, -ENOTSUP if not supported.
698f06968e9SSrikanth Yalavarthi  */
699f06968e9SSrikanth Yalavarthi __rte_experimental
700f06968e9SSrikanth Yalavarthi int
701f06968e9SSrikanth Yalavarthi rte_ml_dev_xstats_by_name_get(int16_t dev_id, const char *name, uint16_t *stat_id, uint64_t *value);
702f06968e9SSrikanth Yalavarthi 
703f06968e9SSrikanth Yalavarthi /**
704f06968e9SSrikanth Yalavarthi  * Retrieve extended statistics of an ML device.
705f06968e9SSrikanth Yalavarthi  *
706f06968e9SSrikanth Yalavarthi  * @param dev_id
707f06968e9SSrikanth Yalavarthi  *   The identifier of the device.
708f06968e9SSrikanth Yalavarthi  * @param mode
709f06968e9SSrikanth Yalavarthi  *  Mode of statistics to retrieve. Choices include the device statistics and model statistics.
710f06968e9SSrikanth Yalavarthi  * @param model_id
711f06968e9SSrikanth Yalavarthi  *   Used to specify the model id in model mode, and is ignored in device mode.
712f06968e9SSrikanth Yalavarthi  * @param stat_ids
713f06968e9SSrikanth Yalavarthi  *   ID numbers of the stats to get. The ids can be got from the stat position in the stat list from
714f06968e9SSrikanth Yalavarthi  * rte_ml_dev_xstats_names_get(), or by using rte_ml_dev_xstats_by_name_get().
715f06968e9SSrikanth Yalavarthi  * @param[out] values
716f06968e9SSrikanth Yalavarthi  *   Values for each stats request by ID.
717f06968e9SSrikanth Yalavarthi  * @param nb_ids
718f06968e9SSrikanth Yalavarthi  *   Number of stats requested.
719f06968e9SSrikanth Yalavarthi  * @return
720f06968e9SSrikanth Yalavarthi  *   - Positive value: number of stat entries filled into the values array
721f06968e9SSrikanth Yalavarthi  *   - Negative value on error:
722f06968e9SSrikanth Yalavarthi  *        -ENODEV for invalid *dev_id*.
723f06968e9SSrikanth Yalavarthi  *        -EINVAL for invalid mode, model id or stat id parameters.
724f06968e9SSrikanth Yalavarthi  *        -ENOTSUP if the device doesn't support this function.
725f06968e9SSrikanth Yalavarthi  */
726f06968e9SSrikanth Yalavarthi __rte_experimental
727f06968e9SSrikanth Yalavarthi int
728f06968e9SSrikanth Yalavarthi rte_ml_dev_xstats_get(int16_t dev_id, enum rte_ml_dev_xstats_mode mode, int32_t model_id,
729f06968e9SSrikanth Yalavarthi 		      const uint16_t stat_ids[], uint64_t values[], uint16_t nb_ids);
730f06968e9SSrikanth Yalavarthi 
731f06968e9SSrikanth Yalavarthi /**
732f06968e9SSrikanth Yalavarthi  * Reset the values of the xstats of the selected component in the device.
733f06968e9SSrikanth Yalavarthi  *
734f06968e9SSrikanth Yalavarthi  * @param dev_id
735f06968e9SSrikanth Yalavarthi  *   The identifier of the device.
736f06968e9SSrikanth Yalavarthi  * @param mode
737f06968e9SSrikanth Yalavarthi  *   Mode of the statistics to reset. Choose from device or model.
738f06968e9SSrikanth Yalavarthi  * @param model_id
739f06968e9SSrikanth Yalavarthi  *   Model stats to reset. 0 and positive values select models, while -1 indicates all models.
740f06968e9SSrikanth Yalavarthi  * @param stat_ids
741f06968e9SSrikanth Yalavarthi  *   Selects specific statistics to be reset. When NULL, all statistics selected by *mode* will be
742f06968e9SSrikanth Yalavarthi  * reset. If non-NULL, must point to array of at least *nb_ids* size.
743f06968e9SSrikanth Yalavarthi  * @param nb_ids
744f06968e9SSrikanth Yalavarthi  *   The number of ids available from the *ids* array. Ignored when ids is NULL.
745f06968e9SSrikanth Yalavarthi  * @return
746f06968e9SSrikanth Yalavarthi  *   - Zero: successfully reset the statistics.
747f06968e9SSrikanth Yalavarthi  *   - Negative value: -EINVAL invalid parameters, -ENOTSUP if not supported.
748f06968e9SSrikanth Yalavarthi  */
749f06968e9SSrikanth Yalavarthi __rte_experimental
750f06968e9SSrikanth Yalavarthi int
751f06968e9SSrikanth Yalavarthi rte_ml_dev_xstats_reset(int16_t dev_id, enum rte_ml_dev_xstats_mode mode, int32_t model_id,
752f06968e9SSrikanth Yalavarthi 			const uint16_t stat_ids[], uint16_t nb_ids);
753f06968e9SSrikanth Yalavarthi 
754f06968e9SSrikanth Yalavarthi /**
755d82cac58SJerin Jacob  * Dump internal information about *dev_id* to the FILE* provided in *fd*.
756d82cac58SJerin Jacob  *
757d82cac58SJerin Jacob  * @param dev_id
758d82cac58SJerin Jacob  *   The identifier of the device.
759d82cac58SJerin Jacob  * @param fd
760d82cac58SJerin Jacob  *   A pointer to a file for output.
761d82cac58SJerin Jacob  * @return
762d82cac58SJerin Jacob  *   - 0: on success.
763d82cac58SJerin Jacob  *   - <0: on failure.
764d82cac58SJerin Jacob  */
765d82cac58SJerin Jacob __rte_experimental
766d82cac58SJerin Jacob int
767d82cac58SJerin Jacob rte_ml_dev_dump(int16_t dev_id, FILE *fd);
768d82cac58SJerin Jacob 
769d82cac58SJerin Jacob /**
770d82cac58SJerin Jacob  * Trigger the ML device self test.
771d82cac58SJerin Jacob  *
772d82cac58SJerin Jacob  * @param dev_id
773d82cac58SJerin Jacob  *   The identifier of the device.
774d82cac58SJerin Jacob  * @return
775d82cac58SJerin Jacob  *   - 0: Selftest successful.
776d82cac58SJerin Jacob  *   - -ENOTSUP: if the device doesn't support selftest.
777d82cac58SJerin Jacob  *   - other values < 0 on failure.
778d82cac58SJerin Jacob  */
779d82cac58SJerin Jacob __rte_experimental
780d82cac58SJerin Jacob int
781d82cac58SJerin Jacob rte_ml_dev_selftest(int16_t dev_id);
782d82cac58SJerin Jacob 
783d82cac58SJerin Jacob /* Model operations */
784d82cac58SJerin Jacob 
785d82cac58SJerin Jacob /** ML model load parameters
786d82cac58SJerin Jacob  *
787d82cac58SJerin Jacob  * Parameters required to load an ML model.
788d82cac58SJerin Jacob  */
789d82cac58SJerin Jacob struct rte_ml_model_params {
790d82cac58SJerin Jacob 	void *addr;
791d82cac58SJerin Jacob 	/**< Address of model buffer */
792d82cac58SJerin Jacob 	size_t size;
793d82cac58SJerin Jacob 	/**< Size of model buffer */
794d82cac58SJerin Jacob };
795d82cac58SJerin Jacob 
796d82cac58SJerin Jacob /**
797d82cac58SJerin Jacob  * Load an ML model to the device.
798d82cac58SJerin Jacob  *
799d82cac58SJerin Jacob  * Load an ML model to the device with parameters requested in the structure rte_ml_model_params.
800d82cac58SJerin Jacob  *
801d82cac58SJerin Jacob  * @param[in] dev_id
802d82cac58SJerin Jacob  *   The identifier of the device.
803d82cac58SJerin Jacob  * @param[in] params
804d82cac58SJerin Jacob  *   Parameters for the model to be loaded.
805d82cac58SJerin Jacob  * @param[out] model_id
806d82cac58SJerin Jacob  *   Identifier of the model loaded.
807d82cac58SJerin Jacob  *
808d82cac58SJerin Jacob  * @return
809d82cac58SJerin Jacob  *   - 0: Success, Model loaded.
810d82cac58SJerin Jacob  *   - < 0: Failure, Error code of the model load driver function.
811d82cac58SJerin Jacob  */
812d82cac58SJerin Jacob __rte_experimental
813d82cac58SJerin Jacob int
814d82cac58SJerin Jacob rte_ml_model_load(int16_t dev_id, struct rte_ml_model_params *params, uint16_t *model_id);
815d82cac58SJerin Jacob 
816d82cac58SJerin Jacob /**
817d82cac58SJerin Jacob  * Unload an ML model from the device.
818d82cac58SJerin Jacob  *
819d82cac58SJerin Jacob  * @param[in] dev_id
820d82cac58SJerin Jacob  *   The identifier of the device.
821d82cac58SJerin Jacob  * @param[in] model_id
822d82cac58SJerin Jacob  *   Identifier of the model to be unloaded.
823d82cac58SJerin Jacob  *
824d82cac58SJerin Jacob  * @return
825d82cac58SJerin Jacob  *   - 0: Success, Model unloaded.
826d82cac58SJerin Jacob  *   - < 0: Failure, Error code of the model unload driver function.
827d82cac58SJerin Jacob  */
828d82cac58SJerin Jacob __rte_experimental
829d82cac58SJerin Jacob int
830d82cac58SJerin Jacob rte_ml_model_unload(int16_t dev_id, uint16_t model_id);
831d82cac58SJerin Jacob 
832d82cac58SJerin Jacob /**
833d82cac58SJerin Jacob  * Start an ML model for the given device ID.
834d82cac58SJerin Jacob  *
835d82cac58SJerin Jacob  * Start an ML model to accept inference requests.
836d82cac58SJerin Jacob  *
837d82cac58SJerin Jacob  * @param[in] dev_id
838d82cac58SJerin Jacob  *   The identifier of the device.
839d82cac58SJerin Jacob  * @param[in] model_id
840d82cac58SJerin Jacob  *   Identifier of the model to be started.
841d82cac58SJerin Jacob  *
842d82cac58SJerin Jacob  * @return
843d82cac58SJerin Jacob  *   - 0: Success, Model loaded.
844d82cac58SJerin Jacob  *   - < 0: Failure, Error code of the model start driver function.
845d82cac58SJerin Jacob  */
846d82cac58SJerin Jacob __rte_experimental
847d82cac58SJerin Jacob int
848d82cac58SJerin Jacob rte_ml_model_start(int16_t dev_id, uint16_t model_id);
849d82cac58SJerin Jacob 
850d82cac58SJerin Jacob /**
851d82cac58SJerin Jacob  * Stop an ML model for the given device ID.
852d82cac58SJerin Jacob  *
853d82cac58SJerin Jacob  * Model stop would disable the ML model to be used for inference jobs.
854d82cac58SJerin Jacob  * All inference jobs must have been completed before model stop is attempted.
855d82cac58SJerin Jacob 
856d82cac58SJerin Jacob  * @param[in] dev_id
857d82cac58SJerin Jacob  *   The identifier of the device.
858d82cac58SJerin Jacob  * @param[in] model_id
859d82cac58SJerin Jacob  *   Identifier of the model to be stopped.
860d82cac58SJerin Jacob  *
861d82cac58SJerin Jacob  * @return
862d82cac58SJerin Jacob  *   - 0: Success, Model unloaded.
863d82cac58SJerin Jacob  *   - < 0: Failure, Error code of the model stop driver function.
864d82cac58SJerin Jacob  */
865d82cac58SJerin Jacob __rte_experimental
866d82cac58SJerin Jacob int
867d82cac58SJerin Jacob rte_ml_model_stop(int16_t dev_id, uint16_t model_id);
868d82cac58SJerin Jacob 
869d82cac58SJerin Jacob /**
870d82cac58SJerin Jacob  * Input and output data types. ML models can operate on reduced precision
871d82cac58SJerin Jacob  * datatypes to achieve better power efficiency, lower network latency and lower memory footprint.
872d82cac58SJerin Jacob  * This enum is used to represent the lower precision integer and floating point types used
873d82cac58SJerin Jacob  * by ML models.
874d82cac58SJerin Jacob  */
875d82cac58SJerin Jacob enum rte_ml_io_type {
876d82cac58SJerin Jacob 	RTE_ML_IO_TYPE_UNKNOWN = 0,
877d82cac58SJerin Jacob 	/**< Invalid or unknown type */
878d82cac58SJerin Jacob 	RTE_ML_IO_TYPE_INT8,
879d82cac58SJerin Jacob 	/**< 8-bit integer */
880d82cac58SJerin Jacob 	RTE_ML_IO_TYPE_UINT8,
881d82cac58SJerin Jacob 	/**< 8-bit unsigned integer */
882d82cac58SJerin Jacob 	RTE_ML_IO_TYPE_INT16,
883d82cac58SJerin Jacob 	/**< 16-bit integer */
884d82cac58SJerin Jacob 	RTE_ML_IO_TYPE_UINT16,
885d82cac58SJerin Jacob 	/**< 16-bit unsigned integer */
886d82cac58SJerin Jacob 	RTE_ML_IO_TYPE_INT32,
887d82cac58SJerin Jacob 	/**< 32-bit integer */
888d82cac58SJerin Jacob 	RTE_ML_IO_TYPE_UINT32,
889d82cac58SJerin Jacob 	/**< 32-bit unsigned integer */
89042f3dcd9SSrikanth Yalavarthi 	RTE_ML_IO_TYPE_INT64,
89142f3dcd9SSrikanth Yalavarthi 	/**< 32-bit integer */
89242f3dcd9SSrikanth Yalavarthi 	RTE_ML_IO_TYPE_UINT64,
89342f3dcd9SSrikanth Yalavarthi 	/**< 32-bit unsigned integer */
894d82cac58SJerin Jacob 	RTE_ML_IO_TYPE_FP8,
895d82cac58SJerin Jacob 	/**< 8-bit floating point number */
896d82cac58SJerin Jacob 	RTE_ML_IO_TYPE_FP16,
897d82cac58SJerin Jacob 	/**< IEEE 754 16-bit floating point number */
898d82cac58SJerin Jacob 	RTE_ML_IO_TYPE_FP32,
899d82cac58SJerin Jacob 	/**< IEEE 754 32-bit floating point number */
900d82cac58SJerin Jacob 	RTE_ML_IO_TYPE_BFLOAT16
901d82cac58SJerin Jacob 	/**< 16-bit brain floating point number. */
902d82cac58SJerin Jacob };
903d82cac58SJerin Jacob 
90424364292SSrikanth Yalavarthi /** ML I/O buffer layout */
90524364292SSrikanth Yalavarthi enum rte_ml_io_layout {
90624364292SSrikanth Yalavarthi 	RTE_ML_IO_LAYOUT_PACKED,
90724364292SSrikanth Yalavarthi 	/**< All inputs for the model should packed in a single buffer with
90824364292SSrikanth Yalavarthi 	 * no padding between individual inputs. The buffer is expected to
90924364292SSrikanth Yalavarthi 	 * be aligned to rte_ml_dev_info::align_size.
91024364292SSrikanth Yalavarthi 	 *
91124364292SSrikanth Yalavarthi 	 * When I/O segmentation is supported by the device, the packed
91224364292SSrikanth Yalavarthi 	 * data can be split into multiple segments. In this case, each
91324364292SSrikanth Yalavarthi 	 * segment is expected to be aligned to rte_ml_dev_info::align_size
91424364292SSrikanth Yalavarthi 	 *
91524364292SSrikanth Yalavarthi 	 * Same applies to output.
91624364292SSrikanth Yalavarthi 	 *
91724364292SSrikanth Yalavarthi 	 * @see struct rte_ml_dev_info::max_segments
91824364292SSrikanth Yalavarthi 	 */
91924364292SSrikanth Yalavarthi 	RTE_ML_IO_LAYOUT_SPLIT
92024364292SSrikanth Yalavarthi 	/**< Each input for the model should be stored as separate buffers
92124364292SSrikanth Yalavarthi 	 * and each input should be aligned to rte_ml_dev_info::align_size.
92224364292SSrikanth Yalavarthi 	 *
92324364292SSrikanth Yalavarthi 	 * When I/O segmentation is supported, each input can be split into
92424364292SSrikanth Yalavarthi 	 * multiple segments. In this case, each segment is expected to be
92524364292SSrikanth Yalavarthi 	 * aligned to rte_ml_dev_info::align_size
92624364292SSrikanth Yalavarthi 	 *
92724364292SSrikanth Yalavarthi 	 * Same applies to output.
92824364292SSrikanth Yalavarthi 	 *
92924364292SSrikanth Yalavarthi 	 * @see struct rte_ml_dev_info::max_segments
93024364292SSrikanth Yalavarthi 	 */
93124364292SSrikanth Yalavarthi };
93224364292SSrikanth Yalavarthi 
93324364292SSrikanth Yalavarthi /**
93424364292SSrikanth Yalavarthi  * Input and output data information structure
935d82cac58SJerin Jacob  *
936d82cac58SJerin Jacob  * Specifies the type and shape of input and output data.
937d82cac58SJerin Jacob  */
938d82cac58SJerin Jacob struct rte_ml_io_info {
939d82cac58SJerin Jacob 	char name[RTE_ML_STR_MAX];
940d82cac58SJerin Jacob 	/**< Name of data */
9416ebb6f98SSrikanth Yalavarthi 	uint32_t nb_dims;
9426ebb6f98SSrikanth Yalavarthi 	/**< Number of dimensions in shape */
9436ebb6f98SSrikanth Yalavarthi 	uint32_t *shape;
94424364292SSrikanth Yalavarthi 	/**< Shape of the tensor for rte_ml_model_info::min_batches of the model. */
9456ebb6f98SSrikanth Yalavarthi 	enum rte_ml_io_type type;
9466ebb6f98SSrikanth Yalavarthi 	/**< Type of data
9476ebb6f98SSrikanth Yalavarthi 	 * @see enum rte_ml_io_type
9486ebb6f98SSrikanth Yalavarthi 	 */
9496ebb6f98SSrikanth Yalavarthi 	uint64_t nb_elements;
950*fe8eba69SSrikanth Yalavarthi 	/**< Number of elements in tensor */
9516ebb6f98SSrikanth Yalavarthi 	uint64_t size;
952*fe8eba69SSrikanth Yalavarthi 	/**< Size of tensor in bytes */
953*fe8eba69SSrikanth Yalavarthi 	float scale;
954*fe8eba69SSrikanth Yalavarthi 	/**< Scale factor */
955*fe8eba69SSrikanth Yalavarthi 	int64_t zero_point;
956*fe8eba69SSrikanth Yalavarthi 	/**< Zero point */
957d82cac58SJerin Jacob };
958d82cac58SJerin Jacob 
959d82cac58SJerin Jacob /** Model information structure */
960d82cac58SJerin Jacob struct rte_ml_model_info {
961d82cac58SJerin Jacob 	char name[RTE_ML_STR_MAX];
962d82cac58SJerin Jacob 	/**< Model name. */
963d82cac58SJerin Jacob 	char version[RTE_ML_STR_MAX];
964d82cac58SJerin Jacob 	/**< Model version */
965d82cac58SJerin Jacob 	uint16_t model_id;
966d82cac58SJerin Jacob 	/**< Model ID */
967d82cac58SJerin Jacob 	uint16_t device_id;
968d82cac58SJerin Jacob 	/**< Device ID */
96924364292SSrikanth Yalavarthi 	enum rte_ml_io_layout io_layout;
97024364292SSrikanth Yalavarthi 	/**< I/O buffer layout for the model */
97124364292SSrikanth Yalavarthi 	uint16_t min_batches;
97224364292SSrikanth Yalavarthi 	/**< Minimum number of batches that the model can process
97324364292SSrikanth Yalavarthi 	 * in one inference request
97424364292SSrikanth Yalavarthi 	 */
97524364292SSrikanth Yalavarthi 	uint16_t max_batches;
97624364292SSrikanth Yalavarthi 	/**< Maximum number of batches that the model can process
97724364292SSrikanth Yalavarthi 	 * in one inference request
97824364292SSrikanth Yalavarthi 	 */
979d82cac58SJerin Jacob 	uint32_t nb_inputs;
980d82cac58SJerin Jacob 	/**< Number of inputs */
981d82cac58SJerin Jacob 	const struct rte_ml_io_info *input_info;
982d82cac58SJerin Jacob 	/**< Input info array. Array size is equal to nb_inputs */
983d82cac58SJerin Jacob 	uint32_t nb_outputs;
984d82cac58SJerin Jacob 	/**< Number of outputs */
985d82cac58SJerin Jacob 	const struct rte_ml_io_info *output_info;
986d82cac58SJerin Jacob 	/**< Output info array. Array size is equal to nb_output */
987d82cac58SJerin Jacob 	uint64_t wb_size;
988d82cac58SJerin Jacob 	/**< Size of model weights and bias */
989d82cac58SJerin Jacob };
990d82cac58SJerin Jacob 
991d82cac58SJerin Jacob /**
992d82cac58SJerin Jacob  * Get ML model information.
993d82cac58SJerin Jacob  *
994d82cac58SJerin Jacob  * @param[in] dev_id
995d82cac58SJerin Jacob  *   The identifier of the device.
996d82cac58SJerin Jacob  * @param[in] model_id
997d82cac58SJerin Jacob  *   Identifier for the model created
998d82cac58SJerin Jacob  * @param[out] model_info
999d82cac58SJerin Jacob  *   Pointer to a model info structure
1000d82cac58SJerin Jacob  *
1001d82cac58SJerin Jacob  * @return
1002d82cac58SJerin Jacob  *   - Returns 0 on success
1003d82cac58SJerin Jacob  *   - Returns negative value on failure
1004d82cac58SJerin Jacob  */
1005d82cac58SJerin Jacob __rte_experimental
1006d82cac58SJerin Jacob int
1007d82cac58SJerin Jacob rte_ml_model_info_get(int16_t dev_id, uint16_t model_id, struct rte_ml_model_info *model_info);
1008d82cac58SJerin Jacob 
1009d82cac58SJerin Jacob /**
1010d82cac58SJerin Jacob  * Update the model parameters without unloading model.
1011d82cac58SJerin Jacob  *
1012d82cac58SJerin Jacob  * Update model parameters such as weights and bias without unloading the model.
1013d82cac58SJerin Jacob  * rte_ml_model_stop() must be called before invoking this API.
1014d82cac58SJerin Jacob  *
1015d82cac58SJerin Jacob  * @param[in] dev_id
1016d82cac58SJerin Jacob  *   The identifier of the device.
1017d82cac58SJerin Jacob  * @param[in] model_id
1018d82cac58SJerin Jacob  *   Identifier for the model created
1019d82cac58SJerin Jacob  * @param[in] buffer
1020d82cac58SJerin Jacob  *   Pointer to the model weights and bias buffer.
1021d82cac58SJerin Jacob  * Size of the buffer is equal to wb_size returned in *rte_ml_model_info*.
1022d82cac58SJerin Jacob  *
1023d82cac58SJerin Jacob  * @return
1024d82cac58SJerin Jacob  *   - Returns 0 on success
1025d82cac58SJerin Jacob  *   - Returns negative value on failure
1026d82cac58SJerin Jacob  */
1027d82cac58SJerin Jacob __rte_experimental
1028d82cac58SJerin Jacob int
1029d82cac58SJerin Jacob rte_ml_model_params_update(int16_t dev_id, uint16_t model_id, void *buffer);
1030d82cac58SJerin Jacob 
1031d82cac58SJerin Jacob /* IO operations */
1032d82cac58SJerin Jacob 
1033d82cac58SJerin Jacob /**
103465282e9fSSrikanth Yalavarthi  * Convert a buffer containing numbers in single precision floating format (float32) to signed 8-bit
103565282e9fSSrikanth Yalavarthi  * integer format (INT8).
103665282e9fSSrikanth Yalavarthi  *
103765282e9fSSrikanth Yalavarthi  * @param[in] fp32
103865282e9fSSrikanth Yalavarthi  *      Input buffer containing float32 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
103965282e9fSSrikanth Yalavarthi  * @param[out] i8
104065282e9fSSrikanth Yalavarthi  *      Output buffer to store INT8 numbers. Size of buffer is equal to (nb_elements * 1) bytes.
104165282e9fSSrikanth Yalavarthi  * @param[in] nb_elements
104265282e9fSSrikanth Yalavarthi  *      Number of elements in the buffer.
104365282e9fSSrikanth Yalavarthi  * @param[in] scale
104465282e9fSSrikanth Yalavarthi  *      Scale factor for conversion.
104565282e9fSSrikanth Yalavarthi  * @param[in] zero_point
104665282e9fSSrikanth Yalavarthi  *      Zero point for conversion.
104765282e9fSSrikanth Yalavarthi  *
104865282e9fSSrikanth Yalavarthi  * @return
104965282e9fSSrikanth Yalavarthi  *      - 0, Success.
105065282e9fSSrikanth Yalavarthi  *      - < 0, Error code on failure.
105165282e9fSSrikanth Yalavarthi  */
105265282e9fSSrikanth Yalavarthi __rte_experimental
105365282e9fSSrikanth Yalavarthi int
105465282e9fSSrikanth Yalavarthi rte_ml_io_float32_to_int8(const void *fp32, void *i8, uint64_t nb_elements, float scale,
105565282e9fSSrikanth Yalavarthi 			  int8_t zero_point);
105665282e9fSSrikanth Yalavarthi 
105765282e9fSSrikanth Yalavarthi /**
105865282e9fSSrikanth Yalavarthi  * Convert a buffer containing numbers in signed 8-bit integer format (INT8) to single precision
105965282e9fSSrikanth Yalavarthi  * floating format (float32).
106065282e9fSSrikanth Yalavarthi  *
106165282e9fSSrikanth Yalavarthi  * @param[in] i8
106265282e9fSSrikanth Yalavarthi  *      Input buffer containing INT8 numbers. Size of buffer is equal to (nb_elements * 1) bytes.
106365282e9fSSrikanth Yalavarthi  * @param[out] fp32
106465282e9fSSrikanth Yalavarthi  *      Output buffer to store float32 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
106565282e9fSSrikanth Yalavarthi  * @param[in] nb_elements
106665282e9fSSrikanth Yalavarthi  *      Number of elements in the buffer.
106765282e9fSSrikanth Yalavarthi  * @param[in] scale
106865282e9fSSrikanth Yalavarthi  *      Scale factor for conversion.
106965282e9fSSrikanth Yalavarthi  * @param[in] zero_point
107065282e9fSSrikanth Yalavarthi  *      Zero point for conversion.
107165282e9fSSrikanth Yalavarthi  *
107265282e9fSSrikanth Yalavarthi  * @return
107365282e9fSSrikanth Yalavarthi  *      - 0, Success.
107465282e9fSSrikanth Yalavarthi  *      - < 0, Error code on failure.
107565282e9fSSrikanth Yalavarthi  */
107665282e9fSSrikanth Yalavarthi __rte_experimental
107765282e9fSSrikanth Yalavarthi int
107865282e9fSSrikanth Yalavarthi rte_ml_io_int8_to_float32(const void *i8, void *fp32, uint64_t nb_elements, float scale,
107965282e9fSSrikanth Yalavarthi 			  int8_t zero_point);
108065282e9fSSrikanth Yalavarthi 
108165282e9fSSrikanth Yalavarthi /**
108265282e9fSSrikanth Yalavarthi  * Convert a buffer containing numbers in single precision floating format (float32) to unsigned
108365282e9fSSrikanth Yalavarthi  * 8-bit integer format (UINT8).
108465282e9fSSrikanth Yalavarthi  *
108565282e9fSSrikanth Yalavarthi  * @param[in] fp32
108665282e9fSSrikanth Yalavarthi  *      Input buffer containing float32 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
108765282e9fSSrikanth Yalavarthi  * @param[out] ui8
108865282e9fSSrikanth Yalavarthi  *      Output buffer to store UINT8 numbers. Size of buffer is equal to (nb_elements * 1) bytes.
108965282e9fSSrikanth Yalavarthi  * @param[in] nb_elements
109065282e9fSSrikanth Yalavarthi  *      Number of elements in the buffer.
109165282e9fSSrikanth Yalavarthi  * @param[in] scale
109265282e9fSSrikanth Yalavarthi  *      Scale factor for conversion.
109365282e9fSSrikanth Yalavarthi  * @param[in] zero_point
109465282e9fSSrikanth Yalavarthi  *      Zero point for conversion.
109565282e9fSSrikanth Yalavarthi  *
109665282e9fSSrikanth Yalavarthi  * @return
109765282e9fSSrikanth Yalavarthi  *      - 0, Success.
109865282e9fSSrikanth Yalavarthi  *      - < 0, Error code on failure.
109965282e9fSSrikanth Yalavarthi  */
110065282e9fSSrikanth Yalavarthi __rte_experimental
110165282e9fSSrikanth Yalavarthi int
110265282e9fSSrikanth Yalavarthi rte_ml_io_float32_to_uint8(const void *fp32, void *ui8, uint64_t nb_elements, float scale,
110365282e9fSSrikanth Yalavarthi 			   uint8_t zero_point);
110465282e9fSSrikanth Yalavarthi 
110565282e9fSSrikanth Yalavarthi /**
110665282e9fSSrikanth Yalavarthi  * Convert a buffer containing numbers in unsigned 8-bit integer format (UINT8) to single precision
110765282e9fSSrikanth Yalavarthi  * floating format (float32).
110865282e9fSSrikanth Yalavarthi  *
110965282e9fSSrikanth Yalavarthi  * @param[in] ui8
111065282e9fSSrikanth Yalavarthi  *      Input buffer containing UINT8 numbers. Size of buffer is equal to (nb_elements * 1) bytes.
111165282e9fSSrikanth Yalavarthi  * @param[out] fp32
111265282e9fSSrikanth Yalavarthi  *      Output buffer to store float32 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
111365282e9fSSrikanth Yalavarthi  * @param[in] nb_elements
111465282e9fSSrikanth Yalavarthi  *      Number of elements in the buffer.
111565282e9fSSrikanth Yalavarthi  * @param[in] scale
111665282e9fSSrikanth Yalavarthi  *      Scale factor for conversion.
111765282e9fSSrikanth Yalavarthi  * @param[in] zero_point
111865282e9fSSrikanth Yalavarthi  *      Zero point for conversion.
111965282e9fSSrikanth Yalavarthi  *
112065282e9fSSrikanth Yalavarthi  * @return
112165282e9fSSrikanth Yalavarthi  *      - 0, Success.
112265282e9fSSrikanth Yalavarthi  *      - < 0, Error code on failure.
112365282e9fSSrikanth Yalavarthi  */
112465282e9fSSrikanth Yalavarthi __rte_experimental
112565282e9fSSrikanth Yalavarthi int
112665282e9fSSrikanth Yalavarthi rte_ml_io_uint8_to_float32(const void *ui8, void *fp32, uint64_t nb_elements, float scale,
112765282e9fSSrikanth Yalavarthi 			   uint8_t zero_point);
112865282e9fSSrikanth Yalavarthi 
112965282e9fSSrikanth Yalavarthi /**
113065282e9fSSrikanth Yalavarthi  * Convert a buffer containing numbers in single precision floating format (float32) to signed
113165282e9fSSrikanth Yalavarthi  * 16-bit integer format (INT16).
113265282e9fSSrikanth Yalavarthi  *
113365282e9fSSrikanth Yalavarthi  * @param[in] fp32
113465282e9fSSrikanth Yalavarthi  *      Input buffer containing float32 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
113565282e9fSSrikanth Yalavarthi  * @param[out] i16
113665282e9fSSrikanth Yalavarthi  *      Output buffer to store INT16 numbers. Size of buffer is equal to (nb_elements * 2) bytes.
113765282e9fSSrikanth Yalavarthi  * @param[in] nb_elements
113865282e9fSSrikanth Yalavarthi  *      Number of elements in the buffer.
113965282e9fSSrikanth Yalavarthi  * @param[in] scale
114065282e9fSSrikanth Yalavarthi  *      Scale factor for conversion.
114165282e9fSSrikanth Yalavarthi  * @param[in] zero_point
114265282e9fSSrikanth Yalavarthi  *      Zero point for conversion.
114365282e9fSSrikanth Yalavarthi  *
114465282e9fSSrikanth Yalavarthi  * @return
114565282e9fSSrikanth Yalavarthi  *      - 0, Success.
114665282e9fSSrikanth Yalavarthi  *      - < 0, Error code on failure.
114765282e9fSSrikanth Yalavarthi  */
114865282e9fSSrikanth Yalavarthi __rte_experimental
114965282e9fSSrikanth Yalavarthi int
115065282e9fSSrikanth Yalavarthi rte_ml_io_float32_to_int16(const void *fp32, void *i16, uint64_t nb_elements, float scale,
115165282e9fSSrikanth Yalavarthi 			   int16_t zero_point);
115265282e9fSSrikanth Yalavarthi 
115365282e9fSSrikanth Yalavarthi /**
115465282e9fSSrikanth Yalavarthi  * Convert a buffer containing numbers in signed 16-bit integer format (INT16) to single precision
115565282e9fSSrikanth Yalavarthi  * floating format (float32).
115665282e9fSSrikanth Yalavarthi  *
115765282e9fSSrikanth Yalavarthi  * @param[in] i16
115865282e9fSSrikanth Yalavarthi  *      Input buffer containing INT16 numbers. Size of buffer is equal to (nb_elements * 2) bytes.
115965282e9fSSrikanth Yalavarthi  * @param[out] fp32
116065282e9fSSrikanth Yalavarthi  *      Output buffer to store float32 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
116165282e9fSSrikanth Yalavarthi  * @param[in] nb_elements
116265282e9fSSrikanth Yalavarthi  *      Number of elements in the buffer.
116365282e9fSSrikanth Yalavarthi  * @param[in] scale
116465282e9fSSrikanth Yalavarthi  *      Scale factor for conversion.
116565282e9fSSrikanth Yalavarthi  * @param[in] zero_point
116665282e9fSSrikanth Yalavarthi  *      Zero point for conversion.
116765282e9fSSrikanth Yalavarthi  *
116865282e9fSSrikanth Yalavarthi  * @return
116965282e9fSSrikanth Yalavarthi  *      - 0, Success.
117065282e9fSSrikanth Yalavarthi  *      - < 0, Error code on failure.
117165282e9fSSrikanth Yalavarthi  */
117265282e9fSSrikanth Yalavarthi __rte_experimental
117365282e9fSSrikanth Yalavarthi int
117465282e9fSSrikanth Yalavarthi rte_ml_io_int16_to_float32(const void *i16, void *fp32, uint64_t nb_elements, float scale,
117565282e9fSSrikanth Yalavarthi 			   int16_t zero_point);
117665282e9fSSrikanth Yalavarthi 
117765282e9fSSrikanth Yalavarthi /**
117865282e9fSSrikanth Yalavarthi  * Convert a buffer containing numbers in single precision floating format (float32) to unsigned
117965282e9fSSrikanth Yalavarthi  * 16-bit integer format (UINT16).
118065282e9fSSrikanth Yalavarthi  *
118165282e9fSSrikanth Yalavarthi  * @param[in] fp32
118265282e9fSSrikanth Yalavarthi  *      Input buffer containing float32 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
118365282e9fSSrikanth Yalavarthi  * @param[out] ui16
118465282e9fSSrikanth Yalavarthi  *      Output buffer to store UINT16 numbers. Size of buffer is equal to (nb_elements * 2) bytes.
118565282e9fSSrikanth Yalavarthi  * @param[in] nb_elements
118665282e9fSSrikanth Yalavarthi  *      Number of elements in the buffer.
118765282e9fSSrikanth Yalavarthi  * @param[in] scale
118865282e9fSSrikanth Yalavarthi  *      Scale factor for conversion.
118965282e9fSSrikanth Yalavarthi  * @param[in] zero_point
119065282e9fSSrikanth Yalavarthi  *      Zero point for conversion.
119165282e9fSSrikanth Yalavarthi  *
119265282e9fSSrikanth Yalavarthi  * @return
119365282e9fSSrikanth Yalavarthi  *      - 0, Success.
119465282e9fSSrikanth Yalavarthi  *      - < 0, Error code on failure.
119565282e9fSSrikanth Yalavarthi  */
119665282e9fSSrikanth Yalavarthi __rte_experimental
119765282e9fSSrikanth Yalavarthi int
119865282e9fSSrikanth Yalavarthi rte_ml_io_float32_to_uint16(const void *fp32, void *ui16, uint64_t nb_elements, float scale,
119965282e9fSSrikanth Yalavarthi 			    uint16_t zero_point);
120065282e9fSSrikanth Yalavarthi 
120165282e9fSSrikanth Yalavarthi /**
120265282e9fSSrikanth Yalavarthi  * Convert a buffer containing numbers in unsigned 16-bit integer format (UINT16) to single
120365282e9fSSrikanth Yalavarthi  * precision floating format (float32).
120465282e9fSSrikanth Yalavarthi  *
120565282e9fSSrikanth Yalavarthi  * @param[in] ui16
120665282e9fSSrikanth Yalavarthi  *      Input buffer containing UINT16 numbers. Size of buffer is equal to (nb_elements * 2) bytes.
120765282e9fSSrikanth Yalavarthi  * @param[out] fp32
120865282e9fSSrikanth Yalavarthi  *      Output buffer to store float32 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
120965282e9fSSrikanth Yalavarthi  * @param[in] nb_elements
121065282e9fSSrikanth Yalavarthi  *      Number of elements in the buffer.
121165282e9fSSrikanth Yalavarthi  * @param[in] scale
121265282e9fSSrikanth Yalavarthi  *      Scale factor for conversion.
121365282e9fSSrikanth Yalavarthi  * @param[in] zero_point
121465282e9fSSrikanth Yalavarthi  *      Zero point for conversion.
121565282e9fSSrikanth Yalavarthi  *
121665282e9fSSrikanth Yalavarthi  * @return
121765282e9fSSrikanth Yalavarthi  *      - 0, Success.
121865282e9fSSrikanth Yalavarthi  *      - < 0, Error code on failure.
121965282e9fSSrikanth Yalavarthi  */
122065282e9fSSrikanth Yalavarthi __rte_experimental
122165282e9fSSrikanth Yalavarthi int
122265282e9fSSrikanth Yalavarthi rte_ml_io_uint16_to_float32(const void *ui16, void *fp32, uint64_t nb_elements, float scale,
122365282e9fSSrikanth Yalavarthi 			    uint16_t zero_point);
122465282e9fSSrikanth Yalavarthi 
122565282e9fSSrikanth Yalavarthi /**
122665282e9fSSrikanth Yalavarthi  * Convert a buffer containing numbers in single precision floating format (float32) to signed
122765282e9fSSrikanth Yalavarthi  * 32-bit integer format (INT32).
122865282e9fSSrikanth Yalavarthi  *
122965282e9fSSrikanth Yalavarthi  * @param[in] fp32
123065282e9fSSrikanth Yalavarthi  *      Input buffer containing float32 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
123165282e9fSSrikanth Yalavarthi  * @param[out] i32
123265282e9fSSrikanth Yalavarthi  *      Output buffer to store INT32 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
123365282e9fSSrikanth Yalavarthi  * @param[in] nb_elements
123465282e9fSSrikanth Yalavarthi  *      Number of elements in the buffer.
123565282e9fSSrikanth Yalavarthi  * @param[in] scale
123665282e9fSSrikanth Yalavarthi  *      Scale factor for conversion.
123765282e9fSSrikanth Yalavarthi  * @param[in] zero_point
123865282e9fSSrikanth Yalavarthi  *      Zero point for conversion.
123965282e9fSSrikanth Yalavarthi  *
124065282e9fSSrikanth Yalavarthi  * @return
124165282e9fSSrikanth Yalavarthi  *      - 0, Success.
124265282e9fSSrikanth Yalavarthi  *      - < 0, Error code on failure.
124365282e9fSSrikanth Yalavarthi  */
124465282e9fSSrikanth Yalavarthi __rte_experimental
124565282e9fSSrikanth Yalavarthi int
124665282e9fSSrikanth Yalavarthi rte_ml_io_float32_to_int32(const void *fp32, void *i32, uint64_t nb_elements, float scale,
124765282e9fSSrikanth Yalavarthi 			   int32_t zero_point);
124865282e9fSSrikanth Yalavarthi 
124965282e9fSSrikanth Yalavarthi /**
125065282e9fSSrikanth Yalavarthi  * Convert a buffer containing numbers in signed 32-bit integer format (INT32) to single precision
125165282e9fSSrikanth Yalavarthi  * floating format (float32).
125265282e9fSSrikanth Yalavarthi  *
125365282e9fSSrikanth Yalavarthi  * @param[in] i32
125465282e9fSSrikanth Yalavarthi  *      Input buffer containing INT32 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
125565282e9fSSrikanth Yalavarthi  * @param[out] fp32
125665282e9fSSrikanth Yalavarthi  *      Output buffer to store float32 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
125765282e9fSSrikanth Yalavarthi  * @param[in] nb_elements
125865282e9fSSrikanth Yalavarthi  *      Number of elements in the buffer.
125965282e9fSSrikanth Yalavarthi  * @param[in] scale
126065282e9fSSrikanth Yalavarthi  *      Scale factor for conversion.
126165282e9fSSrikanth Yalavarthi  * @param[in] zero_point
126265282e9fSSrikanth Yalavarthi  *      Zero point for conversion.
126365282e9fSSrikanth Yalavarthi  *
126465282e9fSSrikanth Yalavarthi  * @return
126565282e9fSSrikanth Yalavarthi  *      - 0, Success.
126665282e9fSSrikanth Yalavarthi  *      - < 0, Error code on failure.
126765282e9fSSrikanth Yalavarthi  */
126865282e9fSSrikanth Yalavarthi 
126965282e9fSSrikanth Yalavarthi __rte_experimental
127065282e9fSSrikanth Yalavarthi int
127165282e9fSSrikanth Yalavarthi rte_ml_io_int32_to_float32(const void *i32, void *fp32, uint64_t nb_elements, float scale,
127265282e9fSSrikanth Yalavarthi 			   int32_t zero_point);
127365282e9fSSrikanth Yalavarthi 
127465282e9fSSrikanth Yalavarthi /**
127565282e9fSSrikanth Yalavarthi  * Convert a buffer containing numbers in single precision floating format (float32) to unsigned
127665282e9fSSrikanth Yalavarthi  * 32-bit integer format (UINT32).
127765282e9fSSrikanth Yalavarthi  *
127865282e9fSSrikanth Yalavarthi  * @param[in] fp32
127965282e9fSSrikanth Yalavarthi  *      Input buffer containing float32 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
128065282e9fSSrikanth Yalavarthi  * @param[out] ui32
128165282e9fSSrikanth Yalavarthi  *      Output buffer to store UINT32 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
128265282e9fSSrikanth Yalavarthi  * @param[in] nb_elements
128365282e9fSSrikanth Yalavarthi  *      Number of elements in the buffer.
128465282e9fSSrikanth Yalavarthi  * @param[in] scale
128565282e9fSSrikanth Yalavarthi  *      Scale factor for conversion.
128665282e9fSSrikanth Yalavarthi  * @param[in] zero_point
128765282e9fSSrikanth Yalavarthi  *      Zero point for conversion.
128865282e9fSSrikanth Yalavarthi  *
128965282e9fSSrikanth Yalavarthi  * @return
129065282e9fSSrikanth Yalavarthi  *      - 0, Success.
129165282e9fSSrikanth Yalavarthi  *      - < 0, Error code on failure.
129265282e9fSSrikanth Yalavarthi  */
129365282e9fSSrikanth Yalavarthi __rte_experimental
129465282e9fSSrikanth Yalavarthi int
129565282e9fSSrikanth Yalavarthi rte_ml_io_float32_to_uint32(const void *fp32, void *ui32, uint64_t nb_elements, float scale,
129665282e9fSSrikanth Yalavarthi 			    uint32_t zero_point);
129765282e9fSSrikanth Yalavarthi 
129865282e9fSSrikanth Yalavarthi /**
129965282e9fSSrikanth Yalavarthi  * Convert a buffer containing numbers in unsigned 32-bit integer format (UINT32) to single
130065282e9fSSrikanth Yalavarthi  * precision floating format (float32).
130165282e9fSSrikanth Yalavarthi  *
130265282e9fSSrikanth Yalavarthi  * @param[in] ui32
130365282e9fSSrikanth Yalavarthi  *      Input buffer containing UINT32 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
130465282e9fSSrikanth Yalavarthi  * @param[out] fp32
130565282e9fSSrikanth Yalavarthi  *      Output buffer to store float32 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
130665282e9fSSrikanth Yalavarthi  * @param[in] nb_elements
130765282e9fSSrikanth Yalavarthi  *      Number of elements in the buffer.
130865282e9fSSrikanth Yalavarthi  * @param[in] scale
130965282e9fSSrikanth Yalavarthi  *      Scale factor for conversion.
131065282e9fSSrikanth Yalavarthi  * @param[in] zero_point
131165282e9fSSrikanth Yalavarthi  *      Zero point for conversion.
131265282e9fSSrikanth Yalavarthi  *
131365282e9fSSrikanth Yalavarthi  * @return
131465282e9fSSrikanth Yalavarthi  *      - 0, Success.
131565282e9fSSrikanth Yalavarthi  *      - < 0, Error code on failure.
131665282e9fSSrikanth Yalavarthi  */
131765282e9fSSrikanth Yalavarthi __rte_experimental
131865282e9fSSrikanth Yalavarthi int
131965282e9fSSrikanth Yalavarthi rte_ml_io_uint32_to_float32(const void *ui32, void *fp32, uint64_t nb_elements, float scale,
132065282e9fSSrikanth Yalavarthi 			    uint32_t zero_point);
132165282e9fSSrikanth Yalavarthi 
132265282e9fSSrikanth Yalavarthi /**
132365282e9fSSrikanth Yalavarthi  * Convert a buffer containing numbers in single precision floating format (float32) to signed
132465282e9fSSrikanth Yalavarthi  * 64-bit integer format (INT64).
132565282e9fSSrikanth Yalavarthi  *
132665282e9fSSrikanth Yalavarthi  * @param[in] fp32
132765282e9fSSrikanth Yalavarthi  *      Input buffer containing float32 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
132865282e9fSSrikanth Yalavarthi  * @param[out] i64
132965282e9fSSrikanth Yalavarthi  *      Output buffer to store INT64 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
133065282e9fSSrikanth Yalavarthi  * @param[in] nb_elements
133165282e9fSSrikanth Yalavarthi  *      Number of elements in the buffer.
133265282e9fSSrikanth Yalavarthi  * @param[in] scale
133365282e9fSSrikanth Yalavarthi  *      Scale factor for conversion.
133465282e9fSSrikanth Yalavarthi  * @param[in] zero_point
133565282e9fSSrikanth Yalavarthi  *      Zero point for conversion.
133665282e9fSSrikanth Yalavarthi  *
133765282e9fSSrikanth Yalavarthi  * @return
133865282e9fSSrikanth Yalavarthi  *      - 0, Success.
133965282e9fSSrikanth Yalavarthi  *      - < 0, Error code on failure.
134065282e9fSSrikanth Yalavarthi  */
134165282e9fSSrikanth Yalavarthi __rte_experimental
134265282e9fSSrikanth Yalavarthi int
134365282e9fSSrikanth Yalavarthi rte_ml_io_float32_to_int64(const void *fp32, void *i64, uint64_t nb_elements, float scale,
134465282e9fSSrikanth Yalavarthi 			   int64_t zero_point);
134565282e9fSSrikanth Yalavarthi 
134665282e9fSSrikanth Yalavarthi /**
134765282e9fSSrikanth Yalavarthi  * Convert a buffer containing numbers in signed 64-bit integer format (INT64) to single precision
134865282e9fSSrikanth Yalavarthi  * floating format (float32).
134965282e9fSSrikanth Yalavarthi  *
135065282e9fSSrikanth Yalavarthi  * @param[in] i64
135165282e9fSSrikanth Yalavarthi  *      Input buffer containing INT64 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
135265282e9fSSrikanth Yalavarthi  * @param[out] fp32
135365282e9fSSrikanth Yalavarthi  *      Output buffer to store float32 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
135465282e9fSSrikanth Yalavarthi  * @param[in] nb_elements
135565282e9fSSrikanth Yalavarthi  *      Number of elements in the buffer.
135665282e9fSSrikanth Yalavarthi  * @param[in] scale
135765282e9fSSrikanth Yalavarthi  *      Scale factor for conversion.
135865282e9fSSrikanth Yalavarthi  * @param[in] zero_point
135965282e9fSSrikanth Yalavarthi  *      Zero point for conversion.
136065282e9fSSrikanth Yalavarthi  *
136165282e9fSSrikanth Yalavarthi  * @return
136265282e9fSSrikanth Yalavarthi  *      - 0, Success.
136365282e9fSSrikanth Yalavarthi  *      - < 0, Error code on failure.
136465282e9fSSrikanth Yalavarthi  */
136565282e9fSSrikanth Yalavarthi __rte_experimental
136665282e9fSSrikanth Yalavarthi int
136765282e9fSSrikanth Yalavarthi rte_ml_io_int64_to_float32(const void *i64, void *fp32, uint64_t nb_elements, float scale,
136865282e9fSSrikanth Yalavarthi 			   int64_t zero_point);
136965282e9fSSrikanth Yalavarthi 
137065282e9fSSrikanth Yalavarthi /**
137165282e9fSSrikanth Yalavarthi  * Convert a buffer containing numbers in single precision floating format (float32) to unsigned
137265282e9fSSrikanth Yalavarthi  * 64-bit integer format (UINT64).
137365282e9fSSrikanth Yalavarthi  *
137465282e9fSSrikanth Yalavarthi  * @param[in] fp32
137565282e9fSSrikanth Yalavarthi  *      Input buffer containing float32 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
137665282e9fSSrikanth Yalavarthi  * @param[out] ui64
137765282e9fSSrikanth Yalavarthi  *      Output buffer to store UINT64 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
137865282e9fSSrikanth Yalavarthi  * @param[in] nb_elements
137965282e9fSSrikanth Yalavarthi  *      Number of elements in the buffer.
138065282e9fSSrikanth Yalavarthi  * @param[in] scale
138165282e9fSSrikanth Yalavarthi  *      Scale factor for conversion.
138265282e9fSSrikanth Yalavarthi  * @param[in] zero_point
138365282e9fSSrikanth Yalavarthi  *      Zero point for conversion.
138465282e9fSSrikanth Yalavarthi  *
138565282e9fSSrikanth Yalavarthi  * @return
138665282e9fSSrikanth Yalavarthi  *      - 0, Success.
138765282e9fSSrikanth Yalavarthi  *      - < 0, Error code on failure.
138865282e9fSSrikanth Yalavarthi  */
138965282e9fSSrikanth Yalavarthi __rte_experimental
139065282e9fSSrikanth Yalavarthi int
139165282e9fSSrikanth Yalavarthi rte_ml_io_float32_to_uint64(const void *fp32, void *ui64, uint64_t nb_elements, float scale,
139265282e9fSSrikanth Yalavarthi 			    uint64_t zero_point);
139365282e9fSSrikanth Yalavarthi 
139465282e9fSSrikanth Yalavarthi /**
139565282e9fSSrikanth Yalavarthi  * Convert a buffer containing numbers in unsigned 64-bit integer format (UINT64) to single
139665282e9fSSrikanth Yalavarthi  *precision floating format (float32).
139765282e9fSSrikanth Yalavarthi  *
139865282e9fSSrikanth Yalavarthi  * @param[in] ui64
139965282e9fSSrikanth Yalavarthi  *      Input buffer containing UINT64 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
140065282e9fSSrikanth Yalavarthi  * @param[out] fp32
140165282e9fSSrikanth Yalavarthi  *      Output buffer to store float32 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
140265282e9fSSrikanth Yalavarthi  * @param[in] nb_elements
140365282e9fSSrikanth Yalavarthi  *      Number of elements in the buffer.
140465282e9fSSrikanth Yalavarthi  * @param[in] scale
140565282e9fSSrikanth Yalavarthi  *      Scale factor for conversion.
140665282e9fSSrikanth Yalavarthi  * @param[in] zero_point
140765282e9fSSrikanth Yalavarthi  *      Zero point for conversion.
140865282e9fSSrikanth Yalavarthi  *
140965282e9fSSrikanth Yalavarthi  * @return
141065282e9fSSrikanth Yalavarthi  *      - 0, Success.
141165282e9fSSrikanth Yalavarthi  *      - < 0, Error code on failure.
141265282e9fSSrikanth Yalavarthi  */
141365282e9fSSrikanth Yalavarthi __rte_experimental
141465282e9fSSrikanth Yalavarthi int
141565282e9fSSrikanth Yalavarthi rte_ml_io_uint64_to_float32(const void *ui64, void *fp32, uint64_t nb_elements, float scale,
141665282e9fSSrikanth Yalavarthi 			    uint64_t zero_point);
141765282e9fSSrikanth Yalavarthi 
141865282e9fSSrikanth Yalavarthi /**
141965282e9fSSrikanth Yalavarthi  * Convert a buffer containing numbers in single precision floating format (float32) to half
142065282e9fSSrikanth Yalavarthi  * precision floating point format (FP16).
142165282e9fSSrikanth Yalavarthi  *
142265282e9fSSrikanth Yalavarthi  * @param[in] fp32
142365282e9fSSrikanth Yalavarthi  *      Input buffer containing float32 numbers. Size of buffer is equal to (nb_elements *4) bytes.
142465282e9fSSrikanth Yalavarthi  * @param[out] fp16
142565282e9fSSrikanth Yalavarthi  *      Output buffer to store float16 numbers. Size of buffer is equal to (nb_elements * 2) bytes.
142665282e9fSSrikanth Yalavarthi  * @param[in] nb_elements
142765282e9fSSrikanth Yalavarthi  *      Number of elements in the buffer.
142865282e9fSSrikanth Yalavarthi  *
142965282e9fSSrikanth Yalavarthi  * @return
143065282e9fSSrikanth Yalavarthi  *      - 0, Success.
143165282e9fSSrikanth Yalavarthi  *      - < 0, Error code on failure.
143265282e9fSSrikanth Yalavarthi  */
143365282e9fSSrikanth Yalavarthi __rte_experimental
143465282e9fSSrikanth Yalavarthi int
143565282e9fSSrikanth Yalavarthi rte_ml_io_float32_to_float16(const void *fp32, void *fp16, uint64_t nb_elements);
143665282e9fSSrikanth Yalavarthi 
143765282e9fSSrikanth Yalavarthi /**
143865282e9fSSrikanth Yalavarthi  * Convert a buffer containing numbers in half precision floating format (FP16) to single precision
143965282e9fSSrikanth Yalavarthi  * floating point format (float32).
144065282e9fSSrikanth Yalavarthi  *
144165282e9fSSrikanth Yalavarthi  * @param[in] fp16
144265282e9fSSrikanth Yalavarthi  *      Input buffer containing float16 numbers. Size of buffer is equal to (nb_elements * 2) bytes.
144365282e9fSSrikanth Yalavarthi  * @param[out] fp32
144465282e9fSSrikanth Yalavarthi  *      Output buffer to store float32 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
144565282e9fSSrikanth Yalavarthi  * @param[in] nb_elements
144665282e9fSSrikanth Yalavarthi  *      Number of elements in the buffer.
144765282e9fSSrikanth Yalavarthi  *
144865282e9fSSrikanth Yalavarthi  * @return
144965282e9fSSrikanth Yalavarthi  *      - 0, Success.
145065282e9fSSrikanth Yalavarthi  *      - < 0, Error code on failure.
145165282e9fSSrikanth Yalavarthi  */
145265282e9fSSrikanth Yalavarthi __rte_experimental
145365282e9fSSrikanth Yalavarthi int
145465282e9fSSrikanth Yalavarthi rte_ml_io_float16_to_float32(const void *fp16, void *fp32, uint64_t nb_elements);
145565282e9fSSrikanth Yalavarthi 
145665282e9fSSrikanth Yalavarthi /**
145765282e9fSSrikanth Yalavarthi  * Convert a buffer containing numbers in single precision floating format (float32) to brain
145865282e9fSSrikanth Yalavarthi  * floating point format (bfloat16).
145965282e9fSSrikanth Yalavarthi  *
146065282e9fSSrikanth Yalavarthi  * @param[in] fp32
146165282e9fSSrikanth Yalavarthi  *      Input buffer containing float32 numbers. Size of buffer is equal to (nb_elements *4) bytes.
146265282e9fSSrikanth Yalavarthi  * @param[out] bf16
146365282e9fSSrikanth Yalavarthi  *      Output buffer to store bfloat16 numbers. Size of buffer is equal to (nb_elements * 2) bytes.
146465282e9fSSrikanth Yalavarthi  * @param[in] nb_elements
146565282e9fSSrikanth Yalavarthi  *      Number of elements in the buffer.
146665282e9fSSrikanth Yalavarthi  *
146765282e9fSSrikanth Yalavarthi  * @return
146865282e9fSSrikanth Yalavarthi  *      - 0, Success.
146965282e9fSSrikanth Yalavarthi  *      - < 0, Error code on failure.
147065282e9fSSrikanth Yalavarthi  */
147165282e9fSSrikanth Yalavarthi __rte_experimental
147265282e9fSSrikanth Yalavarthi int
147365282e9fSSrikanth Yalavarthi rte_ml_io_float32_to_bfloat16(const void *fp32, void *bf16, uint64_t nb_elements);
147465282e9fSSrikanth Yalavarthi 
147565282e9fSSrikanth Yalavarthi /**
147665282e9fSSrikanth Yalavarthi  * Convert a buffer containing numbers in brain floating point format (bfloat16) to single precision
147765282e9fSSrikanth Yalavarthi  * floating point format (float32).
147865282e9fSSrikanth Yalavarthi  *
147965282e9fSSrikanth Yalavarthi  * @param[in] bf16
148065282e9fSSrikanth Yalavarthi  *      Input buffer containing bfloat16 numbers. Size of buffer is equal to (nb_elements * 2)
148165282e9fSSrikanth Yalavarthi  * bytes.
148265282e9fSSrikanth Yalavarthi  * @param[out] fp32
148365282e9fSSrikanth Yalavarthi  *      Output buffer to store float32 numbers. Size of buffer is equal to (nb_elements * 4) bytes.
148465282e9fSSrikanth Yalavarthi  * @param[in] nb_elements
148565282e9fSSrikanth Yalavarthi  *      Number of elements in the buffer.
148665282e9fSSrikanth Yalavarthi  *
148765282e9fSSrikanth Yalavarthi  * @return
148865282e9fSSrikanth Yalavarthi  *      - 0, Success.
148965282e9fSSrikanth Yalavarthi  *      - < 0, Error code on failure.
149065282e9fSSrikanth Yalavarthi  */
149165282e9fSSrikanth Yalavarthi __rte_experimental
149265282e9fSSrikanth Yalavarthi int
149365282e9fSSrikanth Yalavarthi rte_ml_io_bfloat16_to_float32(const void *bf16, void *fp32, uint64_t nb_elements);
149465282e9fSSrikanth Yalavarthi 
149565282e9fSSrikanth Yalavarthi /**
1496d82cac58SJerin Jacob  * Quantize input data.
1497d82cac58SJerin Jacob  *
1498d82cac58SJerin Jacob  * Quantization converts data from a higher precision types to a lower precision types to improve
1499d82cac58SJerin Jacob  * the throughput and efficiency of the model execution with minimal loss of accuracy.
1500d82cac58SJerin Jacob  * Types of dequantized data and quantized data are specified by the model.
1501d82cac58SJerin Jacob  *
1502d82cac58SJerin Jacob  * @param[in] dev_id
1503d82cac58SJerin Jacob  *   The identifier of the device.
1504d82cac58SJerin Jacob  * @param[in] model_id
1505d82cac58SJerin Jacob  *   Identifier for the model
1506d82cac58SJerin Jacob  * @param[in] dbuffer
1507d82cac58SJerin Jacob  *   Address of dequantized input data
1508d82cac58SJerin Jacob  * @param[in] qbuffer
1509d82cac58SJerin Jacob  *   Address of quantized input data
1510d82cac58SJerin Jacob  *
1511d82cac58SJerin Jacob  * @return
1512d82cac58SJerin Jacob  *   - Returns 0 on success
1513d82cac58SJerin Jacob  *   - Returns negative value on failure
1514d82cac58SJerin Jacob  */
1515d82cac58SJerin Jacob __rte_experimental
1516d82cac58SJerin Jacob int
151724364292SSrikanth Yalavarthi rte_ml_io_quantize(int16_t dev_id, uint16_t model_id, struct rte_ml_buff_seg **dbuffer,
151824364292SSrikanth Yalavarthi 		   struct rte_ml_buff_seg **qbuffer);
1519d82cac58SJerin Jacob 
1520d82cac58SJerin Jacob /**
1521d82cac58SJerin Jacob  * Dequantize output data.
1522d82cac58SJerin Jacob  *
1523d82cac58SJerin Jacob  * Dequantization converts data from a lower precision type to a higher precision type.
1524d82cac58SJerin Jacob  * Types of quantized data and dequantized are specified by the model.
1525d82cac58SJerin Jacob  *
1526d82cac58SJerin Jacob  * @param[in] dev_id
1527d82cac58SJerin Jacob  *   The identifier of the device.
1528d82cac58SJerin Jacob  * @param[in] model_id
1529d82cac58SJerin Jacob  *   Identifier for the model
1530d82cac58SJerin Jacob  * @param[in] qbuffer
1531d82cac58SJerin Jacob  *   Address of quantized output data
1532d82cac58SJerin Jacob  * @param[in] dbuffer
1533d82cac58SJerin Jacob  *   Address of dequantized output data
1534d82cac58SJerin Jacob  *
1535d82cac58SJerin Jacob  * @return
1536d82cac58SJerin Jacob  *   - Returns 0 on success
1537d82cac58SJerin Jacob  *   - Returns negative value on failure
1538d82cac58SJerin Jacob  */
1539d82cac58SJerin Jacob __rte_experimental
1540d82cac58SJerin Jacob int
154124364292SSrikanth Yalavarthi rte_ml_io_dequantize(int16_t dev_id, uint16_t model_id, struct rte_ml_buff_seg **qbuffer,
154224364292SSrikanth Yalavarthi 		     struct rte_ml_buff_seg **dbuffer);
1543d82cac58SJerin Jacob 
1544d82cac58SJerin Jacob /* ML op pool operations */
1545d82cac58SJerin Jacob 
1546d82cac58SJerin Jacob /**
1547d82cac58SJerin Jacob  * Create an ML operation pool
1548d82cac58SJerin Jacob  *
1549d82cac58SJerin Jacob  * @param name
1550d82cac58SJerin Jacob  *   ML operations pool name
1551d82cac58SJerin Jacob  * @param nb_elts
1552d82cac58SJerin Jacob  *   Number of elements in pool
1553d82cac58SJerin Jacob  * @param cache_size
1554d82cac58SJerin Jacob  *   Number of elements to cache on lcore, see
1555d82cac58SJerin Jacob  *   *rte_mempool_create* for further details about cache size
1556d82cac58SJerin Jacob  * @param user_size
1557d82cac58SJerin Jacob  *   Size of private data to allocate for user with each operation
1558d82cac58SJerin Jacob  * @param socket_id
1559d82cac58SJerin Jacob  *   Socket to identifier allocate memory on
1560d82cac58SJerin Jacob  * @return
1561d82cac58SJerin Jacob  *  - On success pointer to mempool
1562d82cac58SJerin Jacob  *  - On failure NULL
1563d82cac58SJerin Jacob  */
1564d82cac58SJerin Jacob __rte_experimental
1565d82cac58SJerin Jacob struct rte_mempool *
1566d82cac58SJerin Jacob rte_ml_op_pool_create(const char *name, unsigned int nb_elts, unsigned int cache_size,
1567d82cac58SJerin Jacob 		      uint16_t user_size, int socket_id);
1568d82cac58SJerin Jacob 
1569d82cac58SJerin Jacob /**
1570d82cac58SJerin Jacob  * Free an ML operation pool
1571d82cac58SJerin Jacob  *
1572d82cac58SJerin Jacob  * @param mempool
1573d82cac58SJerin Jacob  *   A pointer to the mempool structure.
1574d82cac58SJerin Jacob  *   If NULL then, the function does nothing.
1575d82cac58SJerin Jacob  */
1576d82cac58SJerin Jacob __rte_experimental
1577d82cac58SJerin Jacob void
1578d82cac58SJerin Jacob rte_ml_op_pool_free(struct rte_mempool *mempool);
1579d82cac58SJerin Jacob 
1580d82cac58SJerin Jacob #ifdef __cplusplus
1581d82cac58SJerin Jacob }
1582d82cac58SJerin Jacob #endif
1583d82cac58SJerin Jacob 
1584d82cac58SJerin Jacob #endif /* RTE_MLDEV_H */
1585