From 998f71a8c97a14c24700877a69f35c463977c17a Mon Sep 17 00:00:00 2001 From: Megvii Engine Team Date: Fri, 8 Jan 2021 11:54:53 +0800 Subject: [PATCH] perf(mge/imperative): do not busy wait in imperative's queue GitOrigin-RevId: de8db5109679ed70e38fcecfbb99478aa9303b2b --- imperative/python/src/helper.h | 6 ++++++ imperative/src/impl/interpreter_impl.h | 6 +++++- imperative/src/impl/physical_tensor.cpp | 5 ++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/imperative/python/src/helper.h b/imperative/python/src/helper.h index 6a2fb1c93..b9f61e3d4 100644 --- a/imperative/python/src/helper.h +++ b/imperative/python/src/helper.h @@ -67,6 +67,12 @@ auto to_tuple(T begin, T end, pybind11::return_value_policy policy = pybind11::r class PyTaskDipatcher { struct Queue : mgb::AsyncQueueSC, Queue> { using Task = std::function; + + // set max_spin=0 to prevent Queue fetch task in busy wait manner. + // this won't affect throughput when python interpreter is sending enough task, + // but will significantly save CPU time when waiting for task, e.g. wait for data input + Queue() : mgb::AsyncQueueSC, Queue>(0) {} + void process_one_task(Task& f) { if (!Py_IsInitialized()) return; pybind11::gil_scoped_acquire _; diff --git a/imperative/src/impl/interpreter_impl.h b/imperative/src/impl/interpreter_impl.h index c1dd8447d..4a5e3fe9e 100644 --- a/imperative/src/impl/interpreter_impl.h +++ b/imperative/src/impl/interpreter_impl.h @@ -207,7 +207,11 @@ private: size_t m_enable_evict = 0; struct WorkQueue : AsyncQueueSC { - WorkQueue(ChannelImpl* owner) : m_owner(owner) { + // set max_spin=0 to prevent Queue fetch task in busy wait manner. + // this won't affect throughput when python interpreter is sending enough task, + // but will significantly save CPU time when waiting for task, e.g. wait for data input + WorkQueue(ChannelImpl* owner) + : AsyncQueueSC(0), m_owner(owner) { sys::set_thread_name("interpreter"); } void process_one_task(Command& cmd) { diff --git a/imperative/src/impl/physical_tensor.cpp b/imperative/src/impl/physical_tensor.cpp index 19fa9a290..b4a76626d 100644 --- a/imperative/src/impl/physical_tensor.cpp +++ b/imperative/src/impl/physical_tensor.cpp @@ -30,7 +30,10 @@ class AsyncReleaser : public CompNodeDepedentObject { AsyncReleaser* m_par_releaser; public: - Waiter(AsyncReleaser* releaser) : m_par_releaser(releaser) {} + // disable busy wait by set max_spin=0 to save CPU cycle + Waiter(AsyncReleaser* releaser) + : AsyncQueueSC(0), + m_par_releaser(releaser) {} void process_one_task(WaiterParam& param) { if (param.event->finished()) { -- GitLab