[API] Add setNPU_requestScheduler
authorDongju Chae <dongju.chae@samsung.com>
Mon, 12 Jul 2021 07:37:17 +0000 (16:37 +0900)
committer채동주/On-Device Lab(SR)/Staff Engineer/삼성전자 <dongju.chae@samsung.com>
Mon, 12 Jul 2021 09:23:01 +0000 (18:23 +0900)
This patch adds setNPU_requestScheduler() to replace the original
setNPU_requestNpumgrParam() which is not intuitive.

Signed-off-by: Dongju Chae <dongju.chae@samsung.com>
include/common/typedef.h
include/host/libnpuhost.h
src/core/ne-handler.cc
src/core/ne-handler.h
src/core/ne-host-input-service.cc
src/core/ne-hw-input-service.cc
src/core/ne-request.cc
src/core/ne-request.h
src/host/ne-host.cc
tests/unittests/ne_libnpuhost_test.cc

index 2664038..b83b5cc 100644 (file)
@@ -192,11 +192,12 @@ typedef enum {
  *          other requests. FIFO is used among the same priority requests.
  */
 typedef enum {
-  NPU_PRIORITY_LOW =
-      0, /**< Low priority: requests could be delayed or canceled */
-  NPU_PRIORITY_MID = 1, /**< Mid priority: requests could be slightly delayed */
-  NPU_PRIORITY_HIGH =
-      2, /**< High priority: requests should be issued immediately */
+  NPU_PRIORITY_LOW = 0,
+  /**< Low priority: requests could be delayed or canceled */
+  NPU_PRIORITY_MID = 1,
+  /**< Mid priority: requests could be slightly delayed */
+  NPU_PRIORITY_HIGH = 2,
+  /**< High priority: requests should be issued immediately */
   NPU_PRIORITY_PROFILE = NPU_PRIORITY_HIGH /**< Deprecated */
 } npu_priority;
 
@@ -223,9 +224,19 @@ typedef struct {
 /* deprecated, for backward-compatibility */
 #define npuConstraint npu_constraint
 
+/**
+ * @brief Describes the supported NPU Scheduler (in kernel modules)
+ */
+typedef enum {
+  NPU_SCHEDULER_UNKNOWN = 0,
+  NPU_SCHEDULER_SR,
+  NPU_SCHEDULER_VD
+} npu_scheduler;
+
 static const uint32_t default_timeout = 3000;
 static const npu_priority default_priority = NPU_PRIORITY_MID;
 static const npu_notimode default_notimode = NPU_INTERRUPT;
+static const npu_scheduler default_scheduler = NPU_SCHEDULER_SR;
 static const uint32_t default_tops = 2;
 
 /**
@@ -412,10 +423,4 @@ typedef enum {
   NPU_LOG_END,
 } npu_loglevel;
 
-typedef struct {
-  uint32_t task_handle;
-  uint32_t subtask_idx;
-  /* TODO: Add more if needed */
-} npumgr_param;
-
 #endif /* NPU_TYPEDEF_H__ */
index 11f43e2..4b29edf 100644 (file)
@@ -551,13 +551,15 @@ int setNPU_requestConstraint (npudev_h dev, int req_id,
                               npu_constraint constraint);
 
 /**
- * @brief [OPTIONAL] Set the request's VD NPU manager parameter
+ * @brief [OPTIONAL] Set the request's scheduler
  * @param[in] dev The NPU device handle
  * @param[in] req_id The request ID
- * @param[in] param npumgr parameter
+ * @param[in] scheduler npu scheduler
  * @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_requestNpumgrParam (npudev_h dev, int req_id, npumgr_param param);
+int setNPU_requestScheduler (npudev_h dev, int req_id,
+                             npu_scheduler scheculder);
 
 /**
  * @brief Submit the request to the NPU
index dea9024..3eb1a36 100644 (file)
@@ -388,14 +388,14 @@ HostHandler::setRequestConstraint (int req_id, npu_constraint constraint) {
 }
 
 /**
- * @brief Set the request's VD NPU manager parameter
+ * @brief Set the request's scheduler
  * @param[in] req_id The request ID
- * @param[in] param npumgr parameter
+ * @param[in] scheduler npu scheduler
  * @return 0 if no error. Otherwise a negative errno
  */
 int
-HostHandler::setRequestNpumgrParam (int req_id, npumgr_param param) {
-  return device_->setRequestNpumgrParam (req_id, param);
+HostHandler::setRequestScheduler (int req_id, npu_scheduler scheduler) {
+  return device_->setRequestScheduler (req_id, scheduler);
 }
 
 /**
@@ -1327,14 +1327,14 @@ TrinityVision2::setRequestConstraint (int req_id, npu_constraint constraint) {
 }
 
 int
-TrinityVision2::setRequestNpumgrParam (int req_id, npumgr_param param) {
+TrinityVision2::setRequestScheduler (int req_id, npu_scheduler scheduler) {
   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->setNpumgrParam (param);
+  req->setScheduler (scheduler);
 
   return 0;
 }
index 7f97cb2..bf8e83f 100644 (file)
@@ -70,7 +70,7 @@ class HostHandler {
   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 setRequestNpumgrParam (int req_id, npumgr_param param);
+  int setRequestScheduler (int req_id, npu_scheduler scheduler);
 
   int submitRequest (int req_id);
   int submitRequestKernel (int req_id);
@@ -157,7 +157,7 @@ class Device {
                                   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 setRequestNpumgrParam (int req_id, npumgr_param param) = 0;
+  virtual int setRequestScheduler (int req_id, npu_scheduler scheduler) = 0;
   virtual int submitRequest (int req_id) = 0;
   virtual int submitRequestKernel (int req_id) = 0;
 
@@ -219,7 +219,7 @@ class TrinityVision2 : public Device {
   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 setRequestNpumgrParam (int req_id, npumgr_param param);
+  int setRequestScheduler (int req_id, npu_scheduler scheduler);
   int submitRequest (int req_id);
   int submitRequestKernel (int req_id);
 
index aa5706e..f15fafb 100644 (file)
@@ -97,14 +97,13 @@ invoke_buffer (const DriverAPI *api, const Request *req) {
   input_config.activation_offset_addr0 = buffer->getOffset ();
   input_config.activation_offset_addr1 = buffer->getOffset ();
 
-  /** npumgr-specific parameters */
-  const npumgr_param *param = req->getNpumgrParam ();
-  if (param != nullptr) {
-    input_config.task_handle = param->task_handle;
-    input_config.subtask_idx = param->subtask_idx;
-  } else {
+  /** 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;
   }
 
   /** run the inference with the input */
@@ -139,14 +138,13 @@ invoke_segt (const DriverAPI *api, const Request *req) {
   input_config.req_id = req->getID ();
   input_config.num_segments = segt->getNumTotalSegments ();
 
-  /** npumgr-specific parameters */
-  const npumgr_param *param = req->getNpumgrParam ();
-  if (param != nullptr) {
-    input_config.task_handle = param->task_handle;
-    input_config.subtask_idx = param->subtask_idx;
-  } else {
+  /** 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;
   }
 
   /** set constraints */
index bea01b8..2d54caa 100644 (file)
@@ -97,14 +97,13 @@ invoke_segt (const DriverAPI *api, const Request *req) {
   input_config.req_id = req->getID ();
   input_config.num_segments = segt->getNumTotalSegments ();
 
-  /** npumgr-specific parameters */
-  const npumgr_param *param = req->getNpumgrParam ();
-  if (param != nullptr) {
-    input_config.task_handle = param->task_handle;
-    input_config.subtask_idx = param->subtask_idx;
-  } else {
+  /** 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;
   }
 
   /** set constraints */
index 6f24640..45fdaa0 100644 (file)
@@ -27,15 +27,12 @@ Request::Request ()
       cb_ (nullptr),
       out_bufs_ (nullptr),
       infer_mode_ (NPU_INFER_BLOCKING /* default */),
-      npumgr_param_ (nullptr) {
+      sched_ (default_scheduler) {
   request_id_ = Request::global_request_id_.fetch_add (1);
 }
 
 /** @brief destructor of request class */
 Request::~Request () {
-  if (npumgr_param_ != nullptr)
-    delete npumgr_param_;
-
   if (data_ != nullptr)
     delete data_;
 }
index 2559aef..03e1ccc 100644 (file)
@@ -62,12 +62,8 @@ class Request {
   void setInferMode (npu_infer_mode infer_mode) { infer_mode_ = infer_mode; }
   npu_infer_mode getInferMode () const { return infer_mode_; }
 
-  void setNpumgrParam (const npumgr_param &param) {
-    if (npumgr_param_ == nullptr)
-      npumgr_param_ = new npumgr_param;
-    memcpy (npumgr_param_, &param, sizeof (npumgr_param));
-  }
-  const npumgr_param *getNpumgrParam () const { return npumgr_param_; }
+  void setScheduler (const npu_scheduler &sched) { sched_ = sched; }
+  npu_scheduler getScheduler () const { return sched_; }
 
  private:
   static std::atomic<int> global_request_id_;
@@ -87,7 +83,7 @@ class Request {
   std::string hw_dev_;       /**< HW device path */
 
   npu_infer_mode infer_mode_;
-  npumgr_param *npumgr_param_;
+  npu_scheduler sched_;
 };
 
 #endif /* NE_REQUEST_H__ */
index 6257ade..36de3d2 100644 (file)
@@ -808,17 +808,18 @@ setNPU_requestConstraint (npudev_h dev, int req_id, npu_constraint constraint) {
 }
 
 /**
- * @brief [OPTIONAL] Set the request's VD NPU manager parameter
+ * @brief [OPTIONAL] Set the request's scheduler
  * @param[in] dev The NPU device handle
  * @param[in] req_id The request ID
- * @param[in] param npumgr parameter
+ * @param[in] scheduler npu scheduler
  * @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_requestNpumgrParam (npudev_h dev, int req_id, npumgr_param param) {
+setNPU_requestScheduler (npudev_h dev, int req_id, npu_scheduler scheduler) {
   INIT_HOST_HANDLER (host_handler, dev);
 
-  return host_handler->setRequestNpumgrParam (req_id, param);
+  return host_handler->setRequestScheduler (req_id, scheduler);
 }
 
 /**
index 6b7e88d..a214b00 100644 (file)
@@ -822,13 +822,12 @@ TEST (ne_libnpuhost_test, request_decoupled_apis) {
 #define MAX_ITERS 10
 
   /* dummy param */
-  npumgr_param param = {.task_handle = 1, .subtask_idx = 0};
   int req_ids[MAX_ITERS];
 
   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_requestNpumgrParam (dev, req_ids[i], param), 0);
+    EXPECT_EQ (setNPU_requestScheduler (dev, req_ids[i], NPU_SCHEDULER_VD), 0);
     EXPECT_EQ (submitNPU_requestKernel (dev, req_ids[i]), 0);
   }