geopm_topo(3) -- query platform component topology
====================================================

Synopsis
--------

#include `<geopm_topo.h> <https://github.com/geopm/geopm/blob/dev/libgeopmd/include/geopm_topo.h>`_

``Link with -lgeopm (MPI) or -lgeopm (non-MPI)``

.. code-block:: c

  int geopm_topo_num_domain(int domain_type);

  int geopm_topo_domain_idx(int domain_type,
                            int cpu_idx);

  int geopm_topo_num_domain_nested(int inner_domain,
                                   int outer_domain);

  int geopm_topo_domain_nested(int inner_domain,
                               int outer_domain,
                               int outer_idx,
                               size_t num_domain_nested,
                               int *domain_nested);


  int geopm_topo_domain_name(int domain_type,
                             size_t domain_name_max,
                             char *domain_name);

  int geopm_topo_domain_type(const char *domain_name);

  int geopm_topo_create_cache(void);

Domain Types
------------

The ``geopm_domain_e`` enum defines a set of values that correspond to
hardware components on the system:

``GEOPM_DOMAIN_INVALID = -1``
    Indicates an invalid domain.

``GEOPM_DOMAIN_BOARD = 0``
    All components on a user allocated compute node. There is only a
    single board per compute node, and every other domain is contained
    with the board domain.

``GEOPM_DOMAIN_PACKAGE = 1``
    A collection of all the hardware present on a single processor
    package installed on a distinct socket of a motherboard.

``GEOPM_DOMAIN_CORE = 2``
    Physical core, i.e. a group of associated hyper-threads

``GEOPM_DOMAIN_CPU = 3``
    Linux logical CPU.  In practice, there is one logical CPU per
    hyperthread visible to the operating system.

``GEOPM_DOMAIN_MEMORY = 4``
    Standard off-package DIMM (DRAM or NAND).

``GEOPM_DOMAIN_PACKAGE_INTEGRATED_MEMORY = 5``
    On-package memory (MCDRAM).

``GEOPM_DOMAIN_NIC = 6``
    Peripheral network interface controller not on the processor package.

``GEOPM_DOMAIN_PACKAGE_INTEGRATED_NIC = 7``
    Network interface controller on the processor package.

``GEOPM_DOMAIN_GPU = 8``
    Peripheral GPU card not on the processor package.

``GEOPM_DOMAIN_PACKAGE_INTEGRATED_GPU = 9``
    GPU unit on the package (e.g on-package graphics).

``GEOPM_DOMAIN_GPU_CHIP = 10``
    GPU card chips within a package on the PCI Bus (e.g Level Zero subdevices).

``GEOPM_NUM_DOMAIN = 11``
    The number of valid built-in domains.

Description
-----------

The interfaces described in this man page are the C language bindings for the
:doc:`geopm::PlatformTopo(3) <geopm::PlatformTopo.3>` C++ class.  Please
refer to the :doc:`geopm::PlatformTopo(3) <geopm::PlatformTopo.3>` man
page for a general description of the purpose, goals and use case for this
interface.

``geopm_topo_num_domain()``
  Returns the number of domains available on the system of type
  *domain_type*.  If the *domain_type* is valid, but there are no
  domains of that type on the system, the return value is zero.  If
  the domain is not a valid domain defined by the ``geopm_domain_e``
  enum then the function will return a negative error code:
  ``GEOPM_ERROR_INVALID``.

``geopm_topo_domain_idx()``
  Returns the index of the domain of type *domain_type* that is local to the
  Linux logical CPU *cpu_idx*.  The return value will be greater than or equal
  to zero and less than the value returned by ``geopm_topo_num_domain()`` for
  valid input parameters.  If *domain_type* or *cpu_idx* are out of range a
  negative error code is returned:  ``GEOPM_ERROR_INVALID``.

``geopm_topo_num_domain_nested()``
  Returns the number of domains of type *inner_domain* that are contained
  within each domain of *outer_domain* type.  The return value is one if
  *inner_domain* is equal to *outer_domain*.  If *inner_domain* is not
  contained within *outer_domain* a negative error code is returned:
  ``GEOPM_ERROR_INVALID``.  Any non-negative return value can be used to size
  the *domain_nested* array that is passed to ``geopm_topo_domain_nested()``
  with the same values for *inner_domain* and *outer_domain*.

``geopm_topo_domain_nested()``
  Fills the output array *domain_nested* with the domain indices of all of the
  *inner_domain* types nested within the specific *outer_domain* type indexed
  by *outer_idx*.  *num_domain_nested* defines the length of the
  *domain_nested* array and must match the positive return value from
  ``geopm_topo_num_domain_nested()``.  Zero is returned upon success.  A
  negative error code is returned if *inner_domain* is not within
  *outer_domain*, or if *outer_idx* is not between zero and
  ``geopm_topo_num_domain()``.

``geopm_topo_domain_name()``
  Sets the *domain_name* string to the name associated with the
  *domain_type* selected from the ``geopm_domain_e`` enum.  At most
  *result_max* bytes are written to the *domain_name* string.
  Providing a string of ``GEOPM_NAME_MAX`` length (from ``geopm_pio.h``) will be
  sufficient for storing any result.  If *result_max* is too small
  to contain the domain name an error will occur.  Zero is returned
  on success and a negative error code is returned if any error
  occurs.

``geopm_topo_domain_type()``
  Returns the domain type that is associated with the provided
  *domain_name* string.  This is the inverse function to
  ``geopm_topo_domain_name()`` and the input *domain_name* must match
  the output from ``geopm_topo_domain_name()`` for a valid domain
  type.  If the string does not match any of the valid domain names,
  then ``GEOPM_DOMAIN_INVALID`` is returned.

``geopm_topo_create_cache()``:
  Create a cache file for the :doc:`geopm::PlatformTopo(3)
  <geopm::PlatformTopo.3>` object if one does not exist.  This cache
  file will be used by any calls to the other ``geopm_topo_*()`` functions
  documented here as well as any use of the GEOPM runtime.  If a privileged
  user is making this call (i.e. root or via sudo), the file path will be
  ``/run/geopm/geopm-topo-cache``. If a non-privileged user makes this call
  file path will be ``/tmp/geopm-topo-cache-<UID>``. In either case, the
  permissions will be ``-rw-------``, i.e. 600.  If the file exists from the
  current boot cycle and has the proper permissions no operation will be
  performed.  To force the creation of a new cache file, `unlink(3)
  <https://man7.org/linux/man-pages/man3/unlink.3p.html>`_ the existing cache
  file prior to calling this function.

Return Value
------------

If an error occurs in any call to an interface documented here, the
return value of the function will be a negative integer
corresponding to one of the error codes documented in
:doc:`geopm_error(3) <geopm_error.3>`.

See Also
--------

:doc:`geopm(7) <geopm.7>`\ ,
:doc:`geopm_pio(3) <geopm_pio.3>`\ ,
:doc:`geopm_error(3) <geopm_error.3>`\ ,
:doc:`geopm::PlatformTopo(3) <geopm::PlatformTopo.3>`\ ,
:doc:`geopm::PlatformIO(3) <geopm::PlatformIO.3>`\ ,
`unlink(3) <https://man7.org/linux/man-pages/man3/unlink.3p.html>`_