[neurun] Extract ThreadPool into a separate file (#9302)
author이한종/On-Device Lab(SR)/Engineer/삼성전자 <hanjoung.lee@samsung.com>
Mon, 2 Dec 2019 01:57:15 +0000 (10:57 +0900)
committer오형석/On-Device Lab(SR)/Staff Engineer/삼성전자 <hseok82.oh@samsung.com>
Mon, 2 Dec 2019 01:57:15 +0000 (10:57 +0900)
Extract ThreadPool into a separate file.

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

index f9336c8..6e5a395 100644 (file)
@@ -26,44 +26,6 @@ namespace neurun
 namespace exec
 {
 
-ThreadPool::ThreadPool(uint32_t num_threads)
-{
-  assert(num_threads >= 1);
-
-  for (uint32_t i = 0; i < num_threads; i++)
-  {
-    _threads.emplace_back(std::ref(_worker));
-  }
-}
-
-ThreadPool::~ThreadPool()
-{
-  if (!_threads.empty())
-  {
-    _worker.terminate();
-    join();
-  }
-}
-
-void ThreadPool::enqueue(std::unique_ptr<IFunction> &&fn) { _worker.enqueue(std::move(fn)); }
-
-uint32_t ThreadPool::numJobsInQueue() { return _worker.numJobsInQueue(); }
-
-void ThreadPool::join()
-{
-  for (auto &thread : _threads)
-  {
-    thread.join();
-  }
-  _threads.clear();
-}
-
-void ThreadPool::finish()
-{
-  _worker.finish();
-  join();
-}
-
 ParallelScheduler::ParallelScheduler(const graph::BackendSet &backends)
 {
   assert(!backends.empty());
index ccdb239..41e474f 100644 (file)
 #define __NEURUN_EXEC_PARALLEL_SCHEDULER_H__
 
 #include <unordered_map>
-#include <thread>
 #include <memory>
-#include <queue>
-#include <vector>
-#include <unordered_set>
 
 #include "exec/IFunction.h"
 #include "graph/BackendSet.h"
-#include "WorkQueue.h"
+#include "ThreadPool.h"
 
 namespace neurun
 {
 namespace exec
 {
 
-// TODO Extract this class to a separate file
-class ThreadPool
-{
-public:
-  /**
-   * @brief Coustruct ThreadPool object
-   *
-   * @param num_threads Number of threads
-   */
-  ThreadPool(uint32_t num_threads = 1);
-  /**
-   * @brief Destroy ThreadPool object
-   */
-  ~ThreadPool();
-  /**
-   * @brief Enqueue a function
-   *
-   * @param fn A function to be queued
-   */
-  void enqueue(std::unique_ptr<IFunction> &&fn);
-  /**
-   * @brief Get number of jobs in worker's queue
-   *
-   * @return Number of jobs
-   */
-  uint32_t numJobsInQueue();
-
-  /**
-   * @brief Block until all jobs are finished
-   */
-  void finish();
-
-private:
-  void join();
-
-private:
-  WorkQueue _worker;
-  std::vector<std::thread> _threads;
-};
-
 class ParallelScheduler
 {
 public:
diff --git a/runtime/neurun/core/src/exec/ThreadPool.cc b/runtime/neurun/core/src/exec/ThreadPool.cc
new file mode 100644 (file)
index 0000000..d8c706e
--- /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 "ThreadPool.h"
+
+#include <cassert>
+
+namespace neurun
+{
+namespace exec
+{
+
+ThreadPool::ThreadPool(uint32_t num_threads)
+{
+  assert(num_threads >= 1);
+
+  for (uint32_t i = 0; i < num_threads; i++)
+  {
+    _threads.emplace_back(std::ref(_worker));
+  }
+}
+
+ThreadPool::~ThreadPool()
+{
+  if (!_threads.empty())
+  {
+    _worker.terminate();
+    join();
+  }
+}
+
+void ThreadPool::enqueue(std::unique_ptr<IFunction> &&fn) { _worker.enqueue(std::move(fn)); }
+
+uint32_t ThreadPool::numJobsInQueue() { return _worker.numJobsInQueue(); }
+
+void ThreadPool::join()
+{
+  for (auto &thread : _threads)
+  {
+    thread.join();
+  }
+  _threads.clear();
+}
+
+void ThreadPool::finish()
+{
+  _worker.finish();
+  join();
+}
+
+} // namespace exec
+} // namespace neurun
diff --git a/runtime/neurun/core/src/exec/ThreadPool.h b/runtime/neurun/core/src/exec/ThreadPool.h
new file mode 100644 (file)
index 0000000..a1a0276
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * 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_THREAD_POOL_H__
+#define __NEURUN_EXEC_THREAD_POOL_H__
+
+#include <thread>
+#include <memory>
+#include <vector>
+
+#include "WorkQueue.h"
+
+namespace neurun
+{
+namespace exec
+{
+
+class ThreadPool
+{
+public:
+  /**
+   * @brief Coustruct ThreadPool object
+   *
+   * @param num_threads Number of threads
+   */
+  ThreadPool(uint32_t num_threads = 1);
+  /**
+   * @brief Destroy ThreadPool object
+   */
+  ~ThreadPool();
+  /**
+   * @brief Enqueue a function
+   *
+   * @param fn A function to be queued
+   */
+  void enqueue(std::unique_ptr<IFunction> &&fn);
+  /**
+   * @brief Get number of jobs in worker's queue
+   *
+   * @return Number of jobs
+   */
+  uint32_t numJobsInQueue();
+
+  /**
+   * @brief Block until all jobs are finished
+   */
+  void finish();
+
+private:
+  void join();
+
+private:
+  WorkQueue _worker;
+  std::vector<std::thread> _threads;
+};
+
+} // namespace exec
+} // namespace neurun
+
+#endif // __NEURUN_EXEC_THREAD_POOL_H__