In the spirit of TRegions [0], this patch provides a simpler and uniform interface for a kernel to set up the device runtime. The OMPIRBuilder is used for reuse in Flang. A custom state machine will be generated in the follow up patch. The "surplus" threads of the "master warp" will not exit early anymore so we need to use non-aligned barriers. The new runtime will not have an extra warp but also require these non-aligned barriers. [0] https://link.springer.com/chapter/10.1007/978-3-030-28596-8_11 This was in parts extracted from D59319. Reviewed By: ABataev, JonChesterfield Differential Revision: https://reviews.llvm.org/D101976
95 lines
3.1 KiB
C
95 lines
3.1 KiB
C
//===-- target.h ---------- OpenMP device runtime target implementation ---===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Target region interfaces are simple interfaces designed to allow middle-end
|
|
// (=LLVM) passes to analyze and transform the code. To achieve good performance
|
|
// it may be required to run the associated passes. However, implementations of
|
|
// this interface shall always provide a correct implementation as close to the
|
|
// user expected code as possible.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_OPENMP_LIBOMPTARGET_DEVICERTLS_COMMON_TARGET_H
|
|
#define LLVM_OPENMP_LIBOMPTARGET_DEVICERTLS_COMMON_TARGET_H
|
|
|
|
#include <stdint.h>
|
|
|
|
extern "C" {
|
|
|
|
/// Forward declaration of the source location identifier "ident".
|
|
typedef struct ident ident_t;
|
|
|
|
/// The target region _kernel_ interface for GPUs
|
|
///
|
|
/// This deliberatly simple interface provides the middle-end (=LLVM) with
|
|
/// easier means to reason about the semantic of the code and transform it as
|
|
/// well. The runtime calls are therefore also desiged to carry sufficient
|
|
/// information necessary for optimizations.
|
|
///
|
|
///
|
|
/// Intended usage:
|
|
///
|
|
/// \code
|
|
/// void kernel(...) {
|
|
/// ThreadKind = __kmpc_target_init(Ident, /* IsSPMD */ false,
|
|
/// /* UseGenericStateMachine */ true,
|
|
/// /* RequiresFullRuntime */ ... );
|
|
/// if (ThreadKind == -1) {
|
|
/// // User defined kernel code.
|
|
/// }
|
|
/// __kmpc_target_deinit(...);
|
|
/// }
|
|
/// \endcode
|
|
///
|
|
/// Which can be transformed to:
|
|
///
|
|
/// \code
|
|
/// void kernel(...) {
|
|
/// ThreadKind = __kmpc_target_init(Ident, /* IsSPMD */ false,
|
|
/// /* UseGenericStateMachine */ false,
|
|
/// /* RequiresFullRuntime */ ... );
|
|
/// if (ThreadKind == -1) {
|
|
/// // User defined kernel code.
|
|
/// } else {
|
|
/// assume(ThreadKind == ThreadId);
|
|
/// // Custom, kernel-specific state machine code.
|
|
/// }
|
|
/// __kmpc_target_deinit(...);
|
|
/// }
|
|
/// \endcode
|
|
///
|
|
///
|
|
///{
|
|
|
|
/// Initialization
|
|
///
|
|
/// Must be called by all threads.
|
|
///
|
|
/// \param Ident Source location identification, can be NULL.
|
|
///
|
|
int32_t __kmpc_target_init(ident_t *Ident, bool IsSPMD,
|
|
bool UseGenericStateMachine,
|
|
bool RequiresFullRuntime);
|
|
|
|
/// De-Initialization
|
|
///
|
|
/// Must be called by the main thread in generic mode, can be called by all
|
|
/// threads. Must be called by all threads in SPMD mode.
|
|
///
|
|
/// In non-SPMD, this function releases the workers trapped in a state machine
|
|
/// and also any memory dynamically allocated by the runtime.
|
|
///
|
|
/// \param Ident Source location identification, can be NULL.
|
|
///
|
|
void __kmpc_target_deinit(ident_t *Ident, bool IsSPMD,
|
|
bool RequiresFullRuntime);
|
|
|
|
///}
|
|
}
|
|
#endif
|