9#include <unordered_map>
20 std::queue<std::function<void()>>
q;
21 std::condition_variable
cond;
29 std::lock_guard<std::mutex> lk(
mtx);
38 std::function<void()> task;
40 std::unique_lock<std::mutex> lk(
mtx);
41 cond.wait(lk, [
this] {
return !this->q.empty() || this->stop; });
42 if (
q.empty() &&
stop) {
45 task = std::move(
q.front());
56 std::lock_guard<std::mutex> lk(
mtx);
58 throw std::runtime_error(
59 "Cannot enqueue work after stream is stopped.");
61 q.emplace(std::forward<F>(f));
83 streams_.emplace_back(streams_.size(), d);
85 threads_.push_back(
nullptr);
90 return streams_.back();
97 return default_streams_.at(d.
type);
100 return streams_.at(index);
109 std::lock_guard<std::mutex> lk(mtx);
112 completion_cv.notify_all();
117 std::lock_guard<std::mutex> lk(mtx);
120 completion_cv.notify_all();
124 return n_active_tasks_;
128 std::unique_lock<std::mutex> lk(mtx);
130 if (n_tasks_old > 1) {
131 completion_cv.wait(lk, [
this, n_tasks_old] {
138 for (
auto s : streams_) {
141 for (
auto t : threads_) {
150 std::vector<StreamThread*> threads_;
151 std::vector<Stream> streams_;
152 std::unordered_map<Device::DeviceType, Stream> default_streams_;
153 std::condition_variable completion_cv;
159 threads_[stream.
index]->enqueue(std::forward<F>(f));
Definition scheduler.h:67
void wait_for_one()
Definition scheduler.h:127
Scheduler & operator=(Scheduler &&)=delete
void enqueue(const Stream &stream, F &&f)
Definition scheduler.h:158
Stream new_stream(const Device &d)
Definition scheduler.h:82
Stream get_default_stream(const Device &d) const
Definition scheduler.h:96
Scheduler()
Definition scheduler.h:69
int n_active_tasks() const
Definition scheduler.h:123
Scheduler(const Scheduler &)=delete
~Scheduler()
Definition scheduler.h:137
void set_default_stream(const Stream &s)
Definition scheduler.h:103
Stream get_stream(int index) const
Definition scheduler.h:99
Scheduler & operator=(const Scheduler &)=delete
void notify_task_completion(const Stream &stream)
Definition scheduler.h:115
Scheduler(Scheduler &&)=delete
void notify_new_task(const Stream &stream)
Definition scheduler.h:107
Definition scheduler.h:16
void notify_task_completion(const Stream &stream)
Definition scheduler.h:177
void notify_new_task(const Stream &stream)
Definition scheduler.h:173
void wait_for_one()
Definition scheduler.h:181
int n_active_tasks()
Definition scheduler.h:169
void enqueue(const Stream &stream, F &&f)
Definition scheduler.h:165
static constexpr DeviceType gpu
Definition device.h:14
static constexpr DeviceType cpu
Definition device.h:13
DeviceType type
Definition device.h:18
Device device
Definition stream.h:11
int index
Definition stream.h:10
Definition scheduler.h:18
void thread_fn()
Definition scheduler.h:36
StreamThread()
Definition scheduler.h:25
std::thread thread
Definition scheduler.h:23
bool stop
Definition scheduler.h:22
void enqueue(F &&f)
Definition scheduler.h:54
std::condition_variable cond
Definition scheduler.h:21
std::mutex mtx
Definition scheduler.h:19
~StreamThread()
Definition scheduler.h:27
std::queue< std::function< void()> > q
Definition scheduler.h:20