//===----------------------------------------------------------------------===// // // 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 #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