{section:border=true}
{column:width=70%}
h2. Routines for Nesting Support in OpenMP 3.0
New environment variables:
* OMP_MAX_ACTIVE_LEVELS
* OMP_THREAD_LIMIT
The above environment variables are described in Sections 4.7 and 4.8 of the OpenMP specification.
New runtime routines:
* omp_get_thread_limit
* omp_set_max_active_levels
* omp_get_max_active_levels
* omp_get_level
* omp_get_ancestor_thread_num
* omp_get_team_size
* omp_get_active_level
The above environment variables are described in Section 3.2 of the OpenMP specification
*Example (Fortran):*
{noformat}
program test
use omp_lib
call omp_set_dynamic (.false.)
call omp_set_nested (.true.)
call omp_set_num_threads (4)
call omp_set_max_active_levels (3)
!$omp parallel private (levels)
!$omp single
levels = omp_get_max_active_levels()
print *, "Par #1: Max active levels =", levels,
& "In parallel =", omp_in_parallel()
!$omp end single
!$omp parallel private (levels)
!$omp master
levels = omp_get_max_active_levels()
print *, "Par #2: Max active levels =", levels,
& "In parallel =", omp_in_parallel()
call omp_set_max_active_levels (1)
print *, "Par #2: Max active levels =", levels,
& "In parallel =", omp_in_parallel()
!$omp end master
!$omp parallel private (levels)
!$omp single
levels = omp_get_max_active_levels()
print *, "Par #3: Max active levels =", levels,
& "In parallel =", omp_in_parallel()
!$omp end single
!$omp end parallel
!$omp end parallel
!$omp end parallel
end
% f90 -xopenmp -xO3 test.f
% a.out
Par #1: Max active levels = 3 In parallel = T
Par #2: Max active levels = 3 In parallel = T
Par #2: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #2: Max active levels = 3 In parallel = T
Par #2: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #2: Max active levels = 3 In parallel = T
Par #2: Max active levels = 3 In parallel = T
Par #2: Max active levels = 3 In parallel = T
Par #2: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
{noformat}
*Example (C/C++):*
{noformat}
#include "omp.h"
#include <stdio.h>
int main()
{
omp_set_dynamic(0);
omp_set_nested(1);
#pragma omp parallel num_threads(2)
{
if (omp_get_thread_num() == 0) {
#pragma omp parallel num_threads(2)
{
if (omp_get_thread_num() == 1) {
printf ("Y: omp_get_level() = %d\n",
omp_get_level());
printf ("Y: omp_get_active_level() = %d\n",
omp_get_active_level());
printf ("Y: omp_get_ancestor_thread_num(1) = %d\n",
omp_get_ancestor_thread_num(1));
printf ("Y: omp_get_ancestor_thread_num(2) = %d\n",
omp_get_ancestor_thread_num(2));
}
}
}
}
}
% cc -xopenmp -xO3 test.c
% a.out
Y: omp_get_level() = 2
Y: omp_get_active_level() = 2
Y: omp_get_ancestor_thread_num(1) = 0
Y: omp_get_ancestor_thread_num(2) = 1
{noformat}
{column}
{column:width=30%}
{panel:title=OpenMP 3.0 Features in Express 7.08}
{children:page=Sun Studio OpenMP}
{panel}
{column}
{section}
{column:width=70%}
h2. Routines for Nesting Support in OpenMP 3.0
New environment variables:
* OMP_MAX_ACTIVE_LEVELS
* OMP_THREAD_LIMIT
The above environment variables are described in Sections 4.7 and 4.8 of the OpenMP specification.
New runtime routines:
* omp_get_thread_limit
* omp_set_max_active_levels
* omp_get_max_active_levels
* omp_get_level
* omp_get_ancestor_thread_num
* omp_get_team_size
* omp_get_active_level
The above environment variables are described in Section 3.2 of the OpenMP specification
*Example (Fortran):*
{noformat}
program test
use omp_lib
call omp_set_dynamic (.false.)
call omp_set_nested (.true.)
call omp_set_num_threads (4)
call omp_set_max_active_levels (3)
!$omp parallel private (levels)
!$omp single
levels = omp_get_max_active_levels()
print *, "Par #1: Max active levels =", levels,
& "In parallel =", omp_in_parallel()
!$omp end single
!$omp parallel private (levels)
!$omp master
levels = omp_get_max_active_levels()
print *, "Par #2: Max active levels =", levels,
& "In parallel =", omp_in_parallel()
call omp_set_max_active_levels (1)
print *, "Par #2: Max active levels =", levels,
& "In parallel =", omp_in_parallel()
!$omp end master
!$omp parallel private (levels)
!$omp single
levels = omp_get_max_active_levels()
print *, "Par #3: Max active levels =", levels,
& "In parallel =", omp_in_parallel()
!$omp end single
!$omp end parallel
!$omp end parallel
!$omp end parallel
end
% f90 -xopenmp -xO3 test.f
% a.out
Par #1: Max active levels = 3 In parallel = T
Par #2: Max active levels = 3 In parallel = T
Par #2: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #2: Max active levels = 3 In parallel = T
Par #2: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #2: Max active levels = 3 In parallel = T
Par #2: Max active levels = 3 In parallel = T
Par #2: Max active levels = 3 In parallel = T
Par #2: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
Par #3: Max active levels = 3 In parallel = T
{noformat}
*Example (C/C++):*
{noformat}
#include "omp.h"
#include <stdio.h>
int main()
{
omp_set_dynamic(0);
omp_set_nested(1);
#pragma omp parallel num_threads(2)
{
if (omp_get_thread_num() == 0) {
#pragma omp parallel num_threads(2)
{
if (omp_get_thread_num() == 1) {
printf ("Y: omp_get_level() = %d\n",
omp_get_level());
printf ("Y: omp_get_active_level() = %d\n",
omp_get_active_level());
printf ("Y: omp_get_ancestor_thread_num(1) = %d\n",
omp_get_ancestor_thread_num(1));
printf ("Y: omp_get_ancestor_thread_num(2) = %d\n",
omp_get_ancestor_thread_num(2));
}
}
}
}
}
% cc -xopenmp -xO3 test.c
% a.out
Y: omp_get_level() = 2
Y: omp_get_active_level() = 2
Y: omp_get_ancestor_thread_num(1) = 0
Y: omp_get_ancestor_thread_num(2) = 1
{noformat}
{column}
{column:width=30%}
{panel:title=OpenMP 3.0 Features in Express 7.08}
{children:page=Sun Studio OpenMP}
{panel}
{column}
{section}