14#ifndef PDLP_SCHEDULER_H_
15#define PDLP_SCHEDULER_H_
18#ifndef EIGEN_USE_CUSTOM_THREAD_POOL
19#define EIGEN_USE_CUSTOM_THREAD_POOL
25#include "absl/functional/any_invocable.h"
26#include "absl/synchronization/blocking_counter.h"
28#include "ortools/pdlp/solvers.pb.h"
29#include "unsupported/Eigen/CXX11/ThreadPool"
42 absl::AnyInvocable<
void(
int)> do_func) = 0;
51 threadpool_->StartWorkers();
54 std::string
info_string()
const override {
return "google_threadpool"; };
57 absl::AnyInvocable<
void(
int)> do_func)
override {
58 absl::BlockingCounter counter(end - start);
59 for (
int i = start; i < end; ++i) {
60 threadpool_->Schedule([&, i]() {
62 counter.DecrementCount();
69 const int num_threads_;
70 std::unique_ptr<ThreadPool> threadpool_ =
nullptr;
80 std::string
info_string()
const override {
return "eigen_threadpool"; };
83 absl::AnyInvocable<
void(
int)> do_func)
override {
84 Eigen::Barrier eigen_barrier(end - start);
85 for (
int i = start; i < end; ++i) {
86 eigen_threadpool_->Schedule([&, i]() {
88 eigen_barrier.Notify();
95 const int num_threads_;
96 std::unique_ptr<Eigen::ThreadPool> eigen_threadpool_ =
nullptr;
100std::unique_ptr<Scheduler>
MakeScheduler(SchedulerType type,
int num_threads);
std::string info_string() const override
int num_threads() const override
void ParallelFor(int start, int end, absl::AnyInvocable< void(int)> do_func) override
Calls do_func(i) in parallel for i from start to end-1.
EigenThreadPoolScheduler(int num_threads)
GoogleThreadPoolScheduler(int num_threads)
void ParallelFor(int start, int end, absl::AnyInvocable< void(int)> do_func) override
Calls do_func(i) in parallel for i from start to end-1.
std::string info_string() const override
int num_threads() const override
Thread scheduling interface.
virtual ~Scheduler()=default
virtual int num_threads() const =0
virtual std::string info_string() const =0
virtual void ParallelFor(int start, int end, absl::AnyInvocable< void(int)> do_func)=0
Calls do_func(i) in parallel for i from start to end-1.
Validation utilities for solvers.proto.
std::unique_ptr< Scheduler > MakeScheduler(SchedulerType type, int num_threads)
Convenience factory function.