10 static constexpr 
int BarrierInitFlag = 0x7856;
 
   17 static __device__ 
void gms_init(
int NumWarps, 
int* p_control_bits)
 
   25     regs.two32[0] = BarrierInitFlag;
 
   26     regs.two32[1] = NumWarps;
 
   29         atomicCAS(
reinterpret_cast<unsigned long*
>(p_control_bits), 0, regs.one64);
 
   33 static __device__ 
void gms_barrier(
int* p_control_bits)
 
   35     constexpr 
int mask = WarpSize - 1;
 
   37     if((threadIdx.x & mask) == 0)
 
   42             const int r0 = __atomic_load_n(&p_control_bits[0], __ATOMIC_RELAXED);
 
   44             if(r0 == BarrierInitFlag)
 
   50         atomicSub(&p_control_bits[1], 1);
 
   55             const int r1 = __atomic_load_n(&p_control_bits[1], __ATOMIC_RELAXED);
 
   67 static __device__ 
void gms_reset(
int* p_control_bits)
 
   71         (void)atomicCAS(&p_control_bits[0], BarrierInitFlag, 0);