From cd45f9d45b9221bd4b56a69c5cee95de0ef6c659 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 16 Apr 2020 16:18:50 +0200 Subject: [PATCH] WIP, parallel --- slsDetectorSoftware/src/DetectorImpl.h | 128 ++++++++++++------------- 1 file changed, 60 insertions(+), 68 deletions(-) diff --git a/slsDetectorSoftware/src/DetectorImpl.h b/slsDetectorSoftware/src/DetectorImpl.h index 531ccbd98..345ca537a 100755 --- a/slsDetectorSoftware/src/DetectorImpl.h +++ b/slsDetectorSoftware/src/DetectorImpl.h @@ -209,25 +209,24 @@ class DetectorImpl : public virtual slsDetectorDefs { dPositions.resize(receivers.size()); std::iota(begin(dPositions), end(dPositions), 0); } + if (rxPositions.empty() || + (rxPositions.size() == 1 && rxPositions[0] == -1)) { + rxPositions.resize(receivers[0].size()); + std::iota(begin(rxPositions), end(rxPositions), 0); + } std::vector> futures; - futures.reserve(dPositions.size());// cannot know rxPositions.size() without looping + futures.reserve(dPositions.size() * rxPositions.size()); for (size_t i : dPositions) { if (i >= receivers.size()) throw sls::RuntimeError("Detector out of range"); // each entry - std::vector rxPos(rxPositions); - if (rxPositions.empty() || - (rxPositions.size() == 1 && rxPositions[0] == -1)) { - rxPos.resize(receivers[i].size()); - std::iota(begin(rxPos), end(rxPos), 0); - } - for (size_t j : rxPos) { + for (size_t j : rxPositions) { futures.push_back(std::async(std::launch::async, somefunc, receivers[i][j].get(), Args...)); } } sls::Result result; - result.reserve(dPositions.size());// cannot know rxPositions.size() without looping + result.reserve(dPositions.size() * rxPositions.size()); for (auto &i : futures) { result.push_back(i.get()); } @@ -247,25 +246,24 @@ class DetectorImpl : public virtual slsDetectorDefs { dPositions.resize(receivers.size()); std::iota(begin(dPositions), end(dPositions), 0); } + if (rxPositions.empty() || + (rxPositions.size() == 1 && rxPositions[0] == -1)) { + rxPositions.resize(receivers[0].size()); + std::iota(begin(rxPositions), end(rxPositions), 0); + } std::vector> futures; - futures.reserve(dPositions.size());// cannot know rxPositions.size() without looping + futures.reserve(dPositions.size() * rxPositions.size()); for (size_t i : dPositions) { if (i >= receivers.size()) throw sls::RuntimeError("Detector out of range"); // each entry - std::vector rxPos(rxPositions); - if (rxPositions.empty() || - (rxPositions.size() == 1 && rxPositions[0] == -1)) { - rxPos.resize(receivers[i].size()); - std::iota(begin(rxPos), end(rxPos), 0); - } - for (size_t j : rxPos) { + for (size_t j : rxPositions) { futures.push_back(std::async(std::launch::async, somefunc, receivers[i][j].get(), Args...)); } } sls::Result result; - result.reserve(dPositions.size());// cannot know rxPositions.size() without looping + result.reserve(dPositions.size() * rxPositions.size()); for (auto &i : futures) { result.push_back(i.get()); } @@ -285,19 +283,18 @@ class DetectorImpl : public virtual slsDetectorDefs { dPositions.resize(receivers.size()); std::iota(begin(dPositions), end(dPositions), 0); } + if (rxPositions.empty() || + (rxPositions.size() == 1 && rxPositions[0] == -1)) { + rxPositions.resize(receivers[0].size()); + std::iota(begin(rxPositions), end(rxPositions), 0); + } std::vector> futures; - futures.reserve(dPositions.size());// cannot know rxPositions.size() without looping + futures.reserve(dPositions.size() * rxPositions.size()); for (size_t i : dPositions) { if (i >= receivers.size()) throw sls::RuntimeError("Detector out of range"); // each entry - std::vector rxPos(rxPositions); - if (rxPositions.empty() || - (rxPositions.size() == 1 && rxPositions[0] == -1)) { - rxPos.resize(receivers[i].size()); - std::iota(begin(rxPos), end(rxPos), 0); - } - for (size_t j : rxPos) { + for (size_t j : rxPositions) { futures.push_back(std::async(std::launch::async, somefunc, receivers[i][j].get(), Args...)); } @@ -320,19 +317,18 @@ class DetectorImpl : public virtual slsDetectorDefs { dPositions.resize(receivers.size()); std::iota(begin(dPositions), end(dPositions), 0); } + if (rxPositions.empty() || + (rxPositions.size() == 1 && rxPositions[0] == -1)) { + rxPositions.resize(receivers[0].size()); + std::iota(begin(rxPositions), end(rxPositions), 0); + } std::vector> futures; - futures.reserve(dPositions.size());// cannot know rxPositions.size() without looping + futures.reserve(dPositions.size() * rxPositions.size()); for (size_t i : dPositions) { if (i >= receivers.size()) throw sls::RuntimeError("Detector out of range"); // each entry - std::vector rxPos(rxPositions); - if (rxPositions.empty() || - (rxPositions.size() == 1 && rxPositions[0] == -1)) { - rxPos.resize(receivers[i].size()); - std::iota(begin(rxPos), end(rxPos), 0); - } - for (size_t j : rxPos) { + for (size_t j : rxPositions) { futures.push_back(std::async(std::launch::async, somefunc, receivers[i][j].get(), Args...)); } @@ -367,25 +363,24 @@ class DetectorImpl : public virtual slsDetectorDefs { dPositions.resize(receivers2.size()); std::iota(begin(dPositions), end(dPositions), 0); } + if (rxPositions.empty() || + (rxPositions.size() == 1 && rxPositions[0] == -1)) { + rxPositions.resize(receivers2[0].size()); + std::iota(begin(rxPositions), end(rxPositions), 0); + } std::vector> futures; - futures.reserve(dPositions.size());// cannot know rxPositions.size() without looping + futures.reserve(dPositions.size() * rxPositions.size()); for (size_t i : dPositions) { if (i >= receivers2.size()) throw sls::RuntimeError("Detector out of range"); // each entry - std::vector rxPos(rxPositions); - if (rxPositions.empty() || - (rxPositions.size() == 1 && rxPositions[0] == -1)) { - rxPos.resize(receivers2[i].size()); - std::iota(begin(rxPos), end(rxPos), 0); - } - for (size_t j : rxPos) { + for (size_t j : rxPositions) { futures.push_back(std::async(std::launch::async, somefunc, receivers2[i][j].get(), Args...)); } } sls::Result result; - result.reserve(dPositions.size());// cannot know rxPositions.size() without looping + result.reserve(dPositions.size() * rxPositions.size()); for (auto &i : futures) { result.push_back(i.get()); } @@ -405,25 +400,24 @@ class DetectorImpl : public virtual slsDetectorDefs { dPositions.resize(receivers2.size()); std::iota(begin(dPositions), end(dPositions), 0); } + if (rxPositions.empty() || + (rxPositions.size() == 1 && rxPositions[0] == -1)) { + rxPositions.resize(receivers2[0].size()); + std::iota(begin(rxPositions), end(rxPositions), 0); + } std::vector> futures; - futures.reserve(dPositions.size());// cannot know rxPositions.size() without looping + futures.reserve(dPositions.size() * rxPositions.size()); for (size_t i : dPositions) { if (i >= receivers2.size()) throw sls::RuntimeError("Detector out of range"); // each entry - std::vector rxPos(rxPositions); - if (rxPositions.empty() || - (rxPositions.size() == 1 && rxPositions[0] == -1)) { - rxPos.resize(receivers2[i].size()); - std::iota(begin(rxPos), end(rxPos), 0); - } - for (size_t j : rxPos) { + for (size_t j : rxPositions) { futures.push_back(std::async(std::launch::async, somefunc, receivers2[i][j].get(), Args...)); } } sls::Result result; - result.reserve(dPositions.size());// cannot know rxPositions.size() without looping + result.reserve(dPositions.size() * rxPositions.size()); for (auto &i : futures) { result.push_back(i.get()); } @@ -443,19 +437,18 @@ class DetectorImpl : public virtual slsDetectorDefs { dPositions.resize(receivers2.size()); std::iota(begin(dPositions), end(dPositions), 0); } + if (rxPositions.empty() || + (rxPositions.size() == 1 && rxPositions[0] == -1)) { + rxPositions.resize(receivers2[0].size()); + std::iota(begin(rxPositions), end(rxPositions), 0); + } std::vector> futures; - futures.reserve(dPositions.size());// cannot know rxPositions.size() without looping + futures.reserve(dPositions.size() * rxPositions.size()); for (size_t i : dPositions) { if (i >= receivers2.size()) throw sls::RuntimeError("Detector out of range"); // each entry - std::vector rxPos(rxPositions); - if (rxPositions.empty() || - (rxPositions.size() == 1 && rxPositions[0] == -1)) { - rxPos.resize(receivers2[i].size()); - std::iota(begin(rxPos), end(rxPos), 0); - } - for (size_t j : rxPos) { + for (size_t j : rxPositions) { futures.push_back(std::async(std::launch::async, somefunc, receivers2[i][j].get(), Args...)); } @@ -478,19 +471,18 @@ class DetectorImpl : public virtual slsDetectorDefs { dPositions.resize(receivers2.size()); std::iota(begin(dPositions), end(dPositions), 0); } + if (rxPositions.empty() || + (rxPositions.size() == 1 && rxPositions[0] == -1)) { + rxPositions.resize(receivers2[0].size()); + std::iota(begin(rxPositions), end(rxPositions), 0); + } std::vector> futures; - futures.reserve(dPositions.size());// cannot know rxPositions.size() without looping + futures.reserve(dPositions.size() * rxPositions.size()); for (size_t i : dPositions) { if (i >= receivers2.size()) throw sls::RuntimeError("Detector out of range"); // each entry - std::vector rxPos(rxPositions); - if (rxPositions.empty() || - (rxPositions.size() == 1 && rxPositions[0] == -1)) { - rxPos.resize(receivers2[i].size()); - std::iota(begin(rxPos), end(rxPos), 0); - } - for (size_t j : rxPos) { + for (size_t j : rxPositions) { futures.push_back(std::async(std::launch::async, somefunc, receivers2[i][j].get(), Args...)); }