//===--------- support.h - OpenMP GPU support functions ---------- CUDA -*-===// // // 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 // //===----------------------------------------------------------------------===// // // Wrapper to some functions natively supported by the GPU. // //===----------------------------------------------------------------------===// #ifndef OMPTARGET_SUPPORT_H #define OMPTARGET_SUPPORT_H #include "interface.h" #include "target_impl.h" //////////////////////////////////////////////////////////////////////////////// // Execution Parameters //////////////////////////////////////////////////////////////////////////////// enum ExecutionMode { Spmd = 0x00u, Generic = 0x01u, ModeMask = 0x01u, }; enum RuntimeMode { RuntimeInitialized = 0x00u, RuntimeUninitialized = 0x02u, RuntimeMask = 0x02u, }; DEVICE void setExecutionParameters(ExecutionMode EMode, RuntimeMode RMode); DEVICE bool isGenericMode(); DEVICE bool isSPMDMode(); DEVICE bool isRuntimeUninitialized(); DEVICE bool isRuntimeInitialized(); //////////////////////////////////////////////////////////////////////////////// // Execution Modes based on location parameter fields //////////////////////////////////////////////////////////////////////////////// DEVICE bool checkSPMDMode(kmp_Ident *loc); DEVICE bool checkGenericMode(kmp_Ident *loc); DEVICE bool checkRuntimeUninitialized(kmp_Ident *loc); DEVICE bool checkRuntimeInitialized(kmp_Ident *loc); //////////////////////////////////////////////////////////////////////////////// // get info from machine //////////////////////////////////////////////////////////////////////////////// // get global ids to locate tread/team info (constant regardless of OMP) DEVICE int GetLogicalThreadIdInBlock(bool isSPMDExecutionMode); DEVICE int GetMasterThreadID(); DEVICE int GetNumberOfWorkersInTeam(); // get OpenMP thread and team ids DEVICE int GetOmpThreadId(int threadId, bool isSPMDExecutionMode); // omp_thread_num DEVICE int GetOmpTeamId(); // omp_team_num // get OpenMP number of threads and team DEVICE int GetNumberOfOmpThreads(bool isSPMDExecutionMode); // omp_num_threads DEVICE int GetNumberOfOmpTeams(); // omp_num_teams // get OpenMP number of procs DEVICE int GetNumberOfProcsInTeam(bool isSPMDExecutionMode); DEVICE int GetNumberOfProcsInDevice(bool isSPMDExecutionMode); // masters DEVICE int IsTeamMaster(int ompThreadId); // Parallel level DEVICE void IncParallelLevel(bool ActiveParallel, __kmpc_impl_lanemask_t Mask); DEVICE void DecParallelLevel(bool ActiveParallel, __kmpc_impl_lanemask_t Mask); //////////////////////////////////////////////////////////////////////////////// // Memory //////////////////////////////////////////////////////////////////////////////// // safe alloc and free DEVICE void *SafeMalloc(size_t size, const char *msg); // check if success DEVICE void *SafeFree(void *ptr, const char *msg); // pad to a alignment (power of 2 only) DEVICE unsigned long PadBytes(unsigned long size, unsigned long alignment); #define ADD_BYTES(_addr, _bytes) \ ((void *)((char *)((void *)(_addr)) + (_bytes))) #define SUB_BYTES(_addr, _bytes) \ ((void *)((char *)((void *)(_addr)) - (_bytes))) //////////////////////////////////////////////////////////////////////////////// // Teams Reduction Scratchpad Helpers //////////////////////////////////////////////////////////////////////////////// DEVICE unsigned int *GetTeamsReductionTimestamp(); DEVICE char *GetTeamsReductionScratchpad(); #endif