@@ -275,7 +275,7 @@ static void generateNamedBarrier(int &status, IR_Builder &irb,
275275}
276276
277277
278- void  IR_Builder::generateSingleBarrier (G4_Predicate *prd) {
278+ void  IR_Builder::generateSingleBarrier (G4_Predicate *prd,  uint32_t  id ) {
279279  //  single barrier: # producer = # consumer = # threads, barrier id = 0
280280  //  For now produce no fence
281281  //  Number of threads per threadgroup is r0.2[31:24]
@@ -286,12 +286,12 @@ void IR_Builder::generateSingleBarrier(G4_Predicate *prd) {
286286  //    Hdr.2:d[31:24,23:16]
287287  G4_Declare *header = createTempVar (8 , Type_UD, getGRFAlign ());
288288  auto  dst = createDst (header->getRegVar (), 0 , 2 , 1 , Type_UD);
289-   uint32_t  headerInitValDw2 = 0x0 ; //  initial value for DWord2
289+   uint32_t  headerInitValDw2 = id ; //  initial value for DWord2
290290  if  (getPlatform () >= Xe2 && getOption (vISA_ActiveThreadsOnlyBarrier)) {
291291    headerInitValDw2 |= (1  << 8 );
292292  }
293293  //  Header.2:d has the following format:
294-   //   bits[7:0] = 0x0  (barrier id)
294+   //   bits[7:0] = id  (barrier id)
295295  //   bits[8] = active only thread barrier
296296  //   bits[15:14] = 0 (producer/consumer)
297297  //   bits[23:16] = num producers = r0.11:b (r0.2[31:24] = num threads in tg)
@@ -311,7 +311,6 @@ void IR_Builder::generateSingleBarrier(G4_Predicate *prd) {
311311      createSrc (getBuiltinR0 ()->getRegVar (), 0 , 11 , getRegionScalar (), Type_UB);
312312  auto  inst1 = createMov (g4::SIMD2, dst, src0, InstOpt_WriteEnable, true );
313313  inst1->addComment (" signal barrier payload (nprods, ncons)" 
314- 
315314  //  1 message length, 0 response length, no header, no ack
316315  int  desc = (0x1  << 25 ) + 0x4 ;
317316
@@ -534,16 +533,12 @@ int IR_Builder::translateVISAWaitInst(G4_Operand *mask) {
534533  return  VISA_SUCCESS;
535534}
536535
537- void  IR_Builder::updateBarrier () {
538-   //  The legacy barrier is always allocated to id 0.
539-   usedBarriers.set (0 , true );
540- }
541- 
542- void  IR_Builder::generateBarrierSend (G4_Predicate *prd) {
543-   updateBarrier ();
536+ void  IR_Builder::generateBarrierSend (G4_Predicate *prd, uint32_t  id = 0 ) {
537+   //  The id = 0 is the alias for the regular threadgroup barrier.
538+   usedBarriers.set (id, true );
544539
545540  if  (hasUnifiedBarrier ()) {
546-     generateSingleBarrier (prd);
541+     generateSingleBarrier (prd, id );
547542    return ;
548543  }
549544
@@ -576,8 +571,9 @@ void IR_Builder::generateBarrierSend(G4_Predicate *prd) {
576571                 createImm (desc, Type_UD), InstOpt_WriteEnable, msgDesc, true );
577572}
578573
579- void  IR_Builder::generateBarrierWait (G4_Predicate *prd) {
580-   updateBarrier ();
574+ void  IR_Builder::generateBarrierWait (G4_Predicate *prd, uint32_t  id = 0 ) {
575+   //  The id = 0 is the alias for the regular threadgroup barrier.
576+   usedBarriers.set (id, true );
581577
582578  G4_Operand *waitSrc = nullptr ;
583579  if  (!hasUnifiedBarrier ()) {
@@ -592,8 +588,8 @@ void IR_Builder::generateBarrierWait(G4_Predicate *prd) {
592588    }
593589  } else  {
594590    if  (getPlatform () >= Xe_PVC) {
595-       //  PVC: sync.bar 0 
596-       waitSrc = createImm (0 , Type_UD);
591+       //  PVC: sync.bar id 
592+       waitSrc = createImm (id , Type_UD);
597593    } else  {
598594      //  DG2: sync.bar null
599595      waitSrc = createNullSrc (Type_UD);
@@ -751,10 +747,24 @@ int IR_Builder::translateVISASplitBarrierInst(G4_Predicate *prd,
751747                                              bool  isSignal) {
752748  TIME_SCOPE (VISA_BUILDER_IR_CONSTRUCTION);
753749
750+   uint32_t  id = 0 ;
751+ 
752+   if  (getOption (vISA_SplitBarrierID1) &&
753+     getPlatform () >= Xe_PVC) {
754+     //  We have a mix usage of the
755+     //  workgroupbarrier and splitbarrier.
756+     //  We need to split the ID usage:
757+     //  workgroupbarrier takes ID:0
758+     //  splitbarrier takes ID:1
759+     //  to avoid cross usage of the same ID
760+     //  and hang on the GPU.
761+     id = 1 ;
762+   }
763+ 
754764  if  (isSignal) {
755-     generateBarrierSend (prd);
765+     generateBarrierSend (prd, id );
756766  } else  {
757-     generateBarrierWait (prd);
767+     generateBarrierWait (prd, id );
758768  }
759769
760770  return  VISA_SUCCESS;
0 commit comments