parallel_do |
Work | Span |
|---|---|---|
|
$O(\mathcal{W}(L) + \mathcal{W}(R))$ | $O(\max(\mathcal{S}(L), \mathcal{S}(R)))$ |
parallel_do runs two functions in parallel and returns their results as a pair.
Both functions must return a value (i.e., neither may return void).
For example, parallel_do is useful for implementing manual divide-and-conquer
algorithms. Here is an implementation of a divide-and-conquer summation for a sequence of
numbers
auto parallel_sum(const sequence auto& S) {
if (S.size() == 0) return 0;
else if (S.size() == 1) return S[0];
auto [L, R] = par::split_mid(S);
auto [Lsum, Rsum] = par::parallel_do(
[&]() { return parallel_sum(L); },
[&]() { return parallel_sum(R); }
);
return Lsum + Rsum;
}