mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-12-18 15:00:26 +00:00
rogueviz::flocking:: multithread support
This commit is contained in:
parent
3e5fe01597
commit
514fee2176
@ -16,6 +16,30 @@
|
|||||||
|
|
||||||
// press 'o' when flocking active to change the parameters.
|
// press 'o' when flocking active to change the parameters.
|
||||||
|
|
||||||
|
#ifndef NO_THREADS
|
||||||
|
#include <thread>
|
||||||
|
int threads = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
template<class T> auto parallelize(long long N, T action) -> decltype(action(0,0)) {
|
||||||
|
#ifdef NO_THREADS
|
||||||
|
return action(0,N);
|
||||||
|
#else
|
||||||
|
if(threads == 1) return action(0,N);
|
||||||
|
std::vector<std::thread> v;
|
||||||
|
typedef decltype(action(0,0)) Res;
|
||||||
|
std::vector<Res> results(threads);
|
||||||
|
for(int k=0; k<threads; k++)
|
||||||
|
v.emplace_back([&,k] () {
|
||||||
|
results[k] = action(N*k/threads, N*(k+1)/threads);
|
||||||
|
});
|
||||||
|
for(std::thread& t:v) t.join();
|
||||||
|
Res res = 0;
|
||||||
|
for(Res r: results) res += r;
|
||||||
|
return res;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
namespace rogueviz {
|
namespace rogueviz {
|
||||||
|
|
||||||
namespace flocking {
|
namespace flocking {
|
||||||
@ -121,7 +145,7 @@ namespace flocking {
|
|||||||
|
|
||||||
lines.clear();
|
lines.clear();
|
||||||
|
|
||||||
for(int i=0; i<N; i++) {
|
parallelize(N, [&monsat, &d, &vels, &pats] (int a, int b) { for(int i=a; i<b; i++) {
|
||||||
vertexdata& vd = vdata[i];
|
vertexdata& vd = vdata[i];
|
||||||
auto m = vd.m;
|
auto m = vd.m;
|
||||||
|
|
||||||
@ -142,7 +166,8 @@ namespace flocking {
|
|||||||
int coh_count = 0;
|
int coh_count = 0;
|
||||||
|
|
||||||
for(auto& p: relmatrices[m->base]) {
|
for(auto& p: relmatrices[m->base]) {
|
||||||
for(auto m2: monsat[p.first]) if(m != m2) {
|
auto f = monsat.find(p.first);
|
||||||
|
if(f != monsat.end()) for(auto m2: f->second) if(m != m2) {
|
||||||
ld vel2 = m2->vel;
|
ld vel2 = m2->vel;
|
||||||
transmatrix at2 = I * p.second * m2->at;
|
transmatrix at2 = I * p.second * m2->at;
|
||||||
|
|
||||||
@ -203,7 +228,8 @@ namespace flocking {
|
|||||||
|
|
||||||
pats[i] = m->at * alphaspin * xpush(vels[i] * d);
|
pats[i] = m->at * alphaspin * xpush(vels[i] * d);
|
||||||
fixmatrix(pats[i]);
|
fixmatrix(pats[i]);
|
||||||
}
|
} return 0; });
|
||||||
|
|
||||||
for(int i=0; i<N; i++) {
|
for(int i=0; i<N; i++) {
|
||||||
vertexdata& vd = vdata[i];
|
vertexdata& vd = vdata[i];
|
||||||
auto m = vd.m;
|
auto m = vd.m;
|
||||||
@ -280,6 +306,11 @@ namespace flocking {
|
|||||||
else if(argis("-flockfollow")) {
|
else if(argis("-flockfollow")) {
|
||||||
shift(); follow = argi();
|
shift(); follow = argi();
|
||||||
}
|
}
|
||||||
|
#ifndef NO_THREADS
|
||||||
|
else if(argis("-threads")) {
|
||||||
|
shift(); threads = argi();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
else return 1;
|
else return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user