\pagebreak \section{Internal Control Variables (ICVs)} \label{sec:icv} According to Section 2.3 of the OpenMP 4.0 specification, an OpenMP implementation must act as if there are ICVs that control the behavior of the program. This example illustrates two ICVs, \plc{nthreads-var} and \plc{max-active-levels-var}. The \plc{nthreads-var} ICV controls the number of threads requested for encountered parallel regions; there is one copy of this ICV per task. The \plc{max-active-levels-var} ICV controls the maximum number of nested active parallel regions; there is one copy of this ICV for the whole program. In the following example, the \plc{nest-var}, \plc{max-active-levels-var}, \plc{dyn-var}, and \plc{nthreads-var} ICVs are modified through calls to the runtime library routines \code{omp\_set\_nested},\\ \code{omp\_set\_max\_active\_levels},\code{ omp\_set\_dynamic}, and \code{omp\_set\_num\_threads} respectively. These ICVs affect the operation of \code{parallel} regions. Each implicit task generated by a \code{parallel} region has its own copy of the \plc{nest-var, dyn-var}, and \plc{nthreads-var} ICVs. In the following example, the new value of \plc{nthreads-var} applies only to the implicit tasks that execute the call to \code{omp\_set\_num\_threads}. There is one copy of the \plc{max-active-levels-var} ICV for the whole program and its value is the same for all tasks. This example assumes that nested parallelism is supported. The outer \code{parallel} region creates a team of two threads; each of the threads will execute one of the two implicit tasks generated by the outer \code{parallel} region. Each implicit task generated by the outer \code{parallel} region calls \code{omp\_set\_num\_threads(3)}, assigning the value 3 to its respective copy of \plc{nthreads-var}. Then each implicit task encounters an inner \code{parallel} region that creates a team of three threads; each of the threads will execute one of the three implicit tasks generated by that inner \code{parallel} region. Since the outer \code{parallel} region is executed by 2 threads, and the inner by 3, there will be a total of 6 implicit tasks generated by the two inner \code{parallel} regions. Each implicit task generated by an inner \code{parallel} region will execute the call to\\ \code{omp\_set\_num\_threads(4)}, assigning the value 4 to its respective copy of \plc{nthreads-var}. The print statement in the outer \code{parallel} region is executed by only one of the threads in the team. So it will be executed only once. The print statement in an inner \code{parallel} region is also executed by only one of the threads in the team. Since we have a total of two inner \code{parallel} regions, the print statement will be executed twice -- once per inner \code{parallel} region. \pagebreak \cexample{icv}{1} \fexample{icv}{1}