5.1. What is the difference between OpenMP and OmpSs?

5.1.1. Initial team and creation

You must compile with --ompss flag to enable the OmpSs programming model. While both programming models are pretty similar in many aspects there are some key differences.

In OpenMP your program starts with a team of one thread. You can create a new team of threads using #pragma omp parallel (or a combined parallel worksharing like #pragma omp parallel for or #pragma omp parallel sections).

In OmpSs your program starts with a team of threads but only one runs the main (or PROGRAM in Fortran). The remaining threads are waiting for work. You create work using #pragma omp task or #pragma omp for. One of the threads (including the one that was running main) will pick the created work and execute it.

This is the reason why #pragma omp parallel is ignored by the compiler in OmpSs mode. Combined worksharings like #pragma omp parallel for and #pragma omp parallel sections will be handled as if they were #pragma omp for and #pragma omp sections, respectively.

Mercurium compiler will emit a warning when it encounters a #pragma omp parallel that will be ignored.

5.1.2. Worksharings

In OpenMP mode, our worksharing implementation for #pragma omp for (and #pragma omp parallel for) uses the typical strategy of:


In OmpSs mode, the implementation of #pragma omp for exploits a Nanos++ feature called slicers. Basically the compiler creates a task which will create internally several more tasks, each one implementing some part of the iteration space of the parallel loop.

These two implementations are mostly equivalent except for the following case:

int main(int argc, char** argv)
    int i;
#pragma omp parallel
        int x = 0;
#pragma omp for
        for (i = 0; i < 100; i++)

    return 0;

In OmpSs, since #pragma omp parallel is ignored, there will not be an x variable per thread (like it would happen in OpenMP) but just an x shared among all the threads running the #pragma omp for.