OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
workers.h
Go to the documentation of this file.
1#pragma once
2
3#include <thread>
4#include <mutex>
5#include <vector>
6#include <functional>
7#include <atomic>
8#include <algorithm>
9#include <condition_variable>
10#include <new>
11
12class Workers final {
13 public:
14 Workers();
15 ~Workers();
16
17 static void setThreadName(const char* threadName);
18
19 template<class T,class F>
20 static void parallelFor(T* b, T* e, const F& func) {
21 inst().runParallelFor(b,std::distance(b,e),func);
22 }
23
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);
27 }
28
29 template<class T,class F>
30 static void parallelTasks(std::vector<T>& data, const F& func) {
31 inst().runParallelFor(data.data(),data.size(),func);
32 }
33
34 template<class F>
35 static void parallelTasks(size_t taskCount, const F& func) {
36 inst().runParallelTasks<F>(taskCount,func);
37 }
38
39 static uint8_t maxThreads();
40
41 private:
42 enum { MAX_THREADS=16 };
43
44 void threadFunc(size_t id);
45 void execWork(uint32_t& minWorkSize);
46 uint32_t taskLoop();
47 static Workers& inst();
48
49 template<class T,class F>
50 static uint32_t& minWorkSize() {
51 static uint32_t data = 0;
52 return data;
53 }
54
55
56 template<class T,class F>
57 void runParallelFor(T* data, size_t sz, const F& func) {
58 workSet = reinterpret_cast<uint8_t*>(data);
59 workSize = sz;
60 workEltSize = sizeof(T);
61
62 workFunc = [&func](void* data, size_t sz) {
63 T* tdata = reinterpret_cast<T*>(data);
64 for(size_t i=0;i<sz;++i)
65 func(tdata[i]);
66 };
67
68 execWork(minWorkSize<T,F>());
69 }
70
71 template<class F>
72 void runParallelTasks(size_t taskCount, const F& func) {
73 workSet = nullptr;
74 workSize = taskCount;
75 workEltSize = 1;
76
77 workFunc = [&func](void* data, size_t sz) {
78 func(reinterpret_cast<uintptr_t>(data));
79 };
80 execWork(minWorkSize<void,F>());
81 }
82
83 static const size_t taskPerThread;
84 static const size_t taskPerStep;
85 bool running=true;
86
87 std::thread th[MAX_THREADS];
88
89 std::mutex sync;
90 std::condition_variable workWait;
91 int32_t workTbd = 0;
92
93 uint8_t* workSet=nullptr;
94 size_t workSize=0, workEltSize=0;
95 std::function<void(void*,size_t)> workFunc;
96
97 std::atomic_int progressIt{0};
98 uint32_t taskCount = 0;
99 std::atomic_int taskDone{0};
100 };
static void parallelFor(T *b, T *e, const F &func)
Definition workers.h:20
static void parallelFor(std::vector< T > &data, const F &func)
Definition workers.h:25
~Workers()
Definition workers.cpp:84
Workers()
Definition workers.cpp:74
static uint8_t maxThreads()
Definition workers.cpp:98
static void parallelTasks(size_t taskCount, const F &func)
Definition workers.h:35
static void setThreadName(const char *threadName)
Definition workers.cpp:66
static void parallelTasks(std::vector< T > &data, const F &func)
Definition workers.h:30