1 //===--------- statequeue.h - NVPTX OpenMP GPU State Queue ------- CUDA -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file contains a queue to hand out OpenMP state objects to teams of 10 // one or more kernels. 11 // 12 // Reference: 13 // Thomas R.W. Scogland and Wu-chun Feng. 2015. 14 // Design and Evaluation of Scalable Concurrent Queues for Many-Core 15 // Architectures. International Conference on Performance Engineering. 16 // 17 //===----------------------------------------------------------------------===// 18 19 #ifndef __STATE_QUEUE_H 20 #define __STATE_QUEUE_H 21 22 #include <stdint.h> 23 24 #include "target_impl.h" 25 26 template <typename ElementType, uint32_t SIZE> class omptarget_nvptx_Queue { 27 private: 28 ElementType elements[SIZE]; 29 volatile ElementType *elementQueue[SIZE]; 30 volatile uint32_t head; 31 volatile uint32_t ids[SIZE]; 32 volatile uint32_t tail; 33 34 static const uint32_t MAX_ID = (1u << 31) / SIZE / 2; 35 INLINE uint32_t ENQUEUE_TICKET(); 36 INLINE uint32_t DEQUEUE_TICKET(); 37 INLINE static uint32_t ID(uint32_t ticket); 38 INLINE bool IsServing(uint32_t slot, uint32_t id); 39 INLINE void PushElement(uint32_t slot, ElementType *element); 40 INLINE ElementType *PopElement(uint32_t slot); 41 INLINE void DoneServing(uint32_t slot, uint32_t id); 42 43 public: omptarget_nvptx_Queue()44 INLINE omptarget_nvptx_Queue() {} 45 INLINE void Enqueue(ElementType *element); 46 INLINE ElementType *Dequeue(); 47 }; 48 49 #include "state-queuei.h" 50 51 #endif 52