summaryrefslogtreecommitdiffstats
path: root/openmp/offload/src/orsl-lite/include/orsl-lite.h
diff options
context:
space:
mode:
Diffstat (limited to 'openmp/offload/src/orsl-lite/include/orsl-lite.h')
-rw-r--r--openmp/offload/src/orsl-lite/include/orsl-lite.h221
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
OpenPOWER on IntegriCloud