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