#include "FluidSim/Fluid.hpp" #include #include #include #include using namespace fluidsim::port; int main() { for (auto size : {std::pair{6, 10}, std::pair{64, 256}}) { const int steps = 1000; for (int workers : {1, 2, 4}) { std::vector p; for (int i = 0; i < size.first; i++) p.emplace_back(.001f, 2, size.second); auto advance = [&](int worker) { for (int k = worker; k < size.first; k += workers) { auto &a = p[k]; auto l = a.state(0), r = a.state(size.second - 1); l.velocity = -l.velocity; r.velocity = -r.velocity; a.left_ghost = l; a.right_ghost = r; a.advance(.0000005f); } }; std::barrier sync(workers + 1); std::vector pool; if (workers > 1) for (int k = 0; k < workers; k++) pool.emplace_back([&, k] { for (int i = 0; i < steps; i++) { sync.arrive_and_wait(); advance(k); sync.arrive_and_wait(); } }); auto start = std::chrono::steady_clock::now(); for (int i = 0; i < steps; i++) { if (workers == 1) advance(0); else { sync.arrive_and_wait(); sync.arrive_and_wait(); } } double sec = std::chrono::duration(std::chrono::steady_clock::now() - start).count(); pool.clear(); double sum = 0; for (auto &q : p) sum += q.state(0).pressure; std::cout << "pipes=" << size.first << " cells/pipe=" << size.second << " workers=" << workers << " steps=" << steps << " seconds=" << sec << " checksum=" << sum << '\n'; } } }