  Shared memory programming models usually provide worksharing and task
constructs. The former relies on the efficient fork-join execution model to
exploit structured parallelism; while the latter relies on fine-grained
synchronization among tasks and a flexible data-flow execution model to exploit
dynamic, irregular, and nested parallelism. On applications that show both
structured and unstructured parallelism, both worksharing and task constructs
can be combined. However, it is difficult to mix both execution models without
penalizing the data-flow execution model. Hence, on many applications
structured parallelism is also exploited using tasks to leverage the full
benefits of a pure data-flow execution model. However, task creation and
management might introduce a non-negligible overhead that prevents the
efficient exploitation of fine-grained structured parallelism, especially on
many-core processors. In this work, we propose worksharing tasks. These are
tasks that internally leverage worksharing techniques to exploit fine-grained
structured loop-based parallelism. The evaluation shows promising results on
several benchmarks and platforms.
