Ë
    ŒÓ^jH  ã                   ó   — d dl Z d dlmc mc mZ d dlmZmZ d dl	m
Z
 d dlmZmZ g d¢Z G d„ de
«      Zeddej                   d	ej                   fd
„«       Zedd„«       Zedd„«       Zedd„«       Zedddœd„«       Zy)é    N)Úconstexpr_functionÚjit)ÚSwizzledSharedLayout)ÚbuiltinÚ_unwrap_if_constexpr)Úallocate_mbarrierÚarriveÚinitÚ
invalidateÚMBarrierLayoutÚwaitc                   óJ   ‡ — e Zd ZdZdˆ fd„	Zeeddedefd„«       «       Z	ˆ xZ
S )r   z£
    Layout for mbarrier synchronization in Ampere and later architectures.

    Args:
        cga_layout (List[List[int]]): CGA layout bases. Defaults to [].
    c                 ó8   •— t         ‰| �  ddddg|xs g ¬«       y )Né   r   )ÚvecÚ	per_phaseÚ	max_phaseÚorderÚ
cga_layout)ÚsuperÚ__init__)Úselfr   Ú	__class__s     €ú„/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/triton/experimental/gluon/language/nvidia/ampere/mbarrier.pyr   zMBarrierLayout.__init__   s$   ø€ Ü‰Ñ˜Q¨!°qÀÀÐPZÒP`Ð^`ÐÕaó    Únum_ctasÚtwo_ctac                 ó‚  — t        j                  | «      } t        j                  |«      }|r| dz  dk(  sJ d«       ‚| dkD  sJ d«       ‚| | dz
  z  dk(  sJ d«       ‚g }|r|j                  dg«       | dz  } t        t	        t        j                  | «      «      «      D ]  }|j                  d|z  g«       Œ t        |«      S )zÃ
        Create a multi-CTA mbarrier layout.

        Args:
            num_ctas (int): Number of CTAs.
            two_cta (bool): Whether the barrier should synchronize every other CTA
        é   r   z&num_ctas must be even for two-CTA modeznum_ctas must be positiver   znum_ctas must be a power of two)Úttglr   ÚappendÚrangeÚintÚmathÚlog2r   )r   r   ÚbasesÚis       r   ÚmultictazMBarrierLayout.multicta   sÌ   € ô ×,Ñ,¨XÓ6ˆÜ×+Ñ+¨GÓ4ˆÙØ˜a‘< 1Ò$ÐNÐ&NÓNÐ$Ø˜!Š|Ð8Ð8Ó8ˆ|Ø˜H q™LÑ)¨aÒ/ÐRÐ1RÓRÐ/àˆÙØ�L‰L˜!˜ÔØ˜‰NˆHä”sœ4Ÿ9™9 XÓ.Ó/Ó0ò 	!ˆAØ�L‰L˜!˜Q™$˜Õ ð	!ä˜eÓ$Ð$r   ©N)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ústaticmethodr   r#   Úboolr(   Ú__classcell__)r   s   @r   r   r      s8   ø„ ñõbð Øñ%˜3ð %¨ò %ó ó ô%r   r   ÚbatchÚtwo_ctasc                 ó,  — t        j                  «       }|s|n|dz  }t        j                  | du xs t        | j                  t
        «      «       | €|gn| |g}t        j                  t         j                  |t        j                  ||¬«      «      }|S )zŒ
    Helper function to allocate an mbarrier

    Args:
        two_ctas (bool): Whether the barrier should synchronize every other CTA
    r   N)r   r   )
r    r   Ústatic_assertÚ
isinstanceÚvaluer#   Úallocate_shared_memoryÚint64r   r(   )r1   r2   r   Ú	num_elemsÚshapeÚbars         r   r   r   1   s„   € ô  $Ÿ}™}›€HÙ08¡¸hÈ!¹m€IÜ×Ñ�u �}ÒD¬
°5·;±;ÄÓ(DÔEØ+0¨=˜Y™K¸uÀiÐ>P€EÜ
×
%Ñ
%Ü�
‰
ØÜ×Ñ¨¸8ÐÓDó€Cð
 €Jr   c                 óf   — t        |«      }|j                  j                  | j                  |«       y)zÊ
    Initialize an mbarrier with a specified count.

    Args:
        mbarrier (shared_memory_descriptor): The barrier object to initialize.
        count (int): The initial count for the barrier.
    N)r   ÚbuilderÚcreate_mbarrier_initÚhandle)ÚmbarrierÚcountÚ	_semantics      r   r
   r
   E   s(   € ô ! Ó'€EØ×Ñ×*Ñ*¨8¯?©?¸EÕBr   c                 óN   — |j                   j                  | j                  «       y)z�
    Invalidate an mbarrier, resetting its state.

    Args:
        mbarrier (shared_memory_descriptor): The barrier object to invalidate.
    N)r=   Úcreate_mbarrier_invalr?   )r@   rB   s     r   r   r   R   s   € ð ×Ñ×+Ñ+¨H¯O©OÕ<r   Tc                 óü   — |j                  |«      }|j                  |«      }|D �cg c]  }|j                  ‘Œ }}|j                  j                  | j                  |j                  |j                  |«       yc c}w )aÍ  
    Wait until the mbarrier object completes its current phase.

    Args:
        mbarrier (shared_memory_descriptor): The barrier object to wait on.
        phase (int): The phase index to wait for.
        pred (bool): Predicate. Operation is skipped if predicate is False. Defaults to True.
        deps (Sequence[shared_memory_descriptor]): Dependent allocations barrier is waiting on. Used to track liveness of dependent allocations. Defaults to ().
    N)Ú	to_tensorr?   r=   Úcreate_mbarrier_wait)r@   ÚphaseÚpredÚdepsrB   Úxs         r   r   r   ]   sg   € ð ×Ñ Ó&€EØ×Ñ˜tÓ$€DØ"Ö#˜ˆA�H‹HÐ#€DÐ#Ø×Ñ×*Ñ*¨8¯?©?¸E¿L¹LÈ$Ï+É+ÐW[Õ\ùò $s   §A9)rI   rB   c                óŒ   — d}|j                  |«      }|j                  j                  | j                  ||j                  «       y)a  
    Arrive on an mbarrier, signaling that a thread has reached the barrier.

    Args:
        mbarrier (shared_memory_descriptor): The barrier object to arrive on.
        pred (bool): Predicate. Operation is skipped if predicate is False. Defaults to True.
    r   N)rF   r=   Úcreate_mbarrier_arriver?   )r@   rI   rB   rA   s       r   r	   r	   n   s9   € ð €EØ×Ñ˜tÓ$€DØ×Ñ×,Ñ,¨X¯_©_¸eÀTÇ[Á[ÕQr   )NFr)   )T© N)r$   Ú"triton.experimental.gluon.languageÚexperimentalÚgluonÚlanguager    Ú"triton.experimental.gluon._runtimer   r   Ú+triton.experimental.gluon.language._layoutsr   Ú(triton.experimental.gluon.language._corer   r   Ú__all__r   Ú	constexprr   r
   r   r   r	   rN   r   r   ú<module>rX      s¯   ðÛ ç 1Ó 1ß FÝ Lß Râ
Y€ô#%Ð)ô #%ðL ñ˜TŸ^™^ð ¸d¿n¹nò ó ðð& 	ò	Có 	ð	Cð 	ò=ó 	ð=ð 	ò]ó 	ð]ð  	Ø!¨Tó 
Ró 	ñ
Rr   