NPU_SCHEDULER_VD
} npu_scheduler;
+/** @brief optional parameter for npu scheduler */
+typedef void *npu_scheduler_param;
+
static const uint32_t default_timeout = 3000;
static const npu_priority default_priority = NPU_PRIORITY_MID;
static const npu_notimode default_notimode = NPU_INTERRUPT;
* @brief [OPTIONAL] Set the request's scheduler
* @param[in] dev The NPU device handle
* @param[in] req_id The request ID
- * @param[in] scheduler npu scheduler
+ * @param[in] sched npu scheduler
+ * @param[in] [nullable] sched_param npu scheduler param
* @return 0 if no error. Otherwise a negative errno
* @note if this is not called, the default scheduler is used (see typedef.h).
*/
-int setNPU_requestScheduler (npudev_h dev, int req_id,
- npu_scheduler scheculder);
+int setNPU_requestScheduler (npudev_h dev, int req_id, npu_scheduler sched,
+ npu_scheduler_param sched_param);
/**
* @brief Submit the request to the NPU
* @return 0 if no error. Otherwise a negative errno
* @note this API ignores user-provided input and output data/info because
* the reserved kernel modules may provide input and output buffers.
- * Also, data manipulation is not supported.
+ * @note any data manipulation such as layout conversion is not supported.
+ * @note only VD NPU Scheduler is supported for now.
*/
int submitNPU_requestKernel (npudev_h dev, int req_id);
/**
* @brief Set the request's scheduler
* @param[in] req_id The request ID
- * @param[in] scheduler npu scheduler
+ * @param[in] sched npu scheduler
+ * @param[in] sched_param npu scheduler param
* @return 0 if no error. Otherwise a negative errno
*/
int
-HostHandler::setRequestScheduler (int req_id, npu_scheduler scheduler) {
- return device_->setRequestScheduler (req_id, scheduler);
+HostHandler::setRequestScheduler (int req_id, npu_scheduler sched,
+ npu_scheduler_param sched_param) {
+ return device_->setRequestScheduler (req_id, sched, sched_param);
}
/**
}
int
-TrinityVision2::setRequestScheduler (int req_id, npu_scheduler scheduler) {
+TrinityVision2::setRequestScheduler (int req_id, npu_scheduler sched,
+ npu_scheduler_param sched_param) {
Request *req = scheduler_->findRequest (req_id);
if (req == nullptr) {
logerr (TAG, "Unable to find the request with ID (%d)\n", req_id);
return -ENOENT;
}
- req->setScheduler (scheduler);
+ req->setScheduler (sched, sched_param);
return 0;
}
segt = prepareSegmentTable (model, &input, &output);
+ if (req->getScheduler () != NPU_SCHEDULER_VD)
+ req->setScheduler (NPU_SCHEDULER_VD, nullptr);
req->setOpmode (NPUINPUT_HW_RECURRING);
req->setInferData (segt);
return scheduler_->submitRequest (req);
int setRequestCallback (int req_id, npuOutputNotify cb, void *data);
int setRequestMode (int req_id, npu_infer_mode mode);
int setRequestConstraint (int req_id, npu_constraint constraint);
- int setRequestScheduler (int req_id, npu_scheduler scheduler);
+ int setRequestScheduler (int req_id, npu_scheduler sched,
+ npu_scheduler_param sched_param);
int submitRequest (int req_id);
int submitRequestKernel (int req_id);
void *data) = 0;
virtual int setRequestMode (int req_id, npu_infer_mode mode) = 0;
virtual int setRequestConstraint (int req_id, npu_constraint constraint) = 0;
- virtual int setRequestScheduler (int req_id, npu_scheduler scheduler) = 0;
+ virtual int setRequestScheduler (int req_id, npu_scheduler sched,
+ npu_scheduler_param param) = 0;
virtual int submitRequest (int req_id) = 0;
virtual int submitRequestKernel (int req_id) = 0;
int setRequestCallback (int req_id, npuOutputNotify cb, void *data);
int setRequestMode (int req_id, npu_infer_mode mode);
int setRequestConstraint (int req_id, npu_constraint constraint);
- int setRequestScheduler (int req_id, npu_scheduler scheduler);
+ int setRequestScheduler (int req_id, npu_scheduler sched,
+ npu_scheduler_param sched_param);
int submitRequest (int req_id);
int submitRequestKernel (int req_id);
input_config.req_id = req->getID ();
input_config.activation_offset_addr0 = buffer->getOffset ();
input_config.activation_offset_addr1 = buffer->getOffset ();
+ input_config.task_handle = UINT32_MAX;
+ input_config.subtask_idx = UINT32_MAX;
/** FIXME: update input_config fields */
- if (req->getScheduler () == NPU_SCHEDULER_SR) {
- input_config.task_handle = UINT32_MAX;
- input_config.subtask_idx = UINT32_MAX;
- } else {
- input_config.task_handle = 0;
- input_config.subtask_idx = 0;
+ if (req->getScheduler () == NPU_SCHEDULER_VD) {
+ if (req->getSchedulerParam ()) {
+ memcpy (&input_config.task_handle, req->getSchedulerParam (),
+ sizeof (uint32_t) * 2);
+ } else {
+ input_config.task_handle = 0;
+ input_config.subtask_idx = 0;
+ }
}
/** run the inference with the input */
input_config.dbuf_fd = segt->getDmabuf ();
input_config.req_id = req->getID ();
input_config.num_segments = segt->getNumTotalSegments ();
+ input_config.task_handle = UINT32_MAX;
+ input_config.subtask_idx = UINT32_MAX;
/** FIXME: update input_config fields */
- if (req->getScheduler () == NPU_SCHEDULER_SR) {
- input_config.task_handle = UINT32_MAX;
- input_config.subtask_idx = UINT32_MAX;
- } else {
- input_config.task_handle = 0;
- input_config.subtask_idx = 0;
+ if (req->getScheduler () == NPU_SCHEDULER_VD) {
+ if (req->getSchedulerParam ()) {
+ memcpy (&input_config.task_handle, req->getSchedulerParam (),
+ sizeof (uint32_t) * 2);
+ } else {
+ input_config.task_handle = 0;
+ input_config.subtask_idx = 0;
+ }
}
/** set constraints */
input_config.dbuf_fd = segt->getDmabuf ();
input_config.req_id = req->getID ();
input_config.num_segments = segt->getNumTotalSegments ();
+ input_config.task_handle = UINT32_MAX;
+ input_config.subtask_idx = UINT32_MAX;
/** FIXME: update input_config fields */
- if (req->getScheduler () == NPU_SCHEDULER_SR) {
- input_config.task_handle = UINT32_MAX;
- input_config.subtask_idx = UINT32_MAX;
- } else {
- input_config.task_handle = 0;
- input_config.subtask_idx = 0;
+ if (req->getScheduler () == NPU_SCHEDULER_VD) {
+ if (req->getSchedulerParam ()) {
+ memcpy (&input_config.task_handle, req->getSchedulerParam (),
+ sizeof (uint32_t) * 2);
+ } else {
+ input_config.task_handle = 0;
+ input_config.subtask_idx = 0;
+ }
}
/** set constraints */
cb_ (nullptr),
out_bufs_ (nullptr),
infer_mode_ (NPU_INFER_BLOCKING /* default */),
- sched_ (default_scheduler) {
+ sched_ (default_scheduler),
+ sched_param_ (nullptr) {
request_id_ = Request::global_request_id_.fetch_add (1);
}
void setInferMode (npu_infer_mode infer_mode) { infer_mode_ = infer_mode; }
npu_infer_mode getInferMode () const { return infer_mode_; }
- void setScheduler (const npu_scheduler &sched) { sched_ = sched; }
+ void setScheduler (const npu_scheduler &sched,
+ const npu_scheduler_param &sched_param) {
+ sched_ = sched;
+ sched_param_ = sched_param;
+ }
npu_scheduler getScheduler () const { return sched_; }
+ npu_scheduler_param getSchedulerParam () const { return sched_param_; }
private:
static std::atomic<int> global_request_id_;
std::string hw_dev_; /**< HW device path */
npu_infer_mode infer_mode_;
+
npu_scheduler sched_;
+ npu_scheduler_param sched_param_;
};
#endif /* NE_REQUEST_H__ */
* @brief [OPTIONAL] Set the request's scheduler
* @param[in] dev The NPU device handle
* @param[in] req_id The request ID
- * @param[in] scheduler npu scheduler
+ * @param[in] sched npu scheduler
+ * @param[in] [nullable] sched_param npu scheduler param
* @return 0 if no error. Otherwise a negative errno
* @note if this is not called, the default scheduler is used (see typedef.h).
*/
int
-setNPU_requestScheduler (npudev_h dev, int req_id, npu_scheduler scheduler) {
+setNPU_requestScheduler (npudev_h dev, int req_id, npu_scheduler sched,
+ npu_scheduler_param sched_param) {
INIT_HOST_HANDLER (host_handler, dev);
- return host_handler->setRequestScheduler (req_id, scheduler);
+ return host_handler->setRequestScheduler (req_id, sched, sched_param);
}
/**
for (int i = 0; i < MAX_ITERS; i++) {
EXPECT_EQ (createNPU_request (dev, modelid, &req_ids[i]), 0);
EXPECT_EQ (setNPU_requestConstraint (dev, req_ids[i], constraint), 0);
- EXPECT_EQ (setNPU_requestScheduler (dev, req_ids[i], NPU_SCHEDULER_VD), 0);
EXPECT_EQ (submitNPU_requestKernel (dev, req_ids[i]), 0);
}