OpenMP: parallel regions and loop parallelism

Loop parallelism

Overview
OpenMP for: template
1
2
3
4
5
6
7
8
9
#pragma omp parallel
{
  int threadnum = omp_get_thread_num(),
    numthreads = omp_get_num_threads();
  int low = N*threadnum/numthreads,
    high = N*(threadnum+1)/numthreads;
  for (int i=low; i<high; i++)
    // do something with i
}
1
2
3
4
5
#pragma omp parallel
#pragma omp for
for (int i=0; i<N; i++) {
  // do something with i
}
OpenMP for: visualization

~~~c #pragma omp parallel { code1() #pragma omp for for (int i=0; i<N; i++) { code2() } code3() }

Execution flow
Limitation

Loop Schedule

Overview
1
#pragma omp for schedule(...)

The schedules can be setup in a more fine-grained manner

Static
pragma for

c linenums="1" --8<-- "docs/csc466/lectures/data/openmp/for.c"

1
2
gcc -o for for.c -fopenmp
./for 20 4
pragma for, schedule static, chunk size 2

c linenums="1" --8<-- "docs/csc466/lectures/data/openmp/for_static.c"

1
2
gcc -o for_static for_static.c -fopenmp
./for 20 4
Questions
Dynamic
pragma for, schedule static, workload simulation by sleep

c linenums="1" --8<-- "docs/csc466/lectures/data/openmp/for_static_rand.c"

1
2
gcc -o for_static_rand for_static_rand.c -fopenmp
./for 20 4
pragma for, schedule dynamic, workload simulation by sleep

c linenums="1" --8<-- "docs/csc466/lectures/data/openmp/for_dynamic_rand.c"

1
2
gcc -o for_dynamic_rand for_dynamic_rand.c -fopenmp
./for 20 4
32 portions, 4 threads
128 portions, 4 threads
Guided

Nested Loops

Collapsing nested loops
Nested loops without collapse

c linenums="1" --8<-- "docs/csc466/lectures/data/openmp/nested_loops.c"

1
2
gcc -o nested_loop nested_loop.c -fopenmp
./for 2 4
Nested loops with collapse

c linenums="1" --8<-- "docs/csc466/lectures/data/openmp/nested_loops_collapse.c"

1
2
gcc -o nested_loops_collapse nested_loops_collapse.c -fopenmp
./for 2 4
Requirements for collapsing
Hands-on: Collapsing a nested loop
Solution

c linenums="1" --8<-- "docs/csc466/lectures/data/openmp/collapse_3.c"

Hands-on:

Sum series implementation example

c linenums="1" --8<-- "docs/csc466/lectures/data/openmp/sum_series_openmp_for.c"

Improving sum series implementation

c linenums="1" --8<-- "docs/csc466/lectures/data/openmp/sum_series_openmp_for_2.c"

Trapezoids