diff options
Diffstat (limited to 'openmp/offload/src/orsl-lite/include/orsl-lite.h')
-rw-r--r-- | openmp/offload/src/orsl-lite/include/orsl-lite.h | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/openmp/offload/src/orsl-lite/include/orsl-lite.h b/openmp/offload/src/orsl-lite/include/orsl-lite.h new file mode 100644 index 00000000000..f26a335119d --- /dev/null +++ b/openmp/offload/src/orsl-lite/include/orsl-lite.h @@ -0,0 +1,221 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.txt for details. +// +//===----------------------------------------------------------------------===// + + +#ifndef _ORSL_LITE_H_ +#define _ORSL_LITE_H_ + +#ifndef TARGET_WINNT +#include <sched.h> +#else +#define cpu_set_t int +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** Type of a ORSLBusySet */ +typedef enum ORSLBusySetType { + BUSY_SET_EMPTY = 0, /**< Empty set */ + BUSY_SET_PARTIAL = 1, /**< Non-empty set that omits some threads */ + BUSY_SET_FULL = 2 /**< A set that includes all threads on the card */ +} BusySetType; + +/** ORSLBusySet encapsulation */ +typedef struct ORSLBusySet { + BusySetType type; /**< Set type */ +#ifdef __linux__ + cpu_set_t cpu_set; /**< CPU mask (unused for BUSY_SET_EMPTY and + BUSY_SET_PARTIAL sets) represented by the standard + Linux CPU set type -- cpu_set_t. Threads are numbered + starting from 0. The maximal possible thread number + is system-specific. See CPU_SET(3) family of macros + for more details. Unused in ORSL Lite. */ +#endif +} ORSLBusySet; + +/** Client tag */ +typedef char* ORSLTag; + +/** Maximal length of tag in characters */ +#define ORSL_MAX_TAG_LEN 128 + +/** Maximal number of cards that can be managed by ORSL */ +#define ORSL_MAX_CARDS 32 + +/** Reserves computational resources on a set of cards. Blocks. + * + * If any of the resources cannot be reserved, this function will block until + * they become available. Reservation can be recursive if performed by the + * same tag. A recursively reserved resource must be released the same number + * of times it was reserved. + * + * @see ORSLTryReserve + * + * @param[in] n Number of cards to reserve resources on. Cannot be < 0 + * or > ORSL_MAX_CARDS. + * + * @param[in] inds Indices of the cards: an integer array with n elements. + * Cannot be NULL if n > 0. Valid card indices are from 0 + * to ORSL_MAX_CARDS-1. Cannot contain duplicate elements. + * + * @param[in] bsets Requested resources on each of the card. Cannot be NULL + * if n > 0. + * + * @param[in] tag ORSLTag of the calling client. Cannot be NULL. Length + * must not exeed ORSL_MAX_TAG_LEN. + * + * @returns 0 if the resources were successfully reserved + * + * @returns EINVAL if any of the arguments is invalid + * + * @returns EAGAIN limit of recursive reservations reached + * (not in ORSL Lite) + * + * @returns ENOSYS (in ORSL Lite) if type of any of the busy sets is + * equal to BUSY_SET_PARTIAL + */ +int ORSLReserve(const int n, const int *__restrict inds, + const ORSLBusySet *__restrict bsets, + const ORSLTag __restrict tag); + +/** Reserves computational resources on a set of cards. Does not block. + * + * If any of the resources cannot be reserved, this function will return + * immediately. Reservation can be recursive if performed by the same tag. + * A recursively reserved resource must be released the same number of times + * it was reserved. + * + * @see ORSLReserve + * + * @param[in] n Number of cards to reserve resources on. Cannot be < 0 + * or > ORSL_MAX_CARDS. + * + * @param[in] inds Indices of the cards: an integer array with n elements. + * Cannot be NULL if n > 0. Valid card indices are from 0 + * to ORSL_MAX_CARDS-1. Cannot contain duplicate elements. + * + * @param[inout] bsets Requested resources on each of the card. Cannot be + * NULL if n > 0. + * + * @param[in] tag ORSLTag of the calling client. Cannot be NULL. Length + * must not exceed ORSL_MAX_TAG_LEN. + * + * @returns 0 if the resources were successfully reserved + * + * @returns EBUSY if some of the requested resources are busy + * + * @returns EINVAL if any of the arguments is invalid + * + * @returns EAGAIN limit of recursive reservations reached + * (not in ORSL Lite) + * + * @returns ENOSYS (in ORSL Lite) if type of any of the busy sets is + * equal to BUSY_SET_PARTIAL + */ +int ORSLTryReserve(const int n, const int *__restrict inds, + const ORSLBusySet *__restrict bsets, + const ORSLTag __restrict tag); + +/** Granularify of partial reservation */ +typedef enum ORSLPartialGranularity { + GRAN_CARD = 0, /**< Card granularity */ + GRAN_THREAD = 1 /**< Thread granularity */ +} ORSLPartialGranularity; + +/** Requests reservation of some of computational resources on a set of cards. + * Does not block. Updates user-provided bsets to indicate which resources + * were reserved. + * + * If any of the resources cannot be reserved, this function will update busy + * sets provided by the caller to reflect what resources were actually + * reserved. This function supports two granularity modes: 'card' and + * 'thread'. When granularity is set to 'card', a failure to reserve a thread + * on the card will imply that reservation has failed for the whole card. When + * granularity is set to 'thread', reservation on a card will be considered + * successful as long as at least one thread on the card was successfully + * reserved. Reservation can be recursive if performed by the same tag. A + * recursively reserved resource must be released the same number of times it + * was reserved. + * + * @param[in] gran Reservation granularity + * + * @param[in] n Number of cards to reserve resources on. Cannot be < 0 + * or > ORSL_MAX_CARDS. + * + * @param[in] inds Indices of the cards: an integer array with n elements. + * Cannot be NULL if n > 0. Valid card indices are from 0 + * to ORSL_MAX_CARDS-1. Cannot contain duplicate elements. + * + * @param[in] bsets Requested resources on each of the card. Cannot be NULL + * if n > 0. + * + * @param[in] tag ORSLTag of the calling client. Cannot be NULL. Length + * must not exceed ORSL_MAX_TAG_LEN. + * + * @returns 0 if at least some of the resources were successfully + * reserved + * + * @returns EBUSY if all of the requested resources are busy + * + * @returns EINVAL if any of the arguments is invalid + * + * @returns EAGAIN limit of recursive reservations reached + * (not in ORSL Lite) + * + * @returns ENOSYS (in ORSL Lite) if type of any of the busy sets is + * equal to BUSY_SET_PARTIAL + */ +int ORSLReservePartial(const ORSLPartialGranularity gran, const int n, + const int *__restrict inds, + ORSLBusySet *__restrict bsets, + const ORSLTag __restrict tag); + +/** Releases previously reserved computational resources on a set of cards. + * + * This function will fail if any of the resources to be released were not + * reserved by the calling client. + * + * @see ORSLReserve + * @see ORSLTryReserve + * @see ORSLReservePartial + * + * @param[in] n Number of cards to reserve resources on. Cannot be < 0 + * or > ORSL_MAX_CARDS. + * + * @param[in] inds Indices of the cards: an integer array with n elements. + * Cannot be NULL if n > 0. Valid card indices are from 0 + * to ORSL_MAX_CARDS-1. Cannot contain duplicate elements. + * + * @param[in] bsets Requested resources on each of the card. Cannot be NULL + * if n > 0. + * + * @param[in] tag ORSLTag of the calling client. Cannot be NULL. Length + * must not exceed ORSL_MAX_TAG_LEN. + * + * @returns 0 if the resources were successfully released + * + * @returns EINVAL if any of the arguments is invalid + * + * @returns EPERM the calling client did not reserve some of the + * resources it is trying to release. + * + * @returns ENOSYS (in ORSL Lite) if type of any of the busy sets is + * equal to BUSY_SET_PARTIAL + */ +int ORSLRelease(const int n, const int *__restrict inds, + const ORSLBusySet *__restrict bsets, + const ORSLTag __restrict tag); + +#ifdef __cplusplus +} +#endif + +#endif |