[neurun] Introduce Job for DataflowExecutor (#4492)
author이한종/On-Device Lab(SR)/Engineer/삼성전자 <hanjoung.lee@samsung.com>
Tue, 26 Feb 2019 07:48:54 +0000 (16:48 +0900)
committer이춘석/On-Device Lab(SR)/Staff Engineer/삼성전자 <chunseok.lee@samsung.com>
Tue, 26 Feb 2019 07:48:54 +0000 (16:48 +0900)
Introduce Job class that is used by DataflowExecutor. This class is for
notified-run-notify mechanism.

- Once all waiting nodes are notified, this node can be executed
- Schedule this node and run
- After execution notify its outputs to awaiting nodes

Signed-off-by: Hanjoung Lee <hanjoung.lee@samsung.com>
runtimes/neurun/src/exec/Job.cc [new file with mode: 0644]
runtimes/neurun/src/exec/Job.h [new file with mode: 0644]

diff --git a/runtimes/neurun/src/exec/Job.cc b/runtimes/neurun/src/exec/Job.cc
new file mode 100644 (file)
index 0000000..3fabafa
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Job.h"
+
+#include "util/logging.h"
+
+namespace neurun
+{
+namespace exec
+{
+
+Job::Job(const model::operation::Index &index, IFunction *fn,
+         const model::operand::IndexSet &inputs, const model::operand::IndexSet &outputs)
+    : _index{index}, _fn{fn}, _outputs{outputs}
+{
+  for (auto input : inputs)
+  {
+    _blocking_inputs.insert(input);
+  }
+}
+
+void Job::onNotified(const model::operand::Index &operand)
+{
+  std::string s;
+  for (auto e : _blocking_inputs)
+  {
+    s += std::to_string(e.value());
+    s += " ";
+  }
+  VERBOSE(Job) << "Job #" << _index.value() << " notified operand : " << operand.value()
+               << " / blocking inputs { " << s << "}" << std::endl;
+
+  auto itr = _blocking_inputs.find(operand);
+  if (itr != _blocking_inputs.end())
+  {
+    _blocking_inputs.erase(itr);
+  }
+}
+
+void Job::onNotified(const model::operand::IndexSet &operands)
+{
+  for (auto operand : operands)
+  {
+    onNotified(operand);
+  }
+}
+
+void Job::run() { _fn->run(); }
+
+} // namespace exec
+} // namespace neurun
diff --git a/runtimes/neurun/src/exec/Job.h b/runtimes/neurun/src/exec/Job.h
new file mode 100644 (file)
index 0000000..e3964e2
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __NEURUN_EXEC_JOB_H__
+#define __NEURUN_EXEC_JOB_H__
+
+#include <unordered_set>
+
+#include "interface/IFunction.h"
+#include "model/operation/Index.h"
+#include "model/operand/IndexSet.h"
+
+namespace neurun
+{
+namespace exec
+{
+
+class Job
+{
+public:
+  /**
+   * @brief Constructs a Job object
+   *
+   * @param index Operation index for this job
+   * @param fn compiled code to run this job
+   * @param inputs Input operand list
+   * @param outputs Output operand list
+   */
+  Job(const model::operation::Index &index, IFunction *fn, const model::operand::IndexSet &inputs,
+      const model::operand::IndexSet &outputs);
+  /**
+   * @brief Remove the given operand from blocking input list
+   *
+   * @param operand Operand to be notified
+   */
+  void onNotified(const model::operand::Index &operand);
+  /**
+   * @brief Remove the given operands from blocking input list
+   *
+   * @param operands Operands to be notified
+   */
+  void onNotified(const model::operand::IndexSet &operands);
+  /**
+   * @brief Execute the compiled code
+   */
+  void run();
+  /**
+   * @brief Check if this job is ready for execution
+   *
+   * @return @true if there is no blockin inputs
+   */
+  bool ready() const { return _blocking_inputs.empty(); }
+  /**
+   * @brief Return operation index
+   *
+   * @return Operation index
+   */
+  model::operation::Index index() const { return _index; }
+  /**
+   * @brief Return output indices
+   *
+   * @return Output indices
+   */
+  const model::operand::IndexSet &outputs() const { return _outputs; }
+
+private:
+  model::operation::Index _index;
+  IFunction *_fn;
+  std::unordered_set<model::operand::Index> _blocking_inputs;
+  const model::operand::IndexSet _outputs;
+};
+
+} // namespace exec
+} // namespace neurun
+
+#endif // __NEURUN_EXEC_JOB_H__