Skip to content

Commit

Permalink
[Support] Avoid using main thread for llvm::parallelFor().
Browse files Browse the repository at this point in the history
The llvm::parallelFor() uses threads created by ThreadPoolExecutor as well as main thread.
The index for the main thread matches with the index for the first thread created by ThreadPoolExecutor.
It results in that getThreadIndex returns the same value for different threads.
To avoid thread index clashing - do not use main thread for llvm::parallelFor():

parallel::TaskGroup TG;
for (; Begin + TaskSize < End; Begin += TaskSize) {
  TG.spawn([=, &Fn] {
    for (size_t I = Begin, E = Begin + TaskSize; I != E; ++I)
      Fn(I);
  });
}
for (; Begin != End; ++Begin)    <<<< executed by main thread.
  Fn(Begin);                     <<<<
return;                          <<<<

Differential Revision: https://reviews.llvm.org/D142317

(cherry picked from commit 10a796a)
  • Loading branch information
avl-llvm authored and tstellar committed Jan 28, 2023
1 parent 5cc5d71 commit 0764636
Showing 1 changed file with 6 additions and 2 deletions.
8 changes: 6 additions & 2 deletions llvm/lib/Support/Parallel.cpp
Expand Up @@ -214,8 +214,12 @@ void llvm::parallelFor(size_t Begin, size_t End,
Fn(I);
});
}
for (; Begin != End; ++Begin)
Fn(Begin);
if (Begin != End) {
TG.spawn([=, &Fn] {
for (size_t I = Begin; I != End; ++I)
Fn(I);
});
}
return;
}
#endif
Expand Down

0 comments on commit 0764636

Please sign in to comment.