| //===--------- support.h - NVPTX OpenMP 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. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // Execution Parameters |
| //////////////////////////////////////////////////////////////////////////////// |
| enum ExecutionMode { |
| Generic = 0x00u, |
| Spmd = 0x01u, |
| ModeMask = 0x01u, |
| }; |
| |
| enum RuntimeMode { |
| RuntimeInitialized = 0x00u, |
| RuntimeUninitialized = 0x02u, |
| RuntimeMask = 0x02u, |
| }; |
| |
| INLINE void setExecutionParameters(ExecutionMode EMode, RuntimeMode RMode); |
| INLINE bool isGenericMode(); |
| INLINE bool isSPMDMode(); |
| INLINE bool isRuntimeUninitialized(); |
| INLINE bool isRuntimeInitialized(); |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // get info from machine |
| //////////////////////////////////////////////////////////////////////////////// |
| |
| // get low level ids of resources |
| INLINE int GetThreadIdInBlock(); |
| INLINE int GetBlockIdInKernel(); |
| INLINE int GetNumberOfBlocksInKernel(); |
| INLINE int GetNumberOfThreadsInBlock(); |
| INLINE unsigned GetWarpId(); |
| INLINE unsigned GetLaneId(); |
| |
| // get global ids to locate tread/team info (constant regardless of OMP) |
| INLINE int GetLogicalThreadIdInBlock(bool isSPMDExecutionMode); |
| INLINE int GetMasterThreadID(); |
| INLINE int GetNumberOfWorkersInTeam(); |
| |
| // get OpenMP thread and team ids |
| INLINE int GetOmpThreadId(int threadId, |
| bool isSPMDExecutionMode); // omp_thread_num |
| INLINE int GetOmpTeamId(); // omp_team_num |
| |
| // get OpenMP number of threads and team |
| INLINE int GetNumberOfOmpThreads(bool isSPMDExecutionMode); // omp_num_threads |
| INLINE int GetNumberOfOmpTeams(); // omp_num_teams |
| |
| // get OpenMP number of procs |
| INLINE int GetNumberOfProcsInTeam(bool isSPMDExecutionMode); |
| INLINE int GetNumberOfProcsInDevice(bool isSPMDExecutionMode); |
| |
| // masters |
| INLINE int IsTeamMaster(int ompThreadId); |
| |
| // Parallel level |
| INLINE void IncParallelLevel(bool ActiveParallel); |
| INLINE void DecParallelLevel(bool ActiveParallel); |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // Memory |
| //////////////////////////////////////////////////////////////////////////////// |
| |
| // safe alloc and free |
| INLINE void *SafeMalloc(size_t size, const char *msg); // check if success |
| INLINE void *SafeFree(void *ptr, const char *msg); |
| // pad to a alignment (power of 2 only) |
| INLINE 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))) |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // Named Barrier Routines |
| //////////////////////////////////////////////////////////////////////////////// |
| INLINE void named_sync(const int barrier, const int num_threads); |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // Teams Reduction Scratchpad Helpers |
| //////////////////////////////////////////////////////////////////////////////// |
| INLINE unsigned int *GetTeamsReductionTimestamp(); |
| INLINE char *GetTeamsReductionScratchpad(); |
| INLINE void SetTeamsReductionScratchpadPtr(void *ScratchpadPtr); |