19 template<
class T,
class F>
21 inst().runParallelFor(b,std::distance(b,e),func);
24 template<
class T,
class F>
25 static void parallelFor(std::vector<T>& data,
const F& func) {
26 inst().runParallelFor(data.data(),data.size(),func);
29 template<
class T,
class F>
31 inst().runParallelFor(data.data(),data.size(),func);
36 inst().runParallelTasks<F>(taskCount,func);
42 enum { MAX_THREADS=16 };
44 void threadFunc(
size_t id);
45 void execWork(uint32_t& minWorkSize);
49 template<
class T,
class F>
50 static uint32_t& minWorkSize() {
51 static uint32_t data = 0;
56 template<
class T,
class F>
57 void runParallelFor(T* data,
size_t sz,
const F& func) {
58 workSet =
reinterpret_cast<uint8_t*
>(data);
60 workEltSize =
sizeof(T);
62 workFunc = [&func](
void* data,
size_t sz) {
63 T* tdata =
reinterpret_cast<T*
>(data);
64 for(
size_t i=0;i<sz;++i)
68 execWork(minWorkSize<T,F>());
72 void runParallelTasks(
size_t taskCount,
const F& func) {
77 workFunc = [&func](
void* data,
size_t sz) {
78 func(
reinterpret_cast<uintptr_t
>(data));
80 execWork(minWorkSize<void,F>());
83 static const size_t taskPerThread;
84 static const size_t taskPerStep;
87 std::thread th[MAX_THREADS];
90 std::condition_variable workWait;
93 uint8_t* workSet=
nullptr;
94 size_t workSize=0, workEltSize=0;
95 std::function<void(
void*,
size_t)> workFunc;
97 std::atomic_int progressIt{0};
98 uint32_t taskCount = 0;
99 std::atomic_int taskDone{0};