| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- /*
- * Copyright © 2020-2021 Inria. All rights reserved.
- * See COPYING in top-level directory.
- */
- /** \file
- * \brief Kinds of CPU cores.
- */
- #ifndef HWLOC_CPUKINDS_H
- #define HWLOC_CPUKINDS_H
- #include "hwloc.h"
- #ifdef __cplusplus
- extern "C" {
- #elif 0
- }
- #endif
- /** \defgroup hwlocality_cpukinds Kinds of CPU cores
- *
- * Platforms with heterogeneous CPUs may have some cores with
- * different features or frequencies.
- * This API exposes identical PUs in sets called CPU kinds.
- * Each PU of the topology may only be in a single kind.
- *
- * The number of kinds may be obtained with hwloc_cpukinds_get_nr().
- * If the platform is homogeneous, there may be a single kind
- * with all PUs.
- * If the platform or operating system does not expose any
- * information about CPU cores, there may be no kind at all.
- *
- * The index of the kind that describes a given CPU set
- * (if any, and not partially)
- * may be obtained with hwloc_cpukinds_get_by_cpuset().
- *
- * From the index of a kind, it is possible to retrieve information
- * with hwloc_cpukinds_get_info():
- * an abstracted efficiency value,
- * and an array of info attributes
- * (for instance the "CoreType" and "FrequencyMaxMHz",
- * see \ref topoattrs_cpukinds).
- *
- * A higher efficiency value means greater intrinsic performance
- * (and possibly less performance/power efficiency).
- * Kinds with lower efficiency values are ranked first:
- * Passing 0 as \p kind_index to hwloc_cpukinds_get_info() will
- * return information about the CPU kind with lower performance
- * but higher energy-efficiency.
- * Higher \p kind_index values would rather return information
- * about power-hungry high-performance cores.
- *
- * When available, efficiency values are gathered from the operating system.
- * If so, \p cpukind_efficiency is set in the struct hwloc_topology_discovery_support array.
- * This is currently available on Windows 10, Mac OS X (Darwin),
- * and on some Linux platforms where core "capacity" is exposed in sysfs.
- *
- * If the operating system does not expose core efficiencies natively,
- * hwloc tries to compute efficiencies by comparing CPU kinds using
- * frequencies (on ARM), or core types and frequencies (on other architectures).
- * The environment variable HWLOC_CPUKINDS_RANKING may be used
- * to change this heuristics, see \ref envvar.
- *
- * If hwloc fails to rank any kind, for instance because the operating
- * system does not expose efficiencies and core frequencies,
- * all kinds will have an unknown efficiency (\c -1),
- * and they are not indexed/ordered in any specific way.
- *
- * @{
- */
- /** \brief Get the number of different kinds of CPU cores in the topology.
- *
- * \p flags must be \c 0 for now.
- *
- * \return The number of CPU kinds (positive integer) on success.
- * \return \c 0 if no information about kinds was found.
- * \return \c -1 with \p errno set to \c EINVAL if \p flags is invalid.
- */
- HWLOC_DECLSPEC int
- hwloc_cpukinds_get_nr(hwloc_topology_t topology,
- unsigned long flags);
- /** \brief Get the index of the CPU kind that contains CPUs listed in \p cpuset.
- *
- * \p flags must be \c 0 for now.
- *
- * \return The index of the CPU kind (positive integer or 0) on success.
- * \return \c -1 with \p errno set to \c EXDEV if \p cpuset is
- * only partially included in the some kind.
- * \return \c -1 with \p errno set to \c ENOENT if \p cpuset is
- * not included in any kind, even partially.
- * \return \c -1 with \p errno set to \c EINVAL if parameters are invalid.
- */
- HWLOC_DECLSPEC int
- hwloc_cpukinds_get_by_cpuset(hwloc_topology_t topology,
- hwloc_const_bitmap_t cpuset,
- unsigned long flags);
- /** \brief Get the CPU set and infos about a CPU kind in the topology.
- *
- * \p kind_index identifies one kind of CPU between 0 and the number
- * of kinds returned by hwloc_cpukinds_get_nr() minus 1.
- *
- * If not \c NULL, the bitmap \p cpuset will be filled with
- * the set of PUs of this kind.
- *
- * The integer pointed by \p efficiency, if not \c NULL will, be filled
- * with the ranking of this kind of CPU in term of efficiency (see above).
- * It ranges from \c 0 to the number of kinds
- * (as reported by hwloc_cpukinds_get_nr()) minus 1.
- *
- * Kinds with lower efficiency are reported first.
- *
- * If there is a single kind in the topology, its efficiency \c 0.
- * If the efficiency of some kinds of cores is unknown,
- * the efficiency of all kinds is set to \c -1,
- * and kinds are reported in no specific order.
- *
- * The array of info attributes (for instance the "CoreType",
- * "FrequencyMaxMHz" or "FrequencyBaseMHz", see \ref topoattrs_cpukinds)
- * and its length are returned in \p infos or \p nr_infos.
- * The array belongs to the topology, it should not be freed or modified.
- *
- * If \p nr_infos or \p infos is \c NULL, no info is returned.
- *
- * \p flags must be \c 0 for now.
- *
- * \return \c 0 on success.
- * \return \c -1 with \p errno set to \c ENOENT if \p kind_index does not match any CPU kind.
- * \return \c -1 with \p errno set to \c EINVAL if parameters are invalid.
- */
- HWLOC_DECLSPEC int
- hwloc_cpukinds_get_info(hwloc_topology_t topology,
- unsigned kind_index,
- hwloc_bitmap_t cpuset,
- int *efficiency,
- unsigned *nr_infos, struct hwloc_info_s **infos,
- unsigned long flags);
- /** \brief Register a kind of CPU in the topology.
- *
- * Mark the PUs listed in \p cpuset as being of the same kind
- * with respect to the given attributes.
- *
- * \p forced_efficiency should be \c -1 if unknown.
- * Otherwise it is an abstracted efficiency value to enforce
- * the ranking of all kinds if all of them have valid (and
- * different) efficiencies.
- *
- * The array \p infos of size \p nr_infos may be used to provide
- * info names and values describing this kind of PUs.
- *
- * \p flags must be \c 0 for now.
- *
- * Parameters \p cpuset and \p infos will be duplicated internally,
- * the caller is responsible for freeing them.
- *
- * If \p cpuset overlaps with some existing kinds, those might get
- * modified or split. For instance if existing kind A contains
- * PUs 0 and 1, and one registers another kind for PU 1 and 2,
- * there will be 3 resulting kinds:
- * existing kind A is restricted to only PU 0;
- * new kind B contains only PU 1 and combines information from A
- * and from the newly-registered kind;
- * new kind C contains only PU 2 and only gets information from
- * the newly-registered kind.
- *
- * \note The efficiency \p forced_efficiency provided to this function
- * may be different from the one reported later by hwloc_cpukinds_get_info()
- * because hwloc will scale efficiency values down to
- * between 0 and the number of kinds minus 1.
- *
- * \return \c 0 on success.
- * \return \c -1 with \p errno set to \c EINVAL if some parameters are invalid,
- * for instance if \p cpuset is \c NULL or empty.
- */
- HWLOC_DECLSPEC int
- hwloc_cpukinds_register(hwloc_topology_t topology,
- hwloc_bitmap_t cpuset,
- int forced_efficiency,
- unsigned nr_infos, struct hwloc_info_s *infos,
- unsigned long flags);
- /** @} */
- #ifdef __cplusplus
- } /* extern "C" */
- #endif
- #endif /* HWLOC_CPUKINDS_H */
|