@@ -583,15 +583,18 @@ ESIMD_NODEBUG ESIMD_INLINE
583
583
src1.data (), pred.data ());
584
584
}
585
585
586
- // / Generic work-group barrier.
587
- // / \ingroup sycl_esimd
588
- inline ESIMD_NODEBUG void esimd_barrier () { __esimd_barrier (); }
589
-
590
- // / Generic work-group split barrier
591
- inline ESIMD_NODEBUG void esimd_sbarrier (EsimdSbarrierType flag) {
592
- __esimd_sbarrier (flag);
593
- }
594
-
586
+ // / Bits used to form the bitmask that controls the behavior of esimd_fence
587
+ // / Bit 0: the “commit enable” bit. If set, the fence is guaranteed
588
+ // / to be globally observable
589
+ // / Bit 1: flush instruction cache if set.
590
+ // / Bit 2: flush sampler cache if set
591
+ // / Bit 3: flush constant cache if set
592
+ // / Bit 4: flush read-write cache if set
593
+ // / Bit 5: 0 means the fence is applied to global memory
594
+ // / 1 means the fence applies to shared local memory only
595
+ // / Bit 6: flush L1 read-only data cache if set
596
+ // / Bit 7: indicates this is a scheduling barrier
597
+ // / but will not generate an actual fence instruction
595
598
enum EsimdFenceMask {
596
599
ESIMD_GLOBAL_COHERENT_FENCE = 0x1 ,
597
600
ESIMD_L3_FLUSH_INSTRUCTIONS = 0x2 ,
@@ -604,11 +607,30 @@ enum EsimdFenceMask {
604
607
};
605
608
606
609
// / esimd_fence sets the memory read/write order.
610
+ // / \tparam cntl is the bitmask composed from enum EsimdFenceMask
607
611
// / \ingroup sycl_esimd
608
612
ESIMD_INLINE ESIMD_NODEBUG void esimd_fence (uint8_t cntl) {
609
613
__esimd_slm_fence (cntl);
610
614
}
611
615
616
+ // / Generic work-group barrier.
617
+ // / Performs barrier synchronization for all threads within the same thread
618
+ // / group. The barrier instruction causes the executing thread to wait until
619
+ // / all threads in the same thread group have executed the barrier instruction.
620
+ // / Memory ordering is also guaranteed by this instruction.
621
+ // / The behavior is undefined if this instruction is executed in divergent
622
+ // / control flow.
623
+ // / \ingroup sycl_esimd
624
+ inline ESIMD_NODEBUG void esimd_barrier () {
625
+ __esimd_slm_fence (ESIMD_GLOBAL_COHERENT_FENCE | ESIMD_LOCAL_BARRIER);
626
+ __esimd_barrier ();
627
+ }
628
+
629
+ // / Generic work-group split barrier
630
+ inline ESIMD_NODEBUG void esimd_sbarrier (EsimdSbarrierType flag) {
631
+ __esimd_sbarrier (flag);
632
+ }
633
+
612
634
// / @defgroup sycl_esimd_slm SLM functions
613
635
// / \ingroup sycl_esimd
614
636
// / @{
0 commit comments