.. _omp111:

Replaced globalized variable with X bytes of shared memory. [OMP111]
====================================================================

This optimization occurs when a globalized variable's data is shared between
multiple threads, but requires a constant amount of memory that can be
determined at compile time. This is the case when only a single thread creates
the memory and is then shared between every thread. The memory can then be
pushed to a static buffer of shared memory on the device. This optimization
allows users to declare shared memory on the device without using OpenMP's
custom allocators.

Globalization occurs when a pointer to a thread-local variable escapes the
current scope. If a single thread is known to be responsible for creating and
sharing the data it can instead be mapped directly to the device's shared
memory. Checking if only a single thread can execute an instruction requires
that the parent functions have internal linkage. Otherwise, an external caller
could invalidate this analysis but having multiple threads call that function.
The optimization pass will make internal copies of each function to use for this
reason, but it is still recommended to mark them as internal using keywords like
``static`` whenever possible.

Example
-------

This optimization should apply to any variable declared in an OpenMP target
region that is then shared with every thread in a parallel region. This allows
the user to declare shared memory without using custom allocators. A simple
stencil calculation shows how this can be used.

.. code-block:: c++

  void stencil(int M, int N, double *X, double *Y) {
  #pragma omp target teams distribute collapse(2) \
    map(to : X [0:M * N]) map(tofrom : Y [0:M * N])
    for (int i0 = 0; i0 < M; i0 += MC) {
      for (int j0 = 0; j0 < N; j0 += NC) {
        double sX[MC][NC];
  
  #pragma omp parallel for collapse(2) shared(sX) default(firstprivate)
        for (int i1 = 0; i1 < MC; ++i1)
          for (int j1 = 0; j1 < NC; ++j1)
            sX[i1][j1] = X[(i0 + i1) * N + (j0 + j1)];
  
  #pragma omp parallel for collapse(2) shared(sX) default(firstprivate)
        for (int i1 = 1; i1 < MC - 1; ++i1)
          for (int j1 = 1; j1 < NC - 1; ++j1)
            Y[(i0 + i1) * N + j0 * j1] = (sX[i1 + 1][j1] + sX[i1 - 1][j1] +
                                          sX[i1][j1 + 1] + sX[i1][j1 - 1] +
                                          -4.0 * sX[i1][j1]) / (dX * dX);
      }   
    }
  }

.. code-block:: console


  $ clang++ -fopenmp -fopenmp-targets=nvptx64 -O1 -Rpass=openmp-opt -fopenmp-version=51 omp111.cpp 
  omp111.cpp:10:14: remark: Replaced globalized variable with 8192 bytes of shared memory. [OMP111]
      double sX[MC][NC];
             ^

The default mapping for variables captured in an OpenMP parallel region is
``shared``. This means taking a pointer to the object which will ultimately
result in globalization that will be mapped to shared memory when it could have
been placed in registers. To avoid this, make sure each variable that can be
copied into the region is marked ``firstprivate`` either explicitly or using the
OpenMP 5.1 feature ``default(firstprivate)``.

Diagnostic Scope
----------------

OpenMP target offloading optimization remark.
