Parallel Primitives

parallel fork

parallel_do Work Span
auto parallel_do(
  auto&& L,   // a function
  auto&& R    // a function
)
$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;
}