  Task graphs have been studied for decades as a foundation for scheduling
irregular parallel applications and incorporated in programming models such as
OpenMP. While many high-performance parallel libraries are based on task
graphs, they also have additional scheduling requirements, such as
synchronization from inner levels of data parallelism and internal blocking
communications. In this paper, we extend task-graph scheduling to support
efficient synchronization and communication within tasks. Our scheduler avoids
deadlock and oversubscription of worker threads, and refines victim selection
to increase the overlap of sibling tasks. To the best of our knowledge, our
approach is the first to combine gang-scheduling and work-stealing in a single
runtime. Our approach has been evaluated on the SLATE highperformance linear
algebra library. Relative to the LLVM OMP runtime, our runtime demonstrates
performance improvements of up to 13.82%, 15.2%, and 36.94% for LU, QR, and
Cholesky, respectively, evaluated across different configurations.
