:title: Users Guide: Compiling and Executing Multi-Locale Programs

Compiling and Executing Multi-Locale Programs
=============================================

Selecting a Communication Mechanism
-----------------------------------

All multi-locale Chapel programs are implemented using runtime
communication routines which transparently move data and tasks between
the locales on which the program is running.  The choice of
communication runtime is made via the ``--comm`` compiler flag (or
equivalently, the ``$CHPL_COMM`` environment variable).  Portable
options for communication include:

* ``none``: specifies that no communication should be performed,
  restricting the program's execution to a single locale.

* ``gasnet``: specifies that communication should be implemented using
  the open-source GASNet library developed at Berkeley.

* ``ofi``: specifies that communication should be implemented using
  the open-source libfabric library component of OpenFabrics Interfaces
  (OFI).   See :ref:`readme-libfabric` for more information.

When using the Chapel module on Cray XC systems, a third option is also
available:

* ``ugni``: specifies that communication should be implemented using
  Cray's uGNI interface.

In order to use any of these options, the Chapel runtime libraries
must have been built with the specified communication layer enabled.
See :ref:`readme-building` for general information on building Chapel
and :ref:`readme-multilocale` for guidance specific to building
the runtime for multi-locale execution.


Compiling for One vs. Multiple Locales
--------------------------------------

The Chapel compiler supports distinct modes for creating single-locale
versus multi-locale executables.  This mode can be selected via the
``--[no-]local`` flag, whose default setting is based on the choice of
communication mechanism above.  Specifically, when the communication
is ``none``, the compiler defaults to ``--local`` compilation.  When
it is set to anything else, the compiler defaults to ``--no-local``
compilation.  Due to this default, this flag rarely needs to be used
in practice.

Executables compiled in ``--local`` mode can only execute using a
single locale.  Executables compiled in ``--no-local`` mode can be
executed on one or more locales, but typically incur overhead when run
on a single locale as compared to those compiled in ``--local`` mode.


Executing Using Multiple Locales
--------------------------------

To specify the number of locales on which a program should run, use
the ``--numLocales`` flag (or ``-nl`` for short).

For example, the following command-line says to run the given Chapel
program on four locales::

    ./myChapelProgram -nl 4

Note that all Chapel programs begin as a single task running on locale
0.  Control over locality is explicit within Chapel, like parallelism.
In order for a program to execute using multiple locales, it must
request this either explicitly using *on-clauses* or implicitly using
abstractions that themselves use on-clauses.

.. TODO: make on-clauses above into a link once that section is written.

Programs compiled with communication mode ``none`` can only execute on
a single shared-memory locale and therefore need not specify a number
of locales since the only valid choice is 1.  If a user tries to run
the program using more than one locale, an error message will be printed.
