  Task-based programming models like OmpSs-2 and OpenMP provide a flexible
data-flow execution model to exploit dynamic, irregular and nested parallelism.
Providing an efficient implementation that scales well with small granularity
tasks remains a challenge, and bottlenecks can manifest in several runtime
components. In this paper, we analyze the limiting factors in the scalability
of a task-based runtime system and propose individual solutions for each of the
challenges, including a wait-free dependency system and a novel scalable
scheduler design based on delegation. We evaluate how the optimizations impact
the overall performance of the runtime, both individually and in combination.
We also compare the resulting runtime against state of the art OpenMP
implementations, showing equivalent or better performance, especially for
fine-grained tasks.
