[Support/Parallel] Add a special case for 0/1 items to llvm::parallel_for_each.
authorChris Lattner <clattner@nondot.org>
Sat, 1 May 2021 21:07:17 +0000 (14:07 -0700)
committerChris Lattner <clattner@nondot.org>
Mon, 3 May 2021 17:08:00 +0000 (10:08 -0700)
commit5fa9d4163421304255d12498fd672e79893422a4
tree531d9dd427e7ba3163aa2098793bc17d134105ae
parent31751ce1b9239d7aacac84864bf06c36ce888408
[Support/Parallel] Add a special case for 0/1 items to llvm::parallel_for_each.

This avoids the non-trivial overhead of creating a TaskGroup in these degenerate
cases, but also exposes parallelism.  It turns out that the default executor
underlying TaskGroup prevents recursive parallelism - so an instance of a task
group being alive will make nested ones become serial.

This is a big issue in MLIR in some dialects, if they have a single instance of
an outer op (e.g. a firrtl.circuit) that has many parallel ops within it (e.g.
a firrtl.module).  This patch side-steps the problem by avoiding creating the
TaskGroup in the unneeded case.  See this issue for more details:
https://github.com/llvm/circt/issues/993

Note that this isn't a really great solution for the general case of nested
parallelism.  A redesign of the TaskGroup stuff would be better, but would be
a much more invasive change.

Differential Revision: https://reviews.llvm.org/D101699
llvm/include/llvm/Support/Parallel.h