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);