From 8c34f446d8883a29ec7160a1e95157d3e4f1558b Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EC=9D=B4=ED=95=9C=EC=A2=85/On-Device=20Lab=28SR=29/Enginee?= =?utf8?q?r/=EC=82=BC=EC=84=B1=EC=A0=84=EC=9E=90?= Date: Mon, 2 Dec 2019 10:57:15 +0900 Subject: [PATCH] [neurun] Extract ThreadPool into a separate file (#9302) Extract ThreadPool into a separate file. Signed-off-by: Hanjoung Lee --- runtime/neurun/core/src/exec/ParallelScheduler.cc | 38 ------------ runtime/neurun/core/src/exec/ParallelScheduler.h | 46 +------------- runtime/neurun/core/src/exec/ThreadPool.cc | 65 ++++++++++++++++++++ runtime/neurun/core/src/exec/ThreadPool.h | 73 +++++++++++++++++++++++ 4 files changed, 139 insertions(+), 83 deletions(-) create mode 100644 runtime/neurun/core/src/exec/ThreadPool.cc create mode 100644 runtime/neurun/core/src/exec/ThreadPool.h diff --git a/runtime/neurun/core/src/exec/ParallelScheduler.cc b/runtime/neurun/core/src/exec/ParallelScheduler.cc index f9336c8..6e5a395 100644 --- a/runtime/neurun/core/src/exec/ParallelScheduler.cc +++ b/runtime/neurun/core/src/exec/ParallelScheduler.cc @@ -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 &&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()); diff --git a/runtime/neurun/core/src/exec/ParallelScheduler.h b/runtime/neurun/core/src/exec/ParallelScheduler.h index ccdb239..41e474f 100644 --- a/runtime/neurun/core/src/exec/ParallelScheduler.h +++ b/runtime/neurun/core/src/exec/ParallelScheduler.h @@ -18,61 +18,17 @@ #define __NEURUN_EXEC_PARALLEL_SCHEDULER_H__ #include -#include #include -#include -#include -#include #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 &&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 _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 index 0000000..d8c706e --- /dev/null +++ b/runtime/neurun/core/src/exec/ThreadPool.cc @@ -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 + +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 &&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 index 0000000..a1a0276 --- /dev/null +++ b/runtime/neurun/core/src/exec/ThreadPool.h @@ -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 +#include +#include + +#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 &&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 _threads; +}; + +} // namespace exec +} // namespace neurun + +#endif // __NEURUN_EXEC_THREAD_POOL_H__ -- 2.7.4