Ë
    ÄÓ^jÑ¯ ã            
      óÀ  — d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlmZ d dlmZmZmZ d dlmZ d dlmZmZmZmZ d dlZd dlmZ d dlZd dlZd dlm c m!Z" d dl#m$Z$ d d	l%m&Z&m'Z' d d
l(m)Z)m*Z* d dl+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5m6Z6m7Z7 ddl8m9Z9m:Z:m;Z;m<Z< ddl=m>Z> ddl?m@Z@mAZAmBZBm Z  ddlCmDZD ddlEmFZFmGZGmHZHmIZI ddlJmKZK ddlLmMZM ddlNmOZO ddlPmQZQ ddlRmSZSmTZTmUZUmVZVmWZWmXZXmYZY ddlZm[Z[m\Z\ ddl]m^Z^m_Z_m`Z`maZambZb ddlcmdZd ddlemfZf ddl mgZgmhZhmiZimjZjmkZkmlZlmmZmmnZnmoZompZpmqZqmrZrmsZsmtZtmuZumvZvmwZw ddlxmyZzm{Z{m|Z|m}Z} dd l~mZ d!d"l€m�Z� d!d#l‚mƒZƒm„Z„m…Z…m†Z†m‡Z‡mˆZˆm‰Z‰mŠZŠm‹Z‹mŒZŒm�Z�mŽZŽm�Z�m�Z�m‘Z‘m’Z’ d!d$l“m”Z”m•Z•m–Z–m—Z—m˜Z˜m™Z™mšZš d!d%l›mœZœm�Z�mžZžmŸZŸm Z m¡Z¡m¢Z¢ d!d&l£m¤Z¤ er,d d'l¥m¦Z¦ d d(l§m¨Z¨ d d)l©mªZª dd*lAm«Z« d!d+l‚m¬Z¬ d!d,l­m®Z®  ed-«      Z¯ e	�j`                  e±«      Z²e�jf                  �ji                  e±d.«      Zµe�jf                  �ji                  e±d/«      Z¶e�jf                  �ji                  e±d0«      Z· eD«       ZCd1Z¸d2„ Z¹dld3„Zº	 	 	 	 	 	 dmd4„Z» G d5„ d6«      Z¼ ed«      dnd7„«       Z½ G d8„ d9«      Z¾e�j~                   G d:„ d;«      «       ZÀe�j~                   G d<„ d=«      «       ZÁe�j~                   G d>„ d?eÁ«      «       ZÂe�j~                   G d@„ dAeÁ«      «       ZÃdodB„ZÄdpdC„ZÅ	 	 	 	 	 	 	 	 dqdD„ZÆ G dE„ dFe�«      ZÇ eÇ«       �j�                  ZÉdrdG„ZÊdrdH„ZËdsdI„ZÌdrdJ„ZÍdtdK„ZÎdudL„ZÏdvdM„ZÐdwdN„ZÑ G dO„ dPe‡«      ZÒdxdQ„ZÓdydzdS„ZÔ G dT„ dUeŒ«      ZÕe¼�j­                  eÕ�j®                  dR«       e¼�j­                  eÕ�j°                  dR«       eÕ�j³                  dV«        G dW„ dXeÕ«      ZÚ G dY„ dZ«      ZÛe�j~                   G d[„ d\«      «       ZÜ G d]„ d^«      ZÝe�j~                   G d_„ d`«      «       ZÞ G da„ dbe†eÒeßeàeßeßf   z  f   «      Záe�j~                   G dc„ dd«      «       Zâ G de„ dfe™eÒ   «      Zã G dg„ dheã«      Zä G di„ dješ«      Zåd{dk„Zæy)|é    )ÚannotationsN)Úabstractmethod)ÚCallableÚIterableÚSequence)Ú	lru_cache)ÚAnyÚcastÚTYPE_CHECKINGÚTypeVar)Ú
PRECEDENCE)Úget_interface_for_device)ÚidentityÚpreserve_rng_state)Úis_integer_dtypeÚtype_to_dtype)Ú
OrderedSet)ÚCeilDivÚFloorDivÚMinÚModularIndexingÚTruncToFloatÚ
TruncToInt)Úget_triton_versionÚhas_triton_packageÚhas_triton_stable_tma_apié   )Úfree_symbol_is_typeÚ
prefix_strÚsymbol_is_typeÚSymT)ÚValueRangesé   )ÚconfigÚirÚmetricsÚutils)ÚAsyncCompile)Ú	code_hashÚget_pathÚPyCodeCacheÚwrite_atomic)Ú'set_kernel_post_grad_provenance_tracing)ÚDefaultHandler)Útriton_heuristics)Úbenchmarker)ÚAutotuneHintÚDevicePropertiesÚget_warp_sizeÚnative_matmul_persistent_rblockÚReductionHintÚTRITON_MAX_BLOCKÚTRITON_MAX_RSPLIT)Úget_max_y_gridÚnext_power_of_2)ÚBaseSchedulerNodeÚ$FusedExternTritonKernelSchedulerNodeÚFusedSchedulerNodeÚ	SchedulerÚSchedulerNode)Úget_broadcasted_shape)Úget_raw_stream_name)Ú_TMA_SUPPORTED_DTYPESÚcache_on_selfÚDelayReplaceLineÚdevice_supports_fp64Úget_bounds_index_exprÚget_fused_kernel_nameÚget_kernel_metadataÚis_welford_reductionÚPlaceholderÚprefix_is_pointwiseÚprefix_is_reductionÚ	sympy_dotÚsympy_productÚ
sympy_subsÚtriton_typeÚtriton_version_uses_attrs_dictÚupcast_compute_type)Ú_opsÚReductionTypeÚ	StoreModeÚV)Ú"get_kernel_category_by_source_codeé   )ÚBlockPatternMatcher)ÚArgNameÚBackendFeatureÚConstexprArgÚCSEÚCSEVariableÚDeferredLineÚIndentedBufferÚInplacedBufferÚis_buffer_removedÚOpOverridesÚPythonPrinterÚ
RemovedArgÚSizeArgÚ	TensorArgÚWorkspaceArgÚWorkspaceZeroMode)Úconstant_reprÚIterationRangesÚIterationRangesEntryÚIterationRangesRootÚPartialAccumulateÚ
SIMDKernelÚSIMDScheduling)Ú	config_ofÚequal_1_arg_indicesÚis_unaligned_buffer_nameÚselect_tile_hintÚshould_unwrap_unspec_argÚsignature_to_metaÚ/use_uint8_triton_storage_for_cuda_float8_e4m3fn)ÚSymbolicCallArg)Ú
ModuleType©ÚDtypePropagationOpsHandler)ÚShapeEnv)ÚIRNode)ÚBlockShapeType)ÚSIMDKernelFeaturesÚ_TÚ
perf_hintsÚscheduleÚfusioné   c                ó<   — | dv }|rdnd}| dv r|› d| › d�S |› d| › �S )N)ÚanyÚmaxÚminÚprodÚtriton_helpersÚtl)r†   r‡   ú.Ú2© )Úreduction_typeÚ
use_helperÚmodules      úi/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_inductor/codegen/triton.pyÚget_triton_reduction_functionr’   ž   sE   € ØÐ#@Ð@€JÙ!+Ñ°€FØ˜Ñ'Ø�˜˜>Ð*¨!Ð,Ð,à�˜˜>Ð*Ð+Ð+ó    c                ó¼   — t        | t        j                  «      syt        | t        j                  «      xs& | j                  xr t        | j                  «      dk(  S )zœ "
    Is this expression a Sympy Integer or is it an integer sympy Expr
    containing no free symbols. The latter case can happen with Identity expr.
    Fr   )Ú
isinstanceÚsympyÚExprÚIntegerÚ
is_integerÚlenÚfree_symbols©Úexprs    r‘   Úis_sympy_integer_likerž   §   sI   € ô
 �dœEŸJ™JÔ'ØÜ�dœEŸM™MÓ*ò Ø�‰Ò7œC × 1Ñ 1Ó2°aÑ7ðr“   c                óº   ‡‡— |j                   r| j                  t        «      s| S | j                  t        u rt	        | j
                  Ž S dd„Šdˆˆfd„Š ‰| «      S )Nc                óL   — t        t        | dd«      xs t        | dd«      «      S )NÚ
is_BooleanFÚis_Relational)ÚboolÚgetattr)Únodes    r‘   Úis_predicate_exprz;_materialize_trunc_to_float_expr.<locals>.is_predicate_exprÂ   s*   € ÜÜ�D˜,¨Ó.ÒW´'¸$ÀÐQVÓ2Wó
ð 	
r“   c                ó$  •— | j                  t        «      s| S | j                  t        u rt        | j                  Ž S  ‰| «      s| j
                  r| S t        ˆˆfd„| j                  D «       «      }|| j                  k(  r| S  | j                  |Ž S )Nc              3  óv   •K  — | ]0  }t        |t        j                  «      r ‰|«      s ‰|«      n|–— Œ2 y ­w©N)r•   r–   r—   )Ú.0Úargr¦   Úrewrite_float_subexprs     €€r‘   ú	<genexpr>zR_materialize_trunc_to_float_expr.<locals>.rewrite_float_subexpr.<locals>.<genexpr>Ï   s@   øè ø€ ò 
ð ô ˜#œuŸz™zÔ*Ñ3DÀSÔ3Iñ " #Ô&àóñ
ùó   ƒ69)Úhasr   Úfuncr   Úargsr™   Útuple)r¥   Únew_argsr¦   r¬   s     €€r‘   r¬   z?_materialize_trunc_to_float_expr.<locals>.rewrite_float_subexprÇ   sƒ   ø€ Ø�x‰xœ
Ô#ØˆKØ�9‰9œ
Ñ"Ü §¡Ð+Ð+Ù˜TÔ" d§o¢oØˆKäô 
ð —y‘yô	
ó 
ˆð �t—y‘yÒ ØˆKØˆt�y‰y˜(Ð#Ð#r“   )r¥   zsympy.BasicÚreturnr£   )r¥   ú
sympy.Exprr´   rµ   )Úis_floating_pointr¯   r   r°   r   r±   )r�   Údtyper¦   r¬   s     @@r‘   Ú _materialize_trunc_to_float_exprr¸   ³   sR   ù€ ð ×"Ò"¨$¯(©(´:Ô*>Øˆð ‡y�y”JÑÜ˜TŸY™YÐ'Ð'ó
ö
$ñ$ ! Ó&Ð&r“   c                  ó@   — e Zd ZU dZi Zded<   i Zded<   edd„«       Zy)	ÚOpDtypeSupportzŸ
    Some Triton ops such as libdevice and tl.math only support float32 and float64.
    This class records which dtypes are supported by specific IR ops.
    z"dict[str, OrderedSet[torch.dtype]]Úsupported_dtypeszdict[str, bool]Úconvert_outputsc                ó¦   — |j                   }t        t        j                  t        j                  g«      | j
                  |<   || j                  |<   y r©   )Ú__name__r   ÚtorchÚfloat32Úfloat64r»   r¼   )Úclsr°   Úconvert_outputÚop_names       r‘   Úregister_upcastzOpDtypeSupport.register_upcastå   s=   € à—-‘-ˆÜ(2´E·M±MÄ5Ç=Á=Ð3QÓ(Rˆ×Ñ˜WÑ%Ø'5ˆ×Ñ˜GÒ$r“   N)r°   zCallable[..., str]rÃ   r£   r´   ÚNone)	r¾   Ú
__module__Ú__qualname__Ú__doc__r»   Ú__annotations__r¼   ÚclassmethodrÅ   r�   r“   r‘   rº   rº   Ü   s1   … ñð
 <>ÐÐ8Ó=Ø')€O�_Ó)àò6ó ñ6r“   rº   c                 ód   — t        «       syddl} t        | j                  j                  d«      ryy)zd
    import AttrsDescriptor if the triton version is new enough to have this
    class defined.
    Ú r   NÚAttrsDescriptorz4from triton.compiler.compiler import AttrsDescriptor)r   Útriton.compiler.compilerÚhasattrÚcompiler)Útritons    r‘   Úgen_attr_descriptor_importrÓ   ì   s-   € ô ÔØã#ô ˆv�‰×'Ñ'Ð):Ô;ØEàr“   c                  ó>  — e Zd ZdZ eej                  ej                  g«      Z eej                  ej                  ej                  ge¢«      ZeD � ���ci c]%  }|t        j                  t        |   › d�dd¬«      “Œ' c}}}} ZeD � ���ci c]3  }|t        j                  t        |   j#                  «       › d�dd¬«      “Œ5 c}}}} Zedd„«       Zedd„«       Zedd	„«       Ze	 	 	 	 	 	 dd
„«       Ze	 	 	 	 	 	 dd„«       Zedd„«       Zyc c}}}} w c c}}}} w )ÚTritonSymbolszU
    Stores sympy.Symbol instances and constants associated with triton codegen.
    ÚoffsetT©ÚintegerÚnonnegativeÚBLOCK©rØ   Úpositivec           
     óJ  — d}|j                   }|D �]Š  }t        |t        j                  «      rHt        j
                  j                  j                  |j                     }t        |j                  «      }�nt        |t        j                  t        j                  t        j                  t        j                  t        j                  t        j                   f«      rd}n°t        j
                  j"                  j%                  |«      }|€J d|j                  › �«       ‚|j&                  }t        j
                  j)                  «       }	dg|	z  }
|j*                  €d}n2t-        | j/                  |«      «      |
|j*                  <   t        |
«      }t1        ||«      }�Œ� |€J ‚|S )Nr�   zUnregistered range symbol: Ú1)r›   r    r!   ÚTMPrU   ÚkernelÚcseÚvarname_mapÚnamer²   ÚshapeÚUNBACKED_INTÚSIZEÚPRECOMPUTED_SIZEÚINDEXÚFLOATÚUNBACKED_FLOATÚrange_tree_nodesÚgetÚrootÚtriton_tensor_ndimÚ
tensor_dimÚstrÚget_block_sizer?   )rÂ   r�   Ú
expr_shapeÚ	expr_varsÚvarÚcse_varÚ	var_shaper¥   ÚtreeÚndimrä   s              r‘   Úget_block_shapezTritonSymbols.get_block_shape  s\  € ð &(ˆ
Ø×%Ñ%ˆ	Øó 	FˆCÜ˜c¤4§8¡8Ô,ÜŸ(™(Ÿ,™,×2Ñ2°3·8±8Ñ<�Ü! '§-¡-Ó0’	ÜØä×%Ñ%Ü—I‘IÜ×)Ñ)Ü—J‘JÜ—J‘JÜ×'Ñ'ðô
ð ‘	ä—x‘x×0Ñ0×4Ñ4°SÓ9�ØÐ'ÐQÐ+FÀsÇxÁxÀjÐ)QÓQÐ'Ø—y‘y�Ü—x‘x×2Ñ2Ó4�Ø˜ ™�Ø—?‘?Ð*ð !#‘Iä-0°×1CÑ1CÀDÓ1IÓ-J�E˜$Ÿ/™/Ñ*Ü % e£�Iô /¨z¸9ÓEŠJð?	FðB Ð%Ð%Ð%àÐr“   c                ó6   — |j                   j                  «       S r©   )rí   Ú
block_size©rÂ   r÷   s     r‘   rñ   zTritonSymbols.get_block_sizeD  s   € à�y‰y×#Ñ#Ó%Ð%r“   c                ó6   — |j                   j                  «       S r©   )rí   Úblock_offsetrü   s     r‘   Úget_block_offsetzTritonSymbols.get_block_offsetH  s   € à�y‰y×%Ñ%Ó'Ð'r“   c                óÈ   — |j                   j                  |«      x}�|j                  j                  «       S | j                  D ]  }t        ||«      sŒt        |   › d�c S  y )NÚmask)rë   rì   rí   Ú	mask_nameÚblock_typesr    r   )rÂ   rà   Úsymbolr¥   Úsymts        r‘   Úmask_name_for_symbolz"TritonSymbols.mask_name_for_symbolL  sh   € ð ×+Ñ+×/Ñ/°Ó7Ð7ˆDÐDØ—9‘9×&Ñ&Ó(Ð(Ø—O‘Oò 	1ˆDÜ˜f dÕ+Ü$ TÑ*Ð+¨4Ð0Ò0ð	1ð r“   c                ó”   — |j                   j                  |«      x}�|j                  j                  S t	        || j
                  «      S r©   )rë   rì   rí   Úis_reductionr    Úreduction_types)rÂ   rà   r  r¥   s       r‘   Úis_reduction_index_symbolz'TritonSymbols.is_reduction_index_symbolY  sC   € ð ×+Ñ+×/Ñ/°Ó7Ð7ˆDÐDØ—9‘9×)Ñ)Ð)Ü˜f c×&9Ñ&9Ó:Ð:r“   c                óD   ‡ ‡— t        ˆ ˆfd„|j                  D «       «      S )zHReturn whether any symbol in a composite block shape is reduction-owned.c              3  óB   •K  — | ]  }‰j                  ‰|«      –— Œ y ­wr©   )r
  )rª   r  rÂ   rà   s     €€r‘   r­   z;TritonSymbols.has_reduction_index_symbol.<locals>.<genexpr>d  s&   øè ø€ ò 
àð ×)Ñ)¨&°&×9ñ
ùs   ƒ)r…   r›   )rÂ   rà   r�   s   `` r‘   Úhas_reduction_index_symbolz(TritonSymbols.has_reduction_index_symbola  s%   ù€ ô ô 
à×+Ñ+ô
ó 
ð 	
r“   N)r�   rµ   r´   r}   )r÷   rj   r´   rµ   )rà   ÚTritonKernelr  úsympy.Symbolr´   ú
str | None)rà   r  r  r  r´   r£   )rà   r  r�   rµ   r´   r£   )r¾   rÇ   rÈ   rÉ   r   r!   ÚR0_INDEXÚR1_INDEXr	  ÚXBLOCKÚYBLOCKÚZBLOCKr  r–   ÚSymbolr   Úblock_offsetsÚupperÚblock_sizesrË   rù   rñ   rÿ   r  r
  r  )rª   r  r–   r   s   0000r‘   rÕ   rÕ   ÿ   sƒ  „ ññ ! $§-¡-°·±Ð!?Ó@€OÙ˜dŸk™k¨4¯;©;¸¿¹ÐVÀoÐVÓW€Kð  ÷ñ àð 	Œe�l‰lœj¨Ñ.Ð/¨vÐ6ÀÐRVÔWÑWõ€Mð  ÷	ñ ð ð 	Œe�l‰lÜ˜$Ñ×%Ñ%Ó'Ð(¨Ð.¸Àtô
ñ 	
õ€Kð ò.ó ð.ð` ò&ó ð&ð ò(ó ð(ð ð
Ø!ð
Ø+7ð
à	ò
ó ð
ð ð;Ø!ð;Ø+7ð;à	ò;ó ð;ð ò
ó ñ
ùõwùõ
s   Á*D
Â8D
rÕ   c                  ó„   — e Zd ZU ded<   ded<   ded<   ded<   d	ed
<   ded<   dd„Zdd„Zdd„Zdd„Zdd„Ze	dd„«       Z
y)ÚIndexingOptionsrð   Ú	index_strúOrderedSet[str]Ú	mask_varsr  Ú
expand_strr£   Ú_has_rindexrµ   ÚindexzSequence[int | str] | NoneÚexpand_shapec                ó,   — t        | j                  «      S r©   )r£   r  ©Úselfs    r‘   Úhas_maskzIndexingOptions.has_masks  s   € Ü�D—N‘NÓ#Ð#r“   c                óJ   — t        | j                  t        j                  «      S r©   )r   r!  r!   rß   r$  s    r‘   Úhas_indirectzIndexingOptions.has_indirectv  s   € Ü" 4§:¡:¬t¯x©xÓ8Ð8r“   c                ó   — | j                   S r©   )r   r$  s    r‘   Ú
has_rindexzIndexingOptions.has_rindexy  s   € Ø×ÑÐr“   c                ó:   — t        d„ | j                  D «       «      S )Nc              3  óP   K  — | ]  }t        |«      j                  d «      –— Œ  y­w)ÚtmpN)rð   Ú
startswith)rª   r  s     r‘   r­   z.IndexingOptions.has_tmpmask.<locals>.<genexpr>}  s   è ø€ ÒJ°4”3�t“9×'Ñ'¨×.ÑJùs   ‚$&)r…   r  r$  s    r‘   Úhas_tmpmaskzIndexingOptions.has_tmpmask|  s   € ÜÑJ¸4¿>¹>ÔJÓJÐJr“   c                ód   ‡ — t        ˆ fd„t        j                  j                  «       D «       «      S )Nc              3  ó¢   •K  — | ]F  }‰j                   D ]5  }t        |t        «      xr |j                  xr |j	                  |«      –— Œ7 ŒH y ­wr©   )r  r•   rð   r  Ú	owns_mask)rª   r÷   r  r%  s      €r‘   r­   z,IndexingOptions.has_rmask.<locals>.<genexpr>‚  sU   øè ø€ ò 
àØŸ™ò
ð ô �tœSÓ!ÒP d×&7Ñ&7ÒP¸D¿N¹NÈ4Ó<PÓPð
ØPñ
ùs   ƒAA)r…   rU   rà   Úactive_range_treesr$  s   `r‘   Ú	has_rmaskzIndexingOptions.has_rmask  s,   ø€ ô ó 
äŸ™×3Ñ3Ó5ô
ó 
ð 	
r“   c                ó‚   — | j                   r2dj                  t        t        t        | j                   «      «      «      S dS )Nú & rÆ   )r  ÚjoinÚsortedÚmaprð   r$  s    r‘   Úmask_strzIndexingOptions.mask_strˆ  s4   € ð =A¿NºNˆE�J‰J”vœc¤# t§~¡~Ó6Ó7Ó8ð	
ØPVð	
r“   N©r´   r£   ©r´   rð   )r¾   rÇ   rÈ   rÊ   r&  r(  r*  r/  r4  Úpropertyr:  r�   r“   r‘   r  r  j  sS   … àƒNØÓØÓØÓØÓØ,Ó,ó$ó9ó óKó
ð ò
ó ñ
r“   r  c                  ó€  — e Zd ZU dZded<   ded<   ded<   ded	<   d
ed<   ded<   d
ed<   ded<   dZded<   dZded<   ed'd„«       Zed'd„«       Z	ed'd„«       Z
ed'd„«       Zeddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d(d„«       Z	 	 	 	 	 	 	 	 d)d„Zd*d„Z	 	 	 	 	 	 d+d„Zd,d „Zd-d!„Zd-d"„Zd-d#„Zd-d$„Zd-d%„Z	 	 	 	 	 	 	 	 	 	 	 	 d.d&„Zy)/ÚBlockDescriptorOptionszÞ
    This is a base class that describes a block descriptor used in Triton kernels.
    It can be used to create either a tensor descriptor (with TensorDescriptorOptions)
    or a block pointer (with BlockPtrOptions).
    ÚBlockParametersÚparamsrµ   Úconstant_offsetú	list[int]Úorderr  r  úSequence[sympy.Expr]Úbroadcast_shapeú
list[bool]Úbroadcasting_dimsÚfinal_shapeúBlockParameters.StrideSorterÚstride_sorterNzlist[int] | NoneÚ_boundary_checkFr£   Úcan_liftc                ó.   — | j                   j                  S r©   )rA  rä   r$  s    r‘   rä   zBlockDescriptorOptions.shapeª  s   € à�{‰{× Ñ Ð r“   c                ó.   — | j                   j                  S r©   )rA  Úblock_shaper$  s    r‘   rP  z"BlockDescriptorOptions.block_shape®  s   € à�{‰{×&Ñ&Ð&r“   c                ó.   — | j                   j                  S r©   )rA  Ústridesr$  s    r‘   rR  zBlockDescriptorOptions.strides²  ó   € à�{‰{×"Ñ"Ð"r“   c                ó.   — | j                   j                  S r©   )rA  Úoffsetsr$  s    r‘   rU  zBlockDescriptorOptions.offsets¶  rS  r“   )rM  c               óò  ‡— t         j                  j                  Šd	ˆfd„} ||j                  «      |_         ||j                  «      |_        |j
                  D �	cg c]  }	‰j                  |	d«      ‘Œ }
}	t        |
«      rd|
d<   |j                  |
«      }|D �cg c]  }t        j                  |«      ‘Œ }}t         j                  j                  r%|d   j                  dk(  sJ ‚|j                  d«       t        «       }|j
                  D ]o  }t!        |t"        j$                  «      sŒ|j&                  D ]C  }t)        |«      j+                  «       }t-        |«      st/        |«      sŒ3|j1                  |«       ŒE Œq t         j                  j2                  }t         j                  j4                  s{t7        |«      t7        t         j                  j8                  «      |z
  k(  rIt         j                  j:                  j=                  «       r!|t"        j>                  j@                  g|z  z  }|jC                  |t         j                  jD                  ¬«      \  }}|j                  D �cg c]  }‰j                  |d«      ‘Œ }}|j
                  }|j                  |«      }	 tG        jH                  t         j                  jD                  |j                  «      } | |t         j                  j                  jS                  |«      |||||||¬«	      }|jU                  ||«       |S c c}	w c c}w c c}w # tJ        $ r3 tM        tO        tQ        t7        |j                  «      «      «      «      }Y Œ–w xY w)
z2Helper to create a BlockDescriptorOptions instancec                óL   •— | D �cg c]  }‰j                  |«      ‘Œ c}S c c}w r©   )Úlookup_precomputed_size)Úexprsr�   Úsizevarss     €r‘   Úlookup_sizez2BlockDescriptorOptions.create.<locals>.lookup_sizeÊ  s"   ø€ ØGLÖM¸t�H×4Ñ4°TÕ:ÒMÐMùÒMs   †!rW   Féÿÿÿÿr   Úx)Ústride_sorter_clsÚ	shape_env)	rA  rB  rD  r  rI  rF  rH  rK  rM  )rY  zIterable[sympy.Expr]r´   úlist[sympy.Expr])+rU   ÚgraphrZ  rä   rR  rP  Ústatically_known_equalsÚallÚremove_dimsrÕ   rñ   rà   Úno_x_dimÚprefixÚpopr   r•   r–   r—   r›   rð   ÚlowerrK   rJ   ÚaddÚnum_reduction_dimsÚinside_reductionrš   ÚnumelsÚfeaturesr  ÚSÚOneÚmaybe_sort_with_stride_orderÚ
_shape_envr'   Úargsort_symÚAssertionErrorÚlistÚreversedÚrangerX  Úcompute_boundary_check)rÂ   rA  rB  Úrange_treesr  Úget_max_blockr^  rM  r[  ÚdimÚsingleton_dimsr÷   rI  Úincluded_final_shape_dimsr�   ÚsymÚsym_strÚreduction_ndimrK  ÚstriderH  rF  rD  ÚresultrZ  s                           @r‘   ÚcreatezBlockDescriptorOptions.createº  sû  ø€ ô —7‘7×#Ñ#ˆõ	Nñ # 6§<¡<Ó0ˆŒÙ$ V§^¡^Ó4ˆŒð AG×@RÑ@Rö
Ø9<ˆH×,Ñ,¨S°!Õ4ð
ˆð 
ô ˆ~Ôà!&ˆN˜2Ñð ×#Ñ# NÓ3ˆð GRÖR¸d”}×3Ñ3°DÕ9ÐRˆÐRÜ�8‰8×ÒØ˜q‘>×(Ñ(¨CÒ/Ð/Ð/Ø�O‰O˜AÔô %/£LÐ!Ø×&Ñ&ò 	;ˆDÜ˜$¤§
¡
Õ+Ø×,Ñ,ò ;�CÜ! #›hŸn™nÓ.�GÜ*¨7Ô3Ô7JÈ7Õ7SØ1×5Ñ5°cÕ:ñ;ð	;ô Ÿ™×4Ñ4ˆä—‘×)Ò)ÜÐ-Ó.´#´a·h±h·o±oÓ2FÈÑ2WÒWÜ—‘×!Ñ!×.Ñ.Ô0ð œEŸG™GŸK™K˜=¨>Ñ9Ñ9ˆKð !'× CÑ CØ/¼1¿7¹7×;MÑ;Mð !Dó !
Ñˆ�ð GMÇnÁnö
Ø<BˆH×,Ñ,¨V°QÕ7ð
Ðð 
ð !×,Ñ,ˆð ×#Ñ#Ð$5Ó6ˆð	?ô ×%Ñ%¤a§g¡g×&8Ñ&8¸&¿.¹.ÓIˆEñ
 ØÜŸG™G×,Ñ,×DÑDÀ_ÓUØØØ#Ø+Ø/Ø'Øô

ˆð 	×%Ñ% m°[ÔAØˆùò_
ùò SùòH
øô  ò 	?äœ¤%¬¨F¯N©NÓ(;Ó"<Ó=Ó>ŠEð	?ús$   ÁL+ÂL0É.L5Ê'8L: Ì:9M6Í5M6c                óD   — t         j                  |   }t        |||i«      S ©zN
        Replaces instances of {symt}_offset with the new expression.
        ©rÕ   r  rN   ©r%  r�   Úreplacementr  Úroffsets        r‘   Úreplace_offsetz%BlockDescriptorOptions.replace_offset&  ó&   € ô  ×-Ñ-¨dÑ3ˆÜ˜$ ¨+Ð 6Ó7Ð7r“   c                ó|   — t         j                  D ](  }| j                  |t        j                  d«      |«      }Œ* |S ©Nr   ©rÕ   r	  r‰  r–   r˜   ©r%  r�   r  s      r‘   Úremove_roffsetsz&BlockDescriptorOptions.remove_roffsets/  ó;   € Ü!×1Ñ1ò 	EˆDØ×&Ñ& t¬U¯]©]¸1Ó-=¸tÓD‰Dð	Eàˆr“   c           
     óÐ  — t         j                  j                  }|D �ci c]7  }t        j                  |j
                      |t        |j
                     «      “Œ9 }}t        t        t         j                  j                  |«      «      }t        t        | j                  «      «      D �cg c�]%  }|j                  | j                  |   t         j"                  j$                  «      së|r:t        j                  t&        j(                     | j*                  |   j,                  v sb|j/                  | j                  |   | j*                  |   «      sƒ|j/                  | j                  |   t1        | j*                  |   |«      «      sMt         j                  j2                  r1| j*                  |   t        j                  t&        j4                     k(  s|‘�Œ( c}| _        yc c}w c c}w )z6List of indices to pass to tl.load(boundary_check=...)N)rU   ra  rZ  rÕ   r  r  r   r…   r9  rà   Úneeds_yz_grid_overflowrv  rš   rä   rb  rR  r–   rn  ÚZeror!   r  rP  r›   Ústatically_known_multiple_ofrN   re  r  rL  )r%  ry  rx  rZ  ÚtÚblock_to_maxÚneeds_overflow_gridÚidxs           r‘   rw  z-BlockDescriptorOptions.compute_boundary_check4  s€  € ô —7‘7×#Ñ#ˆð !ö/
àô ×%Ñ% a§f¡fÑ-©}¼ZÈÏÉÑ=OÓ/PÑPð/
ˆð /
ô "¤#¤a§h¡h×&EÑ&EÀ{Ó"SÓTÐô œS §¡›_Ó-÷ 
àà×4Ñ4°T·\±\À#Ñ5FÌÏÉÏÉÔUñ ,Ü)×5Ñ5´d·k±kÑBØ×+Ñ+¨CÑ0×=Ñ=ñ>ð %×AÑAØ ŸJ™J s™O¨T×-=Ñ-=¸cÑ-Bôð !)× EÑ EØ ŸJ™J s™OÜ& t×'7Ñ'7¸Ñ'<¸lÓKô!ô —H‘H×%Ò%Ø×(Ñ(¨Ñ-´×1JÑ1JÌ4Ï;É;Ñ1WÒWó- ò 
ˆÕùò/
ùò 
s   Ÿ<GÂ*D+G#c                ó6   — | j                   €J ‚| j                   S r©   )rL  r$  s    r‘   Úboundary_checkz%BlockDescriptorOptions.boundary_checkh  s    € Ø×#Ñ#Ð/Ð/Ð/Ø×#Ñ#Ð#r“   c                 ó   — y©NFr�   r$  s    r‘   r(  z#BlockDescriptorOptions.has_indirectl  ó   € Ør“   c                ó:   — t        d„ | j                  D «       «      S )Nc              3  ód   K  — | ](  }t         j                  t        j                  |«      –— Œ* y ­wr©   )rÕ   r  rU   rà   )rª   r�   s     r‘   r­   z4BlockDescriptorOptions.has_rindex.<locals>.<genexpr>p  s)   è ø€ ò 
àô ×4Ñ4´Q·X±X¸t×Dñ
ùs   ‚.0)r…   rP  r$  s    r‘   r*  z!BlockDescriptorOptions.has_rindexo  s"   € Üñ 
à×(Ñ(ô
ó 
ð 	
r“   c                ó"   — | j                  «       S r©   )r*  r$  s    r‘   r4  z BlockDescriptorOptions.has_rmasku  s   € Ø�‰Ó Ð r“   c                 ó   — yrœ  r�   r$  s    r‘   r/  z"BlockDescriptorOptions.has_tmpmaskx  r�  r“   c                ó4   — t        | j                  «       «      S r©   )r£   rš  r$  s    r‘   r&  zBlockDescriptorOptions.has_mask{  s   € Ü�D×'Ñ'Ó)Ó*Ð*r“   c                ó¦  ‡‡— |Š	 	 	 	 	 	 	 	 dˆfd„}| j                   }| j                  }|rJ| j                  j                  | j                   «      }| j                  j                  | j                  «      }t	        ||«      D �	�
cg c]#  \  }	}
|
rt
        j                  j                  n|	‘Œ% }}	}
 ||||«      }|}| j                  j                  s4|s2t        |«      t        |«      k(  r| j                  j                  |«      }t        j                  j                  Š|xr7 t        |«      t        |«      k(  xr t        ˆfd„t	        ||«      D «       «      }t        | j                  «      r*|s(d|› dt        j                  j!                  |«      › d�}|Š| j                   }| j                  j                  s}|r| j                  j"                  n| j                  j$                  }d|› d|› d�}|D �cg c]  }‰|   ‘Œ	 c}Š|r| j                   n$| j                  j                  | j                   «      } ||||«      }|‰fS c c}
}	w c c}w )a¶  
        Generate a broadcast and a reshape for the block descriptor.
        This restores stride-0 dimensions which were removed from the block descriptor.

        Transposes are also applied to the input using self.stride_sorter:
        if for_store is True:
            - First Broadcast the value. Since self.broadcast_shape is stored in
            descending stride order, it must be reverted to the original order
            since the input value does not have dims with descending strides
            - After, transpose the broadcasted value so that dimensions are in
            descending stride order
            - Finally reshape to the block shape
        else (for load):
            - First broadcast the value to self.broadcast_shape (strides are descending)
            - Then transpose the value so that dimensions no longer have descending strides
            - Finally reshape the block to the final kernel tile shape
        c                óT   •— t        | ||«      }t        |«      t        |«      k7  r|Š|S r©   )Útriton_reshapeÚtriton_shape_dims)ÚvalueÚ	old_shapeÚ	new_shaper�  Úcurrent_shapes       €r‘   Úapply_reshapezKBlockDescriptorOptions.codegen_broadcast_and_reshape.<locals>.apply_reshape™  s0   ø€ ô $ E¨9°iÓ@ˆFÜ  Ó+Ô/@ÀÓ/KÒKØ )�ØˆMr“   c              3  óp   •K  — | ]-  \  }}‰j                  |d «      xs ‰j                  ||«      –— Œ/ y­w©rW   N)rb  )rª   Úpre_dimÚpost_dimrZ  s      €r‘   r­   zGBlockDescriptorOptions.codegen_broadcast_and_reshape.<locals>.<genexpr>Ê  sH   øè ø€ ò ñ &�G˜Xð ×0Ñ0°¸!Ó<ò GØ×3Ñ3°G¸XÓFóGñùs   ƒ36útl.broadcast_to(ú, ú)ú	tl.trans(©r§  rð   r¨  ú Sequence[sympy.Expr | int | str]r©  rµ  r´   rð   )rF  rH  rK  ÚrevertÚzipr–   rn  ro  Úis_identityrš   rU   ra  rZ  rc  r…   rà   Úindex_to_strÚsort_idxÚrevert_sort_idx)r%  r§  Úinitial_shaperI  Úallow_implicitÚ	for_storer«  rF  rH  rz  Úis_broadcastingÚpre_broadcast_shapeÚimplicit_broadcast_shapeÚsupports_implicit_broadcastr¨  Úpermute_dimsÚirª  rZ  s                    @@r‘   Úcodegen_broadcast_and_reshapez4BlockDescriptorOptions.codegen_broadcast_and_reshape~  sy  ù€ ð2 ;Hˆð		Øð		à7ð		ð 8ð		ð õ			ð ×.Ñ.ˆØ ×2Ñ2Ðñ Ø"×0Ñ0×7Ñ7¸×8LÑ8LÓMˆOØ $× 2Ñ 2× 9Ñ 9¸$×:PÑ:PÓ QÐô
 ),¨OÐ=NÓ(O÷
á$��_ñ +ŒE�G‰G�KŠK°Ñ3ð
Ðñ 
ñ ˜e ]Ð4GÓHˆà#6Ð à×"Ñ"×.Ò.ÙÜÐ'Ó(¬C°Ó,<Ò<ð (,×'9Ñ'9×'@Ñ'@ÐATÓ'UÐ$ô —7‘7×#Ñ#ˆØ&4ò '
ÜÐ(Ó)¬S°Ó-=Ñ=ò Üó ô *-Ð-EÀ{Ó)Sôó ð 	$ô ˆt×%Ñ%Ô&Ñ/Jà" 5 '¨¬A¯H©H×,AÑ,AÀ/Ó,RÐ+SÐSTÐUð ð ,ˆMà×(Ñ(ˆ	Ø×!Ñ!×-Ò-ñ ð ×"Ñ"×+Ò+à×'Ñ'×7Ñ7ð ð
   ˜w b¨¨°aÐ8ˆEØ7CÖD°!˜]¨1Ó-ÒDˆMñ ð ×$Ò$à×'Ñ'×.Ñ.¨t×/CÑ/CÓDð ñ ˜e Y°Ó<ˆØ�mÐ#Ð#ùó{
ùòh Es   Â(IÇ8I©r´   r`  )rA  r@  rB  rµ   rx  úlist[IterationRangesRoot]r  r  ry  úCallable[[str], int]r^  z"type[BlockParameters.StrideSorter]rM  r£   r´   r?  ©r�   rµ   r‡  rµ   r  r!   r´   rµ   ©r�   rµ   r´   rµ   )ry  rÈ  rx  rÇ  r´   rÆ   )r´   rC  r;  )r§  rð   r¼  rE  rI  rE  r½  r£   r¾  r£   r´   z,tuple[str, Sequence[sympy.Expr | int | str]])r¾   rÇ   rÈ   rÉ   rÊ   rL  rM  r=  rä   rP  rR  rU  rË   r‚  r‰  r�  rw  rš  r(  r*  r4  r/  r&  rÅ  r�   r“   r‘   r?  r?  ’  sÄ  … ñð ÓØÓØÓØÓØ)Ó)Ø!Ó!Ø%Ó%ð 0Ó/Ø(,€OÐ%Ó,ð €HˆdÓàò!ó ð!ð ò'ó ð'ð ò#ó ð#ð ò#ó ð#ð ð ñið  ðið $ð	ið
 /ðið #ðið ,ðið >ðið ðið 
 òió ðiðV8Øð8Ø-7ð8Ø?Cð8à	ó8óð
2
à+ð2
ð /ð2
ð 
ó	2
óh$óó
ó!óó+ðp$àðp$ð ,ðp$ð *ð	p$ð
 ðp$ð ðp$ð 
6ôp$r“   r?  c                  ó   — e Zd Zddd„Zy)ÚTensorDescriptorOptionsc                ó,  — t         j                  j                  }| j                  dk7  r|› d || j                  «      › d�n|d || j                  «      › �d || j
                  «      › �d || j                  «      › �g}ddj                  |«      › d�S )	a  
        Codegen a call to tl.make_tensor_descriptor()

        Args:
            name: variable name for pointer
            roffset: unused, but kept for compatibility with BlockPtrOptions.format()

        Returns:
            "tl.make_tensor_descriptor(...)"
        r   ú + (r²  úshape=ústrides=úblock_shape=ztl.make_tensor_descriptor(r±  )rU   rà   r¹  rB  rä   rR  rP  r7  )r%  rã   rˆ  Úfr±   s        r‘   ÚformatzTensorDescriptorOptions.formató  s    € ô �H‰H×!Ñ!ˆð ×'Ñ'¨1Ò,ð �&˜™Q˜t×3Ñ3Ó4Ð5°QÑ7àà‘Q�t—z‘z“]�OÐ$Ø‘q˜Ÿ™“Ð'Ð(Ø™1˜T×-Ñ-Ó.Ð/Ð0ð	
ˆð ,¨D¯I©I°d«OÐ+<¸AÐ>Ð>r“   N©T©rã   rð   r´   rð   )r¾   rÇ   rÈ   rÓ  r�   r“   r‘   rÌ  rÌ  ñ  s   „ õ?r“   rÌ  c                  ó>   — e Zd Z	 	 	 	 	 	 	 	 dd„Zdd„Zdd	d„Zd
d„Zy)ÚBlockPtrOptionsc                óD   — t         j                  |   }t        |||i«      S r„  r…  r†  s        r‘   r‰  zBlockPtrOptions.replace_offset  rŠ  r“   c                ó|   — t         j                  D ](  }| j                  |t        j                  d«      |«      }Œ* |S rŒ  r�  rŽ  s      r‘   r�  zBlockPtrOptions.remove_roffsets  r�  r“   c           	     óÎ  — t         j                  j                  }g | j                  ¢}|s|D �cg c]  }| j	                  |«      ‘Œ }}| j
                  dk7  r|› d || j
                  «      › d�n|d || j                  «      › �d || j                  «      › �d || j                  «      › �d || j                  «      › �d ||«      › �g}d	d
j                  |«      › d�S c c}w )a  
        Codegen a call to tl.make_block_ptr()

        Args:
            name: variable name for pointer
            roffset: should rn_offset be included in offsets=..., for use with tl.advance()

        Returns:
            "tl.make_block_ptr(...)"
        r   rÎ  r²  rÏ  rÐ  rÑ  zorder=zoffsets=ztl.make_block_ptr(r±  )rU   rà   r¹  rU  r�  rB  rä   rR  rP  rD  r7  )r%  rã   rˆ  rÒ  rU  rÖ   r±   s          r‘   rÓ  zBlockPtrOptions.format  sô   € ô �H‰H×!Ñ!ˆØ!�D—L‘L�/ˆÙØBIÖJ¸�t×+Ñ+¨FÕ3ÐJˆGÐJð ×'Ñ'¨1Ò,ð �&˜™Q˜t×3Ñ3Ó4Ð5°QÑ7àà‘Q�t—z‘z“]�OÐ$Ø‘q˜Ÿ™“Ð'Ð(Ø™1˜T×-Ñ-Ó.Ð/Ð0Ø‘Q�t—z‘z“]�OÐ$Ø‘q˜“z�lÐ#ð
ˆð $ D§I¡I¨d£OÐ#4°AÐ6Ð6ùò Ks   ¯C"c           	     óâ   — t         j                  |   }| j                  D �cg c]A  }| j                  |||«      | j                  |t        j
                  j                  |«      z
  ‘ŒC }}|S c c}w )av  
        Codegen string to pass to tl.advance(name, ...).

        Advance is the difference between offsets in each loop iteration.
        To compute it, we replace rN_offset with multiples of RN_BLOCK.
        Since we expect rN_offset to vary in range(0, rN_numel, RN_BLOCK), the first
        iteration has rN_offset=0, while the second has rN_offset=RN_BLOCK.
        )rÕ   r  rU  r‰  r–   rn  r“  )r%  r  ÚrblockrÖ   Úadvances        r‘   Úadvance_roffsetzBlockPtrOptions.advance_roffset;  st   € ô ×*Ñ*¨4Ñ0ˆð Ÿ,™,ö
ð
 ð ×#Ñ# F¨F°DÓ9Ø×%Ñ% f¬e¯g©g¯l©l¸DÓAóBð
ˆð 
ð ˆùò
s   ¢AA,NrÉ  rÊ  rÔ  rÕ  )r  r!   r´   rµ   )r¾   rÇ   rÈ   r‰  r�  rÓ  rÞ  r�   r“   r‘   r×  r×    s6   „ ð8Øð8Ø-7ð8Ø?Cð8à	ó8óô
7ô:r“   r×  c                óŠ   — | D �cg c]3  }t        |t        «      r|nt        j                  j	                  |«      ‘Œ5 c}S c c}w )zËFormat mixed symbolic and pre-rendered Triton shape dimensions.

    Nested-reduction codegen builds reshape/broadcast shapes from both sympy
    expressions and already-rendered block-size strings.
    )r•   rð   rU   rà   r¹  ©rä   rz  s     r‘   r¦  r¦  O  s@   € ð PUöØHKŒz˜#œsÔ#‰¬¯©×)>Ñ)>¸sÓ)CÑCòð ùò s   …8A c                ó>   — ddj                  t        | «      «      › d�S ©Nú[r±  ú])r7  r¦  ©rä   s    r‘   Útriton_shape_strræ  Z  s!   € Øˆt�y‰yÔ*¨5Ó1Ó2Ð3°1Ð5Ð5r“   c                óÚ  — t        |t        «      rt        |t        «      sJ ‚t        |«      }t        |«      }||k(  r| S |D �cg c]
  }|dk7  sŒ	|‘Œ c}|k7  rd| › ddj                  |«      › d�S d}g }|D ]G  }|t	        |«      k  r|||   k(  r|j                  d«       |dz  }Œ0|dk(  sJ ‚|j                  d	«       ŒI |t	        |«      k(  sJ ‚| › d
dj                  |«      › d�S c c}w )z<Workaround https://github.com/triton-lang/triton/issues/2836rÞ   útl.reshape(ú, [r±  z])r   ú:rW   rÆ   rã  rä  )r•   rt  r¦  r7  rš   Úappend)	r§  r¨  r©  Úold_shape_strÚnew_shape_strÚsr˜  ÚexpandÚsizes	            r‘   r¥  r¥  ^  s  € ô �i¤Ô&¬:°iÄÔ+FÐFÐFä% iÓ0€MÜ% iÓ0€Mà˜Ò%ØˆØ Ö-ˆa A¨£HŠÒ-°Ò>Ø˜U˜G 3 t§y¡y°Ó'?Ð&@ÀÐCÐCà
€CØ€FØò "ˆØ”�]Ó#Ò#¨°¸cÑ0BÒ(BØ�M‰M˜#ÔØ�1‰H‰Cà˜3’;Ð�;Ø�M‰M˜&Õ!ð"ð ”#�mÓ$Ò$Ð$Ð$ØˆW�A�d—i‘i Ó'Ð(¨Ð*Ð*ùò .s   Á
C(ÁC(c                  ó  — e Zd Zd"d„Zd"d„Zed#d„«       Zd"d„Zd"d„Zd"d„Z	d"d„Z
d"d„Zd"d	„Zd"d
„Zd"d„Zd"d„Zd"d„Zd"d„Zd"d„Zd"d„Zd$d„Zd"d„Zd"d„Zd"d„Zd"d„Zd"d„Zd"d„Zd"d„Zd"d„Zd"d„Zd"d„Zd"d„Zd"d„Z d"d„Z!d"d„Z"d"d „Z#y!)%ÚTritonPrinterc                ó°   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › dt        j                  j
                  › d�S )NrW   úlibdevice.trunc(r   ú).to(r²  ©rš   r±   Ú_printrU   rà   Úindex_dtype©r%  r�   s     r‘   Ú_print_TruncToIntzTritonPrinter._print_TruncToInt€  óO   € Ü�4—9‘9‹~ Ò"Ð"Ð"ð ˜tŸ{™{¨4¯9©9°Q©<Ó8Ð9¸¼q¿x¹x×?SÑ?SÐ>TÐTUÐVð	
r“   c                ó„   — t        |j                  «      dk(  sJ ‚| j                  |j                  d   «      }d|› d|› d�S )NrW   r   z(libdevice.trunc(z) + tl.zeros_like(ú))©rš   r±   r÷  )r%  r�   r§  s      r‘   Ú_print_TruncToFloatz!TritonPrinter._print_TruncToFloat‡  sF   € Ü�4—9‘9‹~ Ò"Ð"Ð"à—‘˜DŸI™I a™LÓ)ˆð # 5 'Ð);¸E¸7À"ÐEÐEr“   c                 óL   — t        t        j                  j                  «      syy)zÇReturn the Triton float type for scalar shape math.

        Uses tl.float64 by default but falls back to tl.float32 on devices
        that lack fp64 support (e.g. Intel Arc consumer GPUs).
        ú
tl.float32ú
tl.float64)rD   rU   ra  Úcurrent_devicer�   r“   r‘   Ú_get_scalar_float_typez$TritonPrinter._get_scalar_float_type�  s   € ô $¤A§G¡G×$:Ñ$:Ô;ØØr“   c                óâ   — |j                   rt        t        |«      «      }|S t        j                  «       rt
        j                  j                  r|› }|S | j                  «       }d|› d|› d�}|S )Nútl.full([], r±  r²  )	r™   rð   Úintr$   Ú	is_fbcoder¿   ÚversionÚhipr  )r%  r�   ÚretÚ
float_types       r‘   Ú_print_FloatzTritonPrinter._print_Float›  sp   € Ø�?Š?ô ”c˜$“i“.ˆCð ˆ
ô ×ÑÔ¤E§M¡M×$5Ò$5Ø�FˆCð ˆ
ð ×4Ñ4Ó6ˆJØ    b¨¨°AÐ6ˆCØˆ
r“   c                ó¸   — t        |j                  «      dk(  sJ ‚| j                  |j                  d   t        d   dz
  «      }| j	                  «       }|› d|› d�S )NrW   r   ÚAtomç      à?ú.to(r²  )rš   r±   Úparenthesizer   r  )r%  r�   rî  r  s       r‘   Ú_print_ToFloatzTritonPrinter._print_ToFloat¨  s]   € Ü�4—9‘9‹~ Ò"Ð"Ð"à×Ñ˜dŸi™i¨™l¬J°vÑ,>ÀÑ,DÓEˆØ×0Ñ0Ó2ˆ
Ø��D˜˜ AÐ&Ð&r“   c                óô   — |j                   \  }}|j                  r3|j                  r'| j                  |j                   dt        d   dz
  «      S | j	                  |«      }| j	                  |«      }d|› d|› d�S )Nú % r  r  z!triton_helpers.remainder_integer(r±  r²  )r±   Úis_nonnegativeÚ	stringifyr   r÷  ©r%  r�   ÚquotÚdivÚquot_sÚdiv_ss         r‘   Ú_print_PythonModzTritonPrinter._print_PythonMod¯  sr   € Ø—I‘I‰	ˆˆcØ×Ò 3×#5Ò#5Ø—>‘> $§)¡)¨U´J¸vÑ4FÈÑ4LÓMÐMà—‘˜TÓ"ˆà—‘˜CÓ ˆØ2°6°(¸"¸U¸GÀ1ÐEÐEr“   c                ó  — |j                   sJ ‚|j                  \  }}|j                  r3|j                  r'| j                  |j                  dt        d   dz
  «      S | j                  |«      }| j                  |«      }d|› d|› d�S )Nú // r  r  z!triton_helpers.div_floor_integer(z,  r²  )r™   r±   r  r  r   r÷  r  s         r‘   Ú_print_FloorDivzTritonPrinter._print_FloorDiv¹  s~   € Ø�ŠÐˆØ—I‘I‰	ˆˆcØ×Ò 3×#5Ò#5Ø—>‘> $§)¡)¨V´ZÀÑ5GÈ#Ñ5MÓNÐNà—‘˜TÓ"ˆà—‘˜CÓ ˆØ2°6°(¸#¸e¸WÀAÐFÐFr“   c                óP   — | j                  |j                  dt        d   dz
  «      S )Nú / r  r  )r  r±   r   rù  s     r‘   Ú_print_IntTrueDivzTritonPrinter._print_IntTrueDivÆ  s#   € Ø�~‰~˜dŸi™i¨´
¸6Ñ0BÀSÑ0HÓIÐIr“   c                ó°   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › dt        j                  j
                  › d�S ©NrW   úlibdevice.floor(r   rõ  r²  rö  rù  s     r‘   Ú_print_floorzTritonPrinter._print_floorË  rû  r“   c                ó°   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › dt        j                  j
                  › d�S r%  rö  rù  s     r‘   Ú_print_FloorToIntzTritonPrinter._print_FloorToIntÒ  rû  r“   c                ó°   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › dt        j                  j
                  › d�S ©NrW   úlibdevice.ceil(r   rõ  r²  rö  rù  s     r‘   Ú_print_ceilingzTritonPrinter._print_ceilingÙ  óK   € Ü�4—9‘9‹~ Ò"Ð"Ð"à  §¡¨T¯Y©Y°q©\Ó!:Ð ;¸5ÄÇÁ×AUÑAUÐ@VÐVWÐXÐXr“   c                ó°   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › dt        j                  j
                  › d�S r+  rö  rù  s     r‘   Ú_print_CeilToIntzTritonPrinter._print_CeilToIntÞ  r.  r“   c                ó,   — d| j                  |«      › d�S )Nztl.sqrt_rn((ú).to(tl.float32)))r÷  rù  s     r‘   Ú_helper_sqrtzTritonPrinter._helper_sqrtã  s   € à˜dŸk™k¨$Ó/Ð0Ð0AÐBÐBr“   c           	     ó¸   — | j                  |j                  d   «      }| j                  |j                  d   «      }| j                  «       }d|› d|› d|› d|› d�	S )Nr   rW   zlibdevice.pow((rõ  z), (rý  )r÷  r±   r  )r%  r�   ÚbaseÚexpr  s        r‘   Ú_print_FloatPowzTritonPrinter._print_FloatPowç  s`   € à�{‰{˜4Ÿ9™9 Q™<Ó(ˆà�k‰k˜$Ÿ)™) A™,Ó'ˆð ×0Ñ0Ó2ˆ
Ø    e¨J¨<°t¸C¸5ÀÀjÀ\ÐQSÐTÐTr“   c                ó|  — | j                  «       }|j                  d   j                  r dt        |j                  d   «      › d|› d�}n%d| j	                  |j                  d   «      › d|› d�}|j                  d   }|j                  rdt        |«      › d|› d�}nd| j	                  |«      › d|› d�}d|› d|› d�S )	Nr   r  r±  r²  ú(rõ  rW   úlibdevice.pow()r  r±   Ú
is_IntegerÚfloatr÷  )r%  r�   r  r5  Úexp_valr6  s         r‘   Ú_print_PowByNaturalz!TritonPrinter._print_PowByNaturalò  sÑ   € Ø×0Ñ0Ó2ˆ
Ø�9‰9�Q‰<×"Ò"Ø!¤%¨¯	©	°!©Ó"5Ð!6°b¸¸ÀAÐF‰Dð �t—{‘{ 4§9¡9¨Q¡<Ó0Ð1°°z°lÀ!ÐDˆDØ—)‘)˜A‘,ˆØ×ÒØ ¤ w£Ð 0°°:°,¸aÐ@‰Cð �d—k‘k 'Ó*Ð+¨5°°¸AÐ>ˆCð   ˜v R¨ u¨AÐ.Ð.r“   c                óÎ   — | j                  |j                  d   «      }| j                  |j                  d   «      }| j                  |j                  d   «      }d|› d|› d|› d�S )Nr   rW   r#   ú	tl.where(r±  r²  )Údoprintr±   )r%  r�   ÚcÚpÚqs        r‘   Ú_print_WherezTritonPrinter._print_Where  s_   € Ø�L‰L˜Ÿ™ 1™Ó&ˆØ�L‰L˜Ÿ™ 1™Ó&ˆØ�L‰L˜Ÿ™ 1™Ó&ˆØ˜1˜#˜R ˜s " Q C qÐ)Ð)r“   c                óº  — t        |j                  «      dk(  r| j                  |j                  d   «      S t        |j                  «      dz  }t        |«      }| j                   ||j                  d| Ž «      }| j                   ||j                  |d Ž «      }t	        d„ ||fD «       «      \  }}|dv sJ d|› d�«       ‚d	|› d
|› d|› d|› d|› d
|› d|› d|› d�S )zI
        Helper for max/min code generation.
        cmp: > or <
        rW   r   r#   Nc              3  ó(   K  — | ]
  }d |› d�–— Œ y­w)r9  r²  Nr�   ©rª   r]  s     r‘   r­   z6TritonPrinter._print_min_max_helper.<locals>.<genexpr>  s   è ø€ Ò. !�q˜˜˜1”XÑ.ùs   ‚)ú>ú<zUnexpected comparator: 'ú'r9  z * (ú z= z) + rý  )rš   r±   r÷  Útyper²   )r%  r�   ÚcmpÚmidrÂ   ÚaÚbs          r‘   Ú_print_min_max_helperz#TritonPrinter._print_min_max_helper
  sð   € ô
 ˆt�y‰y‹>˜QÒà—;‘;˜tŸy™y¨™|Ó,Ð,ä�$—)‘)‹n Ñ!ˆÜ�4‹jˆà�K‰K™˜TŸY™Y t¨˜_Ð-Ó.ˆà�K‰K™˜TŸY™Y s t˜_Ð-Ó.ˆô Ñ.¨¨1 vÔ.Ó.‰ˆˆ1Ø�jÑ ÐCÐ$<¸S¸EÀÐ"CÓCÐ Ø�1�#�T˜!˜˜A˜c˜U " Q C t¨A¨3¨d°1°#°Q°s°e¸1¸Q¸C¸rÐBÐBr“   c                ó&   — | j                  |d«      S )NrJ  ©rR  rù  s     r‘   Ú
_print_MinzTritonPrinter._print_Min   ó   € Ø×)Ñ)¨$°Ó4Ð4r“   c                ó&   — | j                  |d«      S )NrI  rT  rù  s     r‘   Ú
_print_MaxzTritonPrinter._print_Max#  rV  r“   c                óz   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › d�S )NrW   útl_math.abs(r   r²  rþ  rù  s     r‘   Ú
_print_AbszTritonPrinter._print_Abs&  s9   € Ü�4—9‘9‹~ Ò"Ð"Ð"à˜dŸk™k¨$¯)©)°A©,Ó7Ð8¸Ð:Ð:r“   c                óz   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › d�S )NrW   zlibdevice.cos((r   r2  rþ  rù  s     r‘   Ú_print_OpaqueUnaryFn_cosz&TritonPrinter._print_OpaqueUnaryFn_cos+  ó:   € Ü�4—9‘9‹~ Ò"Ð"Ð"à  §¡¨T¯Y©Y°q©\Ó!:Ð ;Ð;LÐMÐMr“   c                óz   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › d�S )NrW   zlibdevice.cosh((r   r2  rþ  rù  s     r‘   Ú_print_OpaqueUnaryFn_coshz'TritonPrinter._print_OpaqueUnaryFn_cosh0  ó:   € Ü�4—9‘9‹~ Ò"Ð"Ð"à! $§+¡+¨d¯i©i¸©lÓ";Ð!<Ð<MÐNÐNr“   c                óz   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › d�S )NrW   zlibdevice.acos((r   r2  rþ  rù  s     r‘   Ú_print_OpaqueUnaryFn_acosz'TritonPrinter._print_OpaqueUnaryFn_acos5  ra  r“   c                óz   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › d�S )NrW   zlibdevice.sin((r   r2  rþ  rù  s     r‘   Ú_print_OpaqueUnaryFn_sinz&TritonPrinter._print_OpaqueUnaryFn_sin:  r^  r“   c                óz   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › d�S )NrW   zlibdevice.sinh((r   r2  rþ  rù  s     r‘   Ú_print_OpaqueUnaryFn_sinhz'TritonPrinter._print_OpaqueUnaryFn_sinh?  ra  r“   c                óz   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › d�S )NrW   zlibdevice.asin((r   r2  rþ  rù  s     r‘   Ú_print_OpaqueUnaryFn_asinz'TritonPrinter._print_OpaqueUnaryFn_asinD  ra  r“   c                óz   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › d�S )NrW   zlibdevice.tan((r   r2  rþ  rù  s     r‘   Ú_print_OpaqueUnaryFn_tanz&TritonPrinter._print_OpaqueUnaryFn_tanI  r^  r“   c                óz   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › d�S )NrW   zlibdevice.tanh((r   r2  rþ  rù  s     r‘   Ú_print_OpaqueUnaryFn_tanhz'TritonPrinter._print_OpaqueUnaryFn_tanhN  ra  r“   c                óz   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › d�S )NrW   zlibdevice.atan((r   r2  rþ  rù  s     r‘   Ú_print_OpaqueUnaryFn_atanz'TritonPrinter._print_OpaqueUnaryFn_atanS  ra  r“   c                óz   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › d�S )NrW   zlibdevice.log2((r   r2  rþ  rù  s     r‘   Ú_print_OpaqueUnaryFn_log2z'TritonPrinter._print_OpaqueUnaryFn_log2X  ra  r“   c                ó°   — t        |j                  «      dk(  sJ ‚d| j                  |j                  d   «      › dt        j                  j
                  › d�S )NrW   zlibdevice.llrint(r   rõ  r²  rö  rù  s     r‘   Ú_print_RoundToIntzTritonPrinter._print_RoundToInt]  sO   € Ü�4—9‘9‹~ Ò"Ð"Ð"ð   §¡¨D¯I©I°a©LÓ 9Ð:¸%ÄÇÁ×@TÑ@TÐ?UÐUVÐWð	
r“   c                óâ   — t        |j                  «      dk(  sJ ‚|j                  \  }}|j                  r|dk  sJ ‚t        d|› d�«      ‚| j	                  |t
        d   «      }d|› d|› d| › �S )	Nr#   r   zOFor integer inputs, only non-negative ndigits are currently supported, but got r‹   ÚMulzlibdevice.nearbyint(1eú * z) * 1e)rš   r±   r™   Ú
ValueErrorr  r   )r%  r�   ÚnumberÚndigitsÚ
number_strs        r‘   Ú_print_RoundDecimalz!TritonPrinter._print_RoundDecimald  sŠ   € Ü�4—9‘9‹~ Ò"Ð"Ð"ØŸ)™)‰ˆ�Ø×Òà˜Q’;Ð�;ÜØaÐbiÐajÐjkÐlóð ð ×&Ñ& v¬z¸%Ñ/@ÓAˆ
Ø'¨ y°°J°<¸vÀwÀhÀZÐPÐPr“   N)r�   rµ   r´   rð   r<  )r�   rµ   rN  rð   r´   rð   )$r¾   rÇ   rÈ   rú  rÿ  Ústaticmethodr  r  r  r  r   r#  r'  r)  r-  r0  r3  r7  r>  rE  rR  rU  rX  r[  r]  r`  rc  re  rg  ri  rk  rm  ro  rq  rs  r{  r�   r“   r‘   rò  rò    sÅ   „ ó
óFð òó ðóó'óFó	GóJó

ó
óYó
Yó
Có	Uó/ó$*óCó,5ó5ó;ó
Nó
Oó
Oó
Nó
Oó
Oó
Nó
Oó
Oó
Oó

ôQr“   rò  c                ó*   — t        t        | «      «      S )zCConvert torch.dtype to triton type and upcast [b]float16 to float32)rO   rQ   ©r·   s    r‘   Útriton_compute_typer  u  s   € äÔ*¨5Ó1Ó2Ð2r“   c                ó^   — | t         j                  k(  rt         j                  } t        | «      S )z@Convert torch.dtype to triton type, with fix for storing tl.bool)r¿   r£   Úint8rO   r~  s    r‘   Útriton_store_typer‚  z  s"   € à”—
‘
ÒÜ—
‘
ˆÜ�uÓÐr“   c                ó„   — t        | «      r+| j                  r| j                  dk  rt        j                  S t        | «      S )z0Implicit upcasts used for Triton reduction typesé   )r   Ú	is_signedÚitemsizer¿   Úint32rQ   r~  s    r‘   Úupcast_acc_dtyperˆ  �  s0   € ä˜Ô 5§?¢?°u·~±~ÈÒ7JÜ�{‰{ÐÜ˜uÓ%Ð%r“   c                ó*   — t        t        | «      «      S )z:Convert torch.dtype to triton type, with reduction upcasts)r  rˆ  r~  s    r‘   Útriton_acc_typerŠ  ˆ  s   € äÔ/°Ó6Ó7Ð7r“   c                ó<   — | j                   dk  xr | j                  S )Nr#   )r†  r¶   r~  s    r‘   Úlow_precision_fprŒ  �  s   € Ø�>‰>˜QÑÒ: 5×#:Ñ#:Ð:r“   c                óŠ   — t        | t        «      sy| j                  }t        |t        j                  «      rt	        |«      S dS rœ  )r•   r]   r·   r¿   rŒ  )rô   r·   s     r‘   Úlow_precision_fp_varrŽ  ‘  s6   € Ü�cœ;Ô'Øà�I‰I€EÜ&0°¼¿¹Ô&DÔ˜EÓ"ÐOÈ%ÐOr“   c                ó¬   — t        | t        «      r| j                  S t        | t        j                  j
                  «      rt        t        | «      «      S y r©   )r•   r]   r·   r¿   Ú_prims_commonÚNumberr   rM  ©r«   s    r‘   Útriton_arg_dtyper“  ™  s>   € Ü�#”{Ô#Ø�y‰yÐÜ�#”u×*Ñ*×1Ñ1Ô2ÜœT #›YÓ'Ð'Ør“   c                ó¸   — t         j                  j                   xr> t        | t        «      xr, | j
                  t        j                  t        j                  fv S r©   )	r$   rÒ   Úcodegen_upcast_to_fp32r•   r]   r·   r¿   Úfloat16Úbfloat16r’  s    r‘   Úneeds_upcast_to_float32r˜  ¡  sD   € ä�M‰M×0Ñ0Ð0ò 	9Ü�sœKÓ(ò	9à�I‰Iœ%Ÿ-™-¬¯©Ð8Ð8ðr“   c                  ó<   ‡ — e Zd Z	 d	 	 	 	 	 	 	 	 	 dˆ fd„Zd„ Zˆ xZS )ÚTritonCSEVariablec                ón   •— t         ‰| �  ||||¬«       t        «       | _        |€J d«       ‚|€J d«       ‚y )Nrå  z!TritonCSEVariable must have dtypez!TritonCSEVariable must have shape)ÚsuperÚ__init__r   r  )r%  rã   Úboundsr·   rä   Ú	__class__s        €r‘   r�  zTritonCSEVariable.__init__ª  sH   ø€ ô 	‰Ñ˜˜v u°EÐÔ:ä*4«,ˆŒØÐ ÐEÐ"EÓEÐ ØÐ ÐEÐ"EÓEÑ r“   c                ó:  — |D ]–  }t        |t        «      r&| j                  j                  |j                  «       Œ9t        |t        j
                  «      sŒTt        j                  t        j                  |«      x}	 €Œ|| j                  j                  |«       Œ˜ y r©   )r•   rš  r  Úupdater–   r  rÕ   r  rU   rà   ri  )r%  rã   r±   Úkwargsr«   r  s         r‘   Úupdate_on_argsz TritonCSEVariable.update_on_args·  sw   € Øò 
	2ˆCÜ˜#Ô0Ô1Ø—‘×%Ñ% c§m¡mÕ4Ü˜C¤§¡Õ.ô
 "/×!CÑ!CÄAÇHÁHÈcÓ!RÐR�IØñð —N‘N×&Ñ& yÕ1ñ
	2r“   r©   )
rã   rð   rž  zValueRanges[Any]r·   útorch.dtyperä   r}   r´   rÆ   )r¾   rÇ   rÈ   r�  r£  Ú__classcell__©rŸ  s   @r‘   rš  rš  ©  sH   ø„ ð !%ðFàðFð !ðFð ð	Fð
 ðFð 
õFö2r“   rš  c                 ó   — ddl m}   | «       S )Nr   ry   )Ú!torch._inductor.dtype_propagationrz   ry   s    r‘   Úget_dtype_handlerr©  Å  s   € ÝLá%Ó'Ð'r“   Tc                ó    ‡ ‡— dd„Šdˆ ˆfd„}|S )z“
    Codegen helper to upcast arguments to float32, depending on the config and dtype.
    This decorates tl.math/libdevice codegen functions.
    c                ó,   — t        | «      rdnd}| › |› �S )Nú.to(tl.float32)rÍ   ©r˜  )rô   Úupcast_strings     r‘   Úmaybe_upcast_argz.maybe_upcast_float32.<locals>.maybe_upcast_argÑ  s    € Ü-DÀSÔ-IÑ)ÈrˆØ��}�oÐ&Ð&r“   c                óF   •‡ — t         j                  ‰ ‰«       dˆˆ ˆfd„}|S )Nc                 óÄ  •— | D �cg c]
  } ‰|«      ‘Œ }}|j                  «       D ��ci c]  \  }}| ‰|«      “Œ }}} ‰|i |¤Ž}‰xr4 t        d„ t        j                  | |j	                  «       «      D «       «      }|sd n# t        t        «       ‰j                  «      | i |¤Ž}	|	t        j                  d fv}
|
r|	�dt        |	«      › d�nd}|› |› �S c c}w c c}}w )Nc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr©   r­  ©rª   rô   s     r‘   r­   zKmaybe_upcast_float32.<locals>.decorator.<locals>.wrapped.<locals>.<genexpr>à  s   è ø€ ò 6àô (¨×,ñ6ùó   ‚r  r²  rÍ   )Úitemsr…   Ú	itertoolsÚchainÚvaluesr¤   r©  r¾   r¿   rÀ   rO   )r±   r¢  r«   Úupcast_argsÚkeyÚvalÚupcast_kwargsr�  Úany_needs_upcastÚresult_dtypeÚneeds_downcastÚdowncast_stringrÃ   r°   r¯  s               €€€r‘   Úwrappedz8maybe_upcast_float32.<locals>.decorator.<locals>.wrappedÙ  s  ø€ à<@ÖA°SÑ+¨CÕ0ÐAˆKÐAØHNÏÉË×W¹H¸CÀ˜SÑ"2°3Ó"7Ñ7ÐWˆMÑWñ ˜;Ð8¨-Ñ8ˆFØ-ò  ´#ñ 6ä$Ÿ?™?¨4°·±³ÓAô6ó 3Ðñ (ñ à@”WÔ.Ó0°$·-±-Ó@À$ÐQÈ&ÑQð ð
 *´%·-±-ÀÐ1FÐFˆNñ " lÐ&>ð ”{ <Ó0Ð1°Ñ3àð ð
 �X˜oÐ.Ð/Ð/ùò) BùÛWs
   †CªCr<  )rº   rÅ   )r°   rÁ  rÃ   r¯  s   ` €€r‘   Ú	decoratorz'maybe_upcast_float32.<locals>.decoratorÕ  s   ù€ ä×&Ñ& t¨^Ô<÷	0ð0 ˆr“   r<  )r°   úCallable[..., Any]r´   rÃ  r�   )rÃ   rÂ  r¯  s   ` @r‘   Úmaybe_upcast_float32rÄ  Ë  s   ù€ ó'öð< Ðr“   c                  ó~  — e Zd ZdZ ej
                  ej                  «      Ze	 	 dY	 	 	 dZd„«       Z	ed[d„«       Z
ed„ «       Zed„ «       Zed„ «       Zed\d	„«       Ze e«       d
„ «       «       Zed„ «       Zed„ «       Zed„ «       Ze e«       d„ «       «       Ze e«       d„ «       «       Ze e«       d„ «       «       Ze e«       d„ «       «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zedej>                  ddddœd„«       Z e e«       d„ «       «       Z!e e«       d„ «       «       Z"ed„ «       Z#ed„ «       Z$ed„ «       Z%e e«       d„ «       «       Z&e e«       d „ «       «       Z'e e«       d!„ «       «       Z(e e«       d"„ «       «       Z)e e«       d#„ «       «       Z*e e«       d$„ «       «       Z+e e«       d%„ «       «       Z,e e«       d&„ «       «       Z-e e«       d'„ «       «       Z.ed]d(„«       Z/ed^d)„«       Z0ed_d*„«       Z1ed+„ «       Z2e e«       d,„ «       «       Z3e e«       d-„ «       «       Z4e e«       d.„ «       «       Z5e e«       d/„ «       «       Z6e e«       d0„ «       «       Z7e e«       d1„ «       «       Z8e e«       d2„ «       «       Zed3„ «       Z9e e«       d4„ «       «       Z:ed5„ «       Z;ed6„ «       Z<ed7„ «       Z=ed8„ «       Z>ed9„ «       Z?ed:„ «       Z@ed;„ «       ZAed<„ «       ZBed=„ «       ZCed>„ «       ZDed?„ «       ZEed@„ «       ZFedA„ «       ZGedB„ «       ZHedC„ «       ZIedD„ «       ZJe e«       dE„ «       «       ZKe e«       dF„ «       «       ZLe e«       dG„ «       «       ZMe e«       dH„ «       «       ZNe e«       dI„ «       «       ZOedJ„ «       ZPe e«       dK„ «       «       ZQedL„ «       ZRe e«       dM„ «       «       ZSe edN¬O«      dP„ «       «       ZTe edN¬O«      dQ„ «       «       ZUe e«       dR„ «       «       ZVe e«       dS„ «       «       ZWedT„ «       ZXedU„ «       ZYe e«       dV„ «       «       ZZedW„ «       Z[e e«       dX„ «       «       Z\y)`ÚTritonOverrideszEMap element-wise ops to Triton e.g., ops.to_dtype(x,...) -> x.to(...)NTc                ó>  ‡— t         j                  t         j                  fŠ	 	 	 	 	 	 d	ˆfd„}|�>t         |||«      t        j
                  j                  «      t        j
                  _        |�!t        |«      rd| › d�} t         j                  }|t         j                  k(  rd| › d�S |t         j                  k(  r|�|j                  s|€| › d�S |rt        |«      }nt        |«      }|�*|‰v r&|t         j                  k(  st        |«      r| › d|› d�S | › d|› d�S )
Nc                óÖ   •— | |k(  ry| ‰v r|‰v r| |k7  rJ d«       ‚| t         j                  k(  s|t         j                  k(  ry| t         j                  k(  s|t         j                  k(  ryy)Nr   zCConversions between float8_e5m2 and float8_e4m3fn is not supported!r„  r#   )r¿   Úfloat8_e5m2Úfloat8_e4m3fn)Ú	src_dtypeÚ	dst_dtypeÚ
fp8_dtypess     €r‘   Ú_get_min_elements_per_threadz>TritonOverrides.to_dtype.<locals>._get_min_elements_per_thread  s‚   ø€ ð ˜IÒ%àð ˜ZÑ'Ø Ñ+Ø Ò*ðUð Uó	Uð ð
 œE×-Ñ-Ò-°¼e×>OÑ>OÒ1OØØœE×/Ñ/Ò/°9Ä×@SÑ@SÒ3SØàr“   z$triton_helpers.fp8e4m3fn_to_float32(r²  r9  z != 0)z.to(tl.int16).to(tl.uint8)z.to(tl.float32).to(r  )rË  r¤  rÌ  r¤  r´   r  )r¿   rÊ  rÉ  r†   rU   rà   Úmin_elem_per_threadrv   rÀ   r£   Úuint8r¶   r  r‚  r   )r]  r·   rË  Úuse_compute_typesrÎ  Ú	out_dtyperÍ  s         @r‘   Úto_dtypezTritonOverrides.to_dtypeû  sD  ø€ ô ×ÑÜ×Ñð
ˆ
ð
	Ø"ð	Ø/:ð	àõ	ð. Ð ô ,/Ù,¨Y¸Ó>Ü—‘×,Ñ,ó,ŒA�H‰HÔ(ð
 Ð Ô%TØô&
ð 7°q°c¸Ð;ˆAÜŸ™ˆIà”E—J‘JÒØ�q�c˜�=Ð Ø”e—k‘kÒ!ØÐ! i×&AÒ&AÀYÐEVð �SÐ2Ð3Ð3áÜ+¨EÓ2‰Iä)¨%Ó0ˆIð Ð!Ø˜Ñ#ØœeŸj™jÒ(Ô,<¸YÔ,Gà�SÐ+¨I¨;°aÐ8Ð8à��D˜˜ 1Ð%Ð%r“   c                óî   — |j                   |j                   k(  sJ ‚| j                  |k7  r| › dt        |«      › d�} | › dt        |«      › d�}t        |«      |k7  r|› dt        t        |«      «      › d�}|S )Nr  r²  ú, bitcast=True))r†  r·   rO   rQ   )r]  r·   rË  Úouts       r‘   Úto_dtype_bitcastz TritonOverrides.to_dtype_bitcastF  sˆ   € à×!Ñ! U§^¡^Ò3Ð3Ð3ð �7‰7�iÒØ�#�Tœ+ iÓ0Ð1°Ð3ˆAà��4œ EÓ*Ð+¨?Ð;ˆÜ˜uÓ%¨Ò.Ø�E˜œkÔ*=¸eÓ*DÓEÐFÀaÐHˆCàˆ
r“   c           	     óT  — t         j                  j                  |«      }t         || «      «      }t	        |«      }| dk(  r5t        j                  d| «      dk  r|dk(  r	d|› d|› d�S |dk(  r	d|› d|› d�S | dk  r#|j                  sd	|d
d  › �}d|› d|› d|› d|› d�	S d|› d|› d|› d�S )Nr   g      ð?r  útl.full(z, 0x80000000, tl.uint32).to(rÕ  r  z$, 0x8000000000000000, tl.uint64).to(ztl.r„  r±  rõ  r²  )r¿   r�  Údtype_to_typeri   r  ÚmathÚcopysignr…  )r§  r·   rä   Útype_Ú
triton_valrO   Útriton_signed_types          r‘   Ú_shaped_constantz TritonOverrides._shaped_constantW  së   € ä×#Ñ#×1Ñ1°%Ó8ˆÜ"¡5¨£<Ó0ˆ
Ü)¨%Ó0ˆð �AŠ:œ$Ÿ-™-¨¨UÓ3°aÒ7Ø˜lÒ*Ø! % Ð(DÀ[ÀMÐQ`ÐaÐaØ Ò,Ø! % Ð(LÈ[ÈMÐYhÐiÐið
 �1Š9˜UŸ_š_Ø#& {°1°2 Ð&7Ð!8ÐØ˜e˜W B z l°"Ð5GÐ4HÈÈkÈ]ÐZ[Ð\Ð\à˜e˜W B z l°"°[°MÀÐCÐCr“   c                ó*   — | j                  ||g ¬«      S )Nrå  )rà  )rÂ   r§  r·   s      r‘   ÚconstantzTritonOverrides.constantn  s   € à×#Ñ# E¨5¸Ð#Ó;Ð;r“   c                óî   — t        | t        «      r_| |k(  rZ| j                  �N| j                  j                  r8dt        j                  | «      › dt        j                  | «      › d�}d|› d| › d�S | › d|› �S )Nr9  ú | r²  r@  r±  z * 0.0, 0.0)z - )r•   r]   r·   r¶   rÆ  ÚisnanÚisinf)r]  ÚyÚ
non_finites      r‘   ÚsubzTritonOverrides.subr  s�   € ô �qœ+Ô&Ø�Q’Ø—‘Ð#Ø—‘×)Ò)ð
 œ_×2Ñ2°1Ó5Ð6°c¼/×:OÑ:OÐPQÓ:RÐ9SÐSTÐUˆJØ˜z˜l¨"¨Q¨C¨|Ð<Ð<Ø��C˜�sˆ|Ðr“   c                ó´   — t        |t        j                  j                  «      r| j	                  ||«      S t        |«      |k(  r|› S d|› dt        |«      › d�S )Nr9  rõ  r²  )r•   r¿   r�  r‘  râ  r“  rO   )rÂ   r«   r·   s      r‘   Ú_cast_libdevice_argz#TritonOverrides._cast_libdevice_arg�  sX   € ä�cœ5×.Ñ.×5Ñ5Ô6Ø—<‘<  UÓ+Ð+Ü˜CÓ  EÒ)Ø�UˆOØ�3�%�uœ[¨Ó/Ð0°Ð2Ð2r“   c                ó   — d| › d�S )NrZ  r²  r�   ©r]  s    r‘   ÚabszTritonOverrides.abs‰  ó   € ð ˜a˜S Ð"Ð"r“   c                ó¦  — t        | dd «      }t        |dd «      }|t        j                  k(  r7|t        j                  k(  r$t        j                  j
                  r
d| › d|› d�}n	d| › d|› d�}t        | «      st        |«      rMt        «       j                  | |«      }|t        j                  t        j                  fv r|› dt        |«      › d�}|S )Nr·   útriton.language.div_rn(r±  r²  r9  r"  r  )r¤   r¿   rÀ   r$   Úeager_numericsÚdivision_roundingrŽ  r©  Útruedivr–  rO   ©r]  rç  Úx_dtypeÚy_dtyperÖ  rÒ  s         r‘   rô  zTritonOverrides.truediv’  sÇ   € ä˜!˜W dÓ+ˆÜ˜!˜W dÓ+ˆð ”u—}‘}Ò$Øœ5Ÿ=™=Ò(Ü×%Ñ%×7Ò7ð ,¨A¨3¨b°°°1Ð5‰Cà�a�S˜˜A˜3˜a�.ˆCä Ô"Ô&:¸1Ô&=Ü)Ó+×3Ñ3°A°qÓ9ˆIØœUŸ]™]¬E¯M©MÐ:Ñ:Ø˜˜T¤+¨iÓ"8Ð!9¸Ð;�àˆ
r“   c                ór  — t        | dd«      }t        |dd«      }|t        j                  k(  r|t        j                  k(  r
d| › d|› d�}n	d| › d|› d�}t        | «      st        |«      rMt	        «       j                  | |«      }|t        j                  t        j                  fv r|› dt        |«      › d�}|S )	z›
        Division with round-to-nearest rounding mode.
        Always uses triton.language.div_rn for float32 inputs to match eager CUDA behavior.
        r·   Nrñ  r±  r²  r9  r"  r  )r¤   r¿   rÀ   rŽ  r©  rô  r–  rO   rõ  s         r‘   Údiv_rnzTritonOverrides.div_rn©  s·   € ô ˜!˜W dÓ+ˆÜ˜!˜W dÓ+ˆà”e—m‘mÒ#¨´5·=±=Ò(@Ø+¨A¨3¨b°°°1Ð5‰Cð �a�S˜˜A˜3˜a�.ˆCä Ô"Ô&:¸1Ô&=Ü)Ó+×3Ñ3°A°qÓ9ˆIØœUŸ]™]¬E¯M©MÐ:Ñ:Ø˜˜T¤+¨iÓ"8Ð!9¸Ð;�àˆ
r“   c                óÞ   — d| › d|› d�}t        | «      st        |«      rMt        «       j                  | |«      }|t        j                  t        j
                  fv r|› dt        |«      › d�}|S )Nr9  r  r²  r  )rŽ  r©  Úmodr¿   r–  rÀ   rO   )r]  rç  rÖ  rÒ  s       r‘   rû  zTritonOverrides.mod¿  sl   € à�!��C˜�s˜!ˆnˆÜ Ô"Ô&:¸1Ô&=Ü)Ó+×/Ñ/°°1Ó5ˆIØœUŸ]™]¬E¯M©MÐ:Ñ:Ø˜˜T¤+¨iÓ"8Ð!9¸Ð;�Øˆ
r“   c                ó:   — t         j                  rd| › d�S d| › d�S )zÈ
        When use_fast_math, use the ftz (flushing to zero) variant
        of exponent computation.

        Check https://github.com/triton-lang/triton/issues/5735 for
        more details.
        ztl_math.exp(r²  zlibdevice.exp()r$   Úuse_fast_mathrí  s    r‘   r6  zTritonOverrides.expÈ  s+   € ô ×ÒØ! !  AÐ&Ð&à# A 3 aÐ(Ð(r“   c                ó   — d| › d�S )Nzlibdevice.exp2(r²  r�   rí  s    r‘   Úexp2zTritonOverrides.exp2Ø  ó   € ð !   1Ð%Ð%r“   c                ó   — d| › d�S )Nzlibdevice.expm1(r²  r�   rí  s    r‘   Úexpm1zTritonOverrides.expm1Ý  ó   € ð " !  AÐ&Ð&r“   c                ó   — d| › d�S )Nztl.sqrt_rn(r²  r�   rí  s    r‘   ÚsqrtzTritonOverrides.sqrtâ  s   € ð ˜Q˜C˜qÐ!Ð!r“   c                ó  — t         j                  j                  }|dk(  ry|dk(  r	d| › d| › d�S |dk(  r| › d�S |€8t        j                  t        j
                  d	t        j                  «      | «      S t        d
|›�«      ‚)NÚcompile_errorzcompile error!Úruntime_errorz"triton_helpers.device_assert_then(z == 0, "injected assert fail", r²  Úaccuracyz + 1r   z:unrecognized config triton.inject_relu_bug_TESTING_ONLY = )	r$   rÒ   Úinject_relu_bug_TESTING_ONLYÚopsÚmaximumrâ  r¿   r‡  rs  )r]  Úbugs     r‘   ÚreluzTritonOverrides.reluè  s�   € ä�m‰m×8Ñ8ˆØ�/Ò!Ø#Ø�OÒ#ð 8¸°sÐ:YÐZ[ÐY\Ð\]Ð^Ð^Ø�JÒØ�S˜�:ÐØˆ[Ü—;‘;œsŸ|™|¨A¬u¯{©{Ó;¸QÓ?Ð?ä ØLÈSÈGÐTóð r“   c                óZ   — t         j                  j                  r	d| › d|› d�S d| › d|› d�S )Nztl.minimum(r±  ú, tl.PropagateNan.ALL)ztriton_helpers.minimum(r²  ©r¿   r	  r
  ©rP  rQ  s     r‘   ÚminimumzTritonOverrides.minimumú  ó<   € ô �=‰=×ÒØ    2 a SÐ(>Ð?Ð?à,¨Q¨C¨r°!°°AÐ6Ð6r“   c                óZ   — t         j                  j                  r	d| › d|› d�S d| › d|› d�S )Nztl.maximum(r±  r  ztriton_helpers.maximum(r²  r  r  s     r‘   r  zTritonOverrides.maximum  r  r“   c                ó   — d| › d|› d|› d�S )Nr@  r±  r²  r�   )rP  rQ  rB  s      r‘   ÚwherezTritonOverrides.where
  s   € ð ˜1˜#˜R ˜s " Q C qÐ)Ð)r“   c           	     ó¢  ‡‡	‡
‡— t         j                  j                  sJ ‚| |}}d„ }d„ } ||«      r || «      }  ||«      r ||«      }	 	 	 	 	 	 dˆˆ	ˆ
ˆfd„}t        t         j                  j	                  «       «      dk\  sJ d«       ‚t        t        j                  t        j                     «      Š	t        t        j                  t        j                     «      Š
t        t        j                  t        j                     «      Št        t        j                  t        j                     «      Št         j                  j                  j                  t         j                  j                   || t!        | j"                  «      ‰
‰g«      | j$                  ‰
‰f¬«      } t         j                  j                  j                  t         j                  j                   ||t!        |j"                  «      ‰‰	g«      |j$                  ‰‰	f¬«      }t&        j(                  j*                  j,                  j.                  dk(  rd}nd}d	| › d
|› d|› d�S )a  
        Triton code generation for lowering ops.dot to tl.dot.

        The logic is as follows:

        1. Downcasting for performance
           If the data was previously upcasted to fp32, we downcast back to the
           original dtype (e.g., fp16 or bf16) for better performance. While
           surrounding operations may run in fp32, matmul itself is executed at the
           original precision to optimize throughput.

        2. Handling non-constant reduction masks
           If the reduction mask is not constant and there was any operation between
           tl.load and tl.dot, we zero out regions outside the mask using
           tl.where(r0_mask, val, 0).
           This ensures that values outside the mask do not contribute to the dot
           product, preventing incorrect results.

        3. Shape alignment for tl.dot
           We massage shapes to match the tl.dot requirement of (Y, R) x (R, X).
           Current codegen eagerly broadcasts tl.arange to create unique axes. We
           reshape, transpose, or broadcast to align with the (Y, R) x (R, X) shape.
           We avoid using 3D dot ((Z, Y, R) x (Z, R, X)) because 3D tl.dot has
           poor performance. During batched matmul (bmm), we keep ZBLOCK=1 and call
           the 2D dot kernel instead.
        c                óx  — t        t        t        | j                  «      «      syt        j
                  j                  d   }|j                  sJ ‚t        j
                  j                  |«      ryt        j
                  j                  j                  j                  «       D ]  \  }}|| k(  sŒd|v sŒd|v sŒ y y)NFr\  ztl.loadz	other=0.0T)r…   r9  rK   r  rU   rà   rx  r  Ú_has_constant_maskrá   Ú_cacherµ  )rô   Úreduction_rangeÚkÚvs       r‘   Úis_where_neededz,TritonOverrides.dot.<locals>.is_where_needed/  s›   € ä”sÔ.°·±Ó>Ô?ØäŸh™h×2Ñ2°2Ñ6ˆOØ"×/Ò/Ð/Ð/ô �x‰x×*Ñ*¨?Ô;Øô
 Ÿ™Ÿ™×+Ñ+×1Ñ1Ó3ò !‘��1Ø˜“8 	¨Q¢°;À!Ò3CÙ ð!ð r“   c                óô  — t         j                  j                  d| j                  «      }t        j
                  j                  D �cg c]  }|j                  sŒ|j                  «       ‘Œ! }}t        |«      dk(  sJ d«       ‚t        j                  |d   | |«      }t        j
                  j                  j                  t        j
                  j                  || j                  | j                  ¬«      S c c}w )NÚdotrW   z'don't tile reduction when native matmulr   ©r·   rä   )r%   Ú	ReductionÚdefault_valuer·   rU   rà   rx  r  r  rš   ÚTritonKernelOverridesr  rá   ÚgenerateÚcomputerä   )rô   Údefaultr÷   Úreduction_maskÚ	where_vars        r‘   Ú
where_condz'TritonOverrides.dot.<locals>.where_condD  sÃ   € Ü—l‘l×0Ñ0°¸¿	¹	ÓBˆGä-.¯X©X×-AÑ-AöØ%)ÀT×EVÓEV�—‘Õ ðˆNð ô �~Ó&¨!Ò+ÐVÐ-VÓVÐ+ä-×3Ñ3°NÀ1Ñ4EÀsÈGÓTˆIÜ—8‘8—<‘<×(Ñ(Ü—‘× Ñ  )°3·9±9ÀCÇIÁIð )ó ð ùòs   ÁC5ÁC5c                óŠ  •— ‰	|v r|D �cg c]  }|‰	k(  rdn|‘Œ }}|‰‰gk(  rE‰|vsJ d«       ‚ddg}‰|v r‰|d<   ‰|v r‰|d<   t        | ||«      } |‰‰gk7  }|rd| › d‰› d‰› d�} | S |‰‰gk(  rK‰|vsJ d	«       ‚ddg}‰|v r‰|d<   ‰|v r‰|d<   t        | ||«      } d
| › d�} |‰‰gk7  }|rd| › d‰› d‰› d�} | S t        ‚c c}w )a  
            Generate a reshape, transpose, and broadcast for the tl.dot.
            tl.dot requires specific shape requirement : (Y,R) x (R,X)
            but the current triton codegen eagerly broadcast the tl.arange so
            it needs to be reshaped to meet the requirement.

            This is done by three steps.
            1. remove the empty dimension (dim with size 1) and make it 2d with tl.reshape
            2. permute the dimension if needed (e.g., (X,R) -> (R,X)) with tl.trans
            3. broadcast if needed with broadcast_to.
                - This shows up when matmul operand is broadcasted with torch.expand/repeat.
                - e.g., torch.rand((16,)).expand(16,16) @ B

            e.g., (Y,1,R), (Y,R) -> tl.reshape(var, (Y,R))
            e.g., (1,X,R), (R,X) -> tl.trans(tl.reshape(var, (X,R)))
            e.g., (1,X,1), (R,X) -> tl.broadcast_to(tl.trans(tl.reshape(var, (X,1))), (R,X))

            TODO : eventually we want to remove this function when lazy broadcasting arrives
            rÞ   z&left tl.dot operand cannot depend on xr   rW   r°  z, (r±  rý  z'right tl.dot operand cannot depend on yr³  r²  )r¥  ÚNotImplementedError)
r§  r¼  rI  rz  Úshape_2dÚbroadcast_neededÚRBLOCKr  r  r  s
         €€€€r‘   Ú#reshape_transpose_broadcast_for_dotz@TritonOverrides.dot.<locals>.reshape_transpose_broadcast_for_dotb  s|  ø€ ð6 ˜Ñ&ØJWÖ XÀ3¨¨vª¡¸3Ñ!>Ð X�Ð Xà˜v vÐ.Ò.Ø ]Ñ2ð Ø<óÐ2ð   ˜:�Ø˜]Ñ*Ø"(�H˜Q‘KØ˜]Ñ*Ø"(�H˜Q‘Kô ' u¨m¸XÓF�ð $,°¸Ð/?Ñ#?Ð Ù#Ø.¨u¨g°S¸¸ÀÀ6À(È"ÐM�Eð4 ˆLð1  ¨Ð 0Ò0Ø ]Ñ2ð Ø=óÐ2ð   ˜:�Ø˜]Ñ*Ø"(�H˜Q‘KØ˜]Ñ*Ø"(�H˜Q‘Kô ' u¨m¸XÓF�ð $ E 7¨!Ð,�ð $,°¸Ð/?Ñ#?Ð Ù#Ø.¨u¨g°S¸¸ÀÀ6À(È"ÐM�Eð ˆLô *Ð)ùòW !Ys   ŠC r   ztl.dot can only do mm and bmmr"  Útf32Úieeeztl.dot(r±  z, input_precision="ú"))r¼  rE  rI  rE  r´   rð   )rU   rà   Úis_native_matmulrš   Údense_size_listrð   rÕ   r  r!   r  r  r  r  rá   r&  r'  rt  rä   r·   r¿   ÚbackendsÚcudaÚmatmulÚfp32_precision)rP  rQ  Úorig_aÚorig_br  r+  r1  Úinput_precisionr0  r  r  r  s           @@@@r‘   r!  zTritonOverrides.dot  sô  û€ ô: �x‰x×(Ò(Ð(Ð(Ø˜A�ˆò	ò*	ñ2 ˜6Ô"Ù˜1“ˆAÙ˜6Ô"Ù˜1“ˆAðI	à/ðI	ð .ðI	ð ÷	I	ð I	ôV ”1—8‘8×+Ñ+Ó-Ó.°!Ò3ÐTÐ5TÓTÐ3ä”]×.Ñ.¬t¯{©{Ñ;Ó<ˆÜ”]×.Ñ.¬t¯{©{Ñ;Ó<ˆÜ”]×.Ñ.¬t¯{©{Ñ;Ó<ˆÜ”]×.Ñ.¬t¯}©}Ñ=Ó>ˆä�H‰H�L‰L×!Ñ!Ü�H‰H×ÑÙ/°´4¸¿¹³=À6È6ÐBRÓSØ—'‘'Ø˜6Ð"ð	 "ó 
ˆô �H‰H�L‰L×!Ñ!Ü�H‰H×ÑÙ/°´4¸¿¹³=À6È6ÐBRÓSØ—'‘'Ø˜6Ð"ð	 "ó 
ˆô �>‰>×Ñ×%Ñ%×4Ñ4¸Ò>Ø$‰Oà$ˆOà˜˜˜2˜a˜SÐ 3°OÐ3DÀBÐGÐGr“   rW   )Úconstraintsr·   Úis_pureÚpackÚinput_dtypesc           
     ó¨  ‡‡‡‡‡— t        |«      Š|€#dj                  dg|D �cg c]  }d‘Œ c}z   «      }|j                  d«      D �cg c]  }|j                  «       ‘Œ }	}|	D �cg c]  }|j	                  d«      rŒ|‘Œ }
}g }t        t        ||
d t        |«       «      «      D ]o  \  }\  }}|dk(  rH|�Ft        |t        «      r6|j                  ||   k7  r$|j                  |› dt        ||   «      › d�«       ŒV|j                  t        |«      «       Œq t        j                  j                  r7t!        | «      j#                  d	d
«      Št!        |«      j#                  d	d
«      Šnd| › d�Šd|› d�Šˆˆˆˆˆfd„}‰dk  r |dj                  |«      «      S |d   }t$        j&                  j(                  }t$        j&                  j*                  }|j-                  ||j.                  ¬«      }dj                  ˆfd„|D «       «      }|j1                  |› d ||«      › �«       |j1                  |› d|› d|› d‰› d�«       |S c c}w c c}w c c}w )Nr±  z=rÚrú,ú=Úhr  r²  ú\z\\rK  c                ó.   •— d‰› d‰› d| › d‰› d‰› d‰› d�S )Nztl.inline_asm_elementwise(r±  ré  z	], dtype=z
, is_pure=z, pack=r²  r�   )r±   Úasm_literalÚasm_triton_typeÚconstraints_literalr?  r@  s    €€€€€r‘   Úasm_callz8TritonOverrides.inline_asm_elementwise.<locals>.asm_callù  s>   ø€ à,¨[¨M¸Ð<OÐ;Pð QØ�6˜ ?Ð"3°:¸g¸YÀgÈdÈVÐSTðVðr“   rW   r   r"  c              3  ó0   •K  — | ]  }d |› d‰› d�–— Œ y­w)ztriton_helpers.inline_asm_pack(r±  r²  Nr�   )rª   Úinpr@  s     €r‘   r­   z9TritonOverrides.inline_asm_elementwise.<locals>.<genexpr>  s&   øè ø€ ò  
ØADÐ-¨c¨U°"°T°F¸!Ô<ñ 
ùs   ƒú = z$ = triton_helpers.inline_asm_unpack()rO   r7  ÚsplitÚstripr.  Ú	enumerater·  rš   r•   r]   r·   rë  rð   r¿   r	  r
  ÚreprÚreplacerU   rà   r'  rá   Únewvarrä   Ú	writeline)Úasmr>  r·   r?  r@  rA  ÚinputsÚ_rC  Úconstraint_partsÚinput_constraintsÚcast_inputsrÄ  rN  rB  rL  Úfirst_inputr'  rá   r�  Úpacked_argsrI  rJ  rK  s      ``                @@@r‘   Úinline_asm_elementwisez&TritonOverrides.inline_asm_elementwiseÉ  sN  ü€ ô & eÓ,ˆØÐØŸ)™) T F¸6Ö-B°aªcÒ-BÑ$BÓCˆKð
 0;×/@Ñ/@ÀÓ/EÖF¨!˜AŸG™G�IÐFÐÐFØ(8ÖR 1ÀÇÁÈSÕ@QšQÐRÐÐRØˆÜ$¤S¨Ð1BÀ=ÄSÈÃ[Ð1QÓ%RÓSò 		-‰KˆA‰x��Qà�S’Ø Ð,Ü˜s¤KÔ0Ø—I‘I ¨a¡Ò0à×"Ñ" c U¨$¬{¸<È¹?Ó/KÐ.LÈAÐ#NÕOà×"Ñ"¤3 s£8Õ,ð		-ô �=‰=×Òô ˜s›)×+Ñ+¨D°&Ó9ˆKÜ"& {Ó"3×";Ñ";¸DÀ&Ó"IÑà˜c˜U !˜*ˆKØ$% k ]°!Ð"4Ð÷	ð 	ð �1Š9Ù˜DŸI™I kÓ2Ó3Ð3à˜Q‘iˆÜ—(‘(×"Ñ"ˆÜ�h‰h�l‰lˆØ—‘ %¨{×/@Ñ/@�ÓAˆØ—i‘ió  
ØHSô 
ó 
ˆð 	×Ñ˜V˜H C©°Ó(=Ð'>Ð?Ô@Ø×ÑØˆhÐ:¸6¸(À"À[ÀMÐQSÐTXÐSYÐYZÐ[ô	
ð ˆùòm .Cùò
 GùÚRs   ¤	I
Á	I
Á&IÁ=Ic                ó   — d| › d�S )Nztl_math.cos(r²  r�   rí  s    r‘   ÚcoszTritonOverrides.cos  rï  r“   c                ó   — d| › d�S )Nztl_math.sin(r²  r�   rí  s    r‘   ÚsinzTritonOverrides.sin  rï  r“   c                ó   — t        d«      ‚)Nz/ops.index_expr not implemented outside a kernel©r-  ©rÂ   r�   r·   s      r‘   Ú
index_exprzTritonOverrides.index_expr  ó   € ä!Ð"SÓTÐTr“   c                ó   — t        d«      ‚)Nz/ops.value_expr not implemented outside a kernelre  rf  s      r‘   Ú
value_exprzTritonOverrides.value_expr  rh  r“   c                ó   — t        d«      ‚)Nz+ops.masked not implemented outside a kernelre  )r  ÚbodyÚothers      r‘   ÚmaskedzTritonOverrides.masked#  s   € ä!Ð"OÓPÐPr“   c                ó   — d| › d�S )Nzlibdevice.lgamma(r²  r�   rí  s    r‘   ÚlgammazTritonOverrides.lgamma'  ó   € ð # 1 # QÐ'Ð'r“   c                ó   — d| › d�S )Nzlibdevice.erf(r²  r�   rí  s    r‘   ÚerfzTritonOverrides.erf-  ó   € ð   ˜s !Ð$Ð$r“   c                ó   — d| › d�S )Nzlibdevice.cosh(r²  r�   rí  s    r‘   ÚcoshzTritonOverrides.cosh3  ó   € ð !   1Ð%Ð%r“   c                ó   — d| › d�S )Nzlibdevice.sinh(r²  r�   rí  s    r‘   ÚsinhzTritonOverrides.sinh9  rw  r“   c                ó   — d| › d�S )Nzlibdevice.acos(r²  r�   rí  s    r‘   ÚacoszTritonOverrides.acos?  rw  r“   c                ó   — d| › d�S )Nzlibdevice.acosh(r²  r�   rí  s    r‘   ÚacoshzTritonOverrides.acoshE  ó   € ð " !  AÐ&Ð&r“   c                ó   — d| › d�S )Nzlibdevice.asin(r²  r�   rí  s    r‘   ÚasinzTritonOverrides.asinK  rw  r“   c                ó   — d| › d�S )Nzlibdevice.asinh(r²  r�   rí  s    r‘   ÚasinhzTritonOverrides.asinhQ  r~  r“   c                ó   — d| › d|› d�S )Nzlibdevice.atan2(r±  r²  r�   ©r]  rç  s     r‘   Úatan2zTritonOverrides.atan2W  ó   € ð " !  B q c¨Ð+Ð+r“   c                ó   — d| d›d�S )Nztl.full([], 0xÚ08Xz), tl.uint32).to(tl.float32, bitcast=True)r�   )Úbitss    r‘   Ú_f32_const_from_bitsz$TritonOverrides._f32_const_from_bits]  s   € à  S˜zÐ)RÐSÐSr“   c           
     ó>  — dj                  dgdgt        |«      z  z   «      }dj                  t        t        |«      «      }t        j
                  j                  j                  t        j
                  j                  d| › d|› d|› d�t        j                  |¬«      S )	Nr±  z=frÒ  ztl.inline_asm_elementwise('z', 'z', [z*], dtype=tl.float32, is_pure=True, pack=1)r"  )r7  rš   r9  rð   rU   rà   rá   r&  r'  r¿   rÀ   )rW  r±   rä   r>  Úargs_strs        r‘   Ú_inline_asm_f32zTritonOverrides._inline_asm_f32a  sŽ   € à—i‘i  ¨#¨´°T³Ñ):Ñ :Ó;ˆØ—9‘9œS¤ d›^Ó,ˆÜ�x‰x�|‰|×$Ñ$Ü�H‰H×ÑØ)¨#¨¨d°;°-ð @ØˆzÐCðEä—-‘-Øð %ó 
ð 	
r“   c           	     óì  ‡— | j                   Št        j                  fdˆfd„}dˆfd„}t        j                  } |d«      } |d«      } |d| › d�«      } ||› d|› �t        j
                  «      }t        j                  d|g‰«      } |d	|› d
|› d
|› d�«      }	 ||	› d|	› �«      }
 | |d«      |
 |d«      «      } |||
 |d«      «      } |||
 |d«      «      } |||
 |d«      «      } |||
 |d«      «      } |||
 |d«      «      } |||
 |d«      «      } ||
› d|› �«      } |||	|	«      } |d|› �«      } | |d«       |d«      |«      } |d	|› d
|› d
|› d�«      }d} || › d|› �t        j                  «      } ||› d�t        j                  «      } ||› d|› �t        j                  «      } ||› d�«      } ||› d|› �t        j
                  «      } |d	|› d
|› d
|› d�«      S )Nc                óŽ   •— t         j                  j                  j                  t         j                  j                  | |‰¬«      S ©Nr"  )rU   rà   rá   r&  r'  )r�   r·   rä   s     €r‘   Úgenz(TritonOverrides._cuda_atanf.<locals>.genx  s6   ø€ Ü—8‘8—<‘<×(Ñ(Ü—‘× Ñ  $¨e¸5ð )ó ð r“   c                ó8   •— t         j                  d| ||g‰«      S )Nzfma.rn.f32 $0, $1, $2, $3;)rÆ  r�  )rP  rQ  rB  rä   s      €r‘   Úfmaz(TritonOverrides._cuda_atanf.<locals>.fma}  s#   ø€ Ü"×2Ñ2Ø,¨q°!°Q¨i¸óð r“   i  €?i  €rZ  r²  z > zrcp.approx.ftz.f32 $0, $1;r@  r±  rv  iª� ;l   Oa×x i~9#=l   z
){ i!k×=l   ˆ"| i`¯L>l   '*U} ú-i�ån?iët×?z"tl.full([], 0x80000000, tl.uint32)z.to(tl.uint32, bitcast=True) & z.to(tl.uint32, bitcast=True)rä  z.to(tl.float32, bitcast=True)z <= )r�   rð   r·   r¤  r´   rš  )rP  r	   rQ  r	   rB  r	   r´   r	   )rä   r¿   rÀ   rÆ  rŠ  r£   r�  Úuint32)r]  r‘  r“  rB  ÚoneÚinfÚabs_xÚlargeÚrcpÚzÚz2ÚpolyÚ
correctionr�  Ú
neg_resultÚpi_over_two_minus_resultÚ	sign_maskÚsignÚresult_bitsÚsigned_bitsÚsigned_resultÚnot_nanrä   s                         @r‘   Ú_cuda_atanfzTritonOverrides._cuda_atanfm  sH  ø€ ð —‘ˆä05·±ö 	õ
	ô
 ×0Ñ0ˆÙ�
‹mˆÙ�
‹mˆá�l 1 # QÐ'Ó(ˆÙ�u�g˜S  Ð&¬¯
©
Ó3ˆÜ×-Ñ-Ø(¨5¨'°5ó
ˆñ �)˜E˜7 " S E¨¨E¨7°!Ð4Ó5ˆÙ�A�3�c˜!˜�Óˆá‘1�Z“= "¡a¨
£mÓ4ˆÙ�4˜™Q˜z›]Ó+ˆÙ�4˜™Q˜z›]Ó+ˆÙ�4˜™Q˜z›]Ó+ˆÙ�4˜™Q˜z›]Ó+ˆÙ�4˜™Q˜z›]Ó+ˆÙ�4˜™Q˜z›]Ó+ˆá˜B˜4˜s 4 &Ð)Ó*ˆ
Ù�Z  AÓ&ˆÙ˜1˜V˜H˜Ó&ˆ
Ù#&¡q¨£}±a¸
³mÀZÓ#PÐ Ù�y   rÐ*BÐ)CÀ2ÀfÀXÈQÐOÓPˆà8ˆ	Ù�a�SÐ7¸	°{ÐCÄUÇ\Á\ÓRˆÙ˜V˜HÐ$@ÐAÄ5Ç<Á<ÓPˆÙ˜T˜F # k ]Ð3´U·\±\ÓBˆÙ˜{˜mÐ+HÐIÓJˆÙ˜˜˜t C 5Ð)¬5¯:©:Ó6ˆÙ�Y˜w˜i r¨-¨¸¸6¸(À!ÐDÓEÐEr“   c                ó¸  — t        | «      }t        | «      }t        j                  j                  sót
        j                  j                  «       j                  dk(  rÈt        | t        «      r¸|t        j                  k(  s|r£d }|rb|}t
        j                  j                  j                  t
        j                  j                  | › d�t        j                  | j                   ¬«      } t"        j%                  | «      }|�$|t        j                  k7  r|› dt'        |«      › d�S |S |rdnd}d| › |› d�}|r&|�$|t        j                  k7  r|› dt'        |«      › d�S |S )Nr8  r¬  r"  r  r²  rÍ   zlibdevice.atan()r“  r˜  r¿   r	  r
  rU   ra  Úget_current_device_or_throwrM  r•   r]   rÀ   rà   rá   r&  r'  rä   rÆ  r§  rO   )r]  r·   Úneeds_upcastr¾  r�  Úupcasts         r‘   ÚatanzTritonOverrides.atan¤  s5  € ô ! Ó#ˆÜ.¨qÓ1ˆä—‘×!Ò!Ü—‘×3Ñ3Ó5×:Ñ:¸fÒDÜ˜1œkÔ*Øœ%Ÿ-™-Ò'©<àˆLÙØ$�Ü—H‘H—L‘L×)Ñ)Ü—H‘H×$Ñ$Ø�c˜Ð)ÜŸ-™-ØŸ'™'ð	 *ó �ô %×0Ñ0°Ó3ˆFØÐ'¨L¼E¿M¹MÒ,IØ ˜ ¤k°,Ó&?Ð%@ÀÐBÐBØˆMá&2Ñ"¸ˆØ" 1 # f X¨QÐ/ˆÙ˜EÐ-°%¼5¿=¹=Ò2HØ�X˜T¤+¨eÓ"4Ð!5°QÐ7Ð7Øˆr“   c                ó   — d| › d�S )Nzlibdevice.atanh(r²  r�   rí  s    r‘   ÚatanhzTritonOverrides.atanhÃ  r~  r“   c                ó   — d| › d|› d�S )Nzlibdevice.copysign(r±  r²  r�   r„  s     r‘   rÜ  zTritonOverrides.copysignÉ  s   € ð % Q C r¨!¨¨AÐ.Ð.r“   c                ó   — d| › d�S )Nzlibdevice.erfc(r²  r�   rí  s    r‘   ÚerfczTritonOverrides.erfcÏ  r   r“   c                ó   — d| › d�S )Nzlibdevice.erfinv(r²  r�   rí  s    r‘   ÚerfinvzTritonOverrides.erfinvÔ  rq  r“   c                ó   — d| › d|› d�S )Nzlibdevice.hypot(r±  r²  r�   r„  s     r‘   ÚhypotzTritonOverrides.hypotÚ  r†  r“   c                ó   — d| › d�S )Nzlibdevice.log10(r²  r�   rí  s    r‘   Úlog10zTritonOverrides.log10à  r  r“   c                ó   — d| › d�S )Nzlibdevice.log2(r²  r�   rí  s    r‘   Úlog2zTritonOverrides.log2å  r   r“   c                ó   — d| › d|› d�S )Nzlibdevice.ldexp(r±  z.to(tl.int32))r�   )r]  Úns     r‘   ÚldexpzTritonOverrides.ldexpê  s   € ð " !  B q c¨Ð8Ð8r“   c                ó   — d| › d|› d�S )Nzlibdevice.nextafter(r±  r²  r�   r„  s     r‘   Ú	nextafterzTritonOverrides.nextafterï  s   € ð & a S¨¨1¨#¨QÐ/Ð/r“   c                ó   — | › d|› �S ©Nr6  r�   r  s     r‘   Úlogical_andzTritonOverrides.logical_andõ  ó   € ð ��C˜�sˆ|Ðr“   c                ó   — | › d�S )Nz == 0r�   ©rP  s    r‘   Úlogical_notzTritonOverrides.logical_notú  s   € à��Eˆ{Ðr“   c                ó   — | › d|› �S ©Nrä  r�   r  s     r‘   Ú
logical_orzTritonOverrides.logical_orþ  rÂ  r“   c                ó   — d| › d|› d�S )Nr9  ú ^ r²  r�   r  s     r‘   Úlogical_xorzTritonOverrides.logical_xor  s   € ð �1�#�S˜˜˜1ˆ~Ðr“   c                ó   — | › d|› �S rÀ  r�   r  s     r‘   Úbitwise_andzTritonOverrides.bitwise_and  ó   € à��C˜�sˆ|Ðr“   c                ó   — d| › �S )Nú~r�   rÄ  s    r‘   Úbitwise_notzTritonOverrides.bitwise_not  s   € à�1�#ˆwˆr“   c                ó   — | › d|› �S rÇ  r�   r  s     r‘   Ú
bitwise_orzTritonOverrides.bitwise_or  rÎ  r“   c                ó   — | › d|› �S )NrÊ  r�   r  s     r‘   Úbitwise_xorzTritonOverrides.bitwise_xor  rÎ  r“   c                ó   — | › d|› �S )Nz << r�   r  s     r‘   Úbitwise_left_shiftz"TritonOverrides.bitwise_left_shift  ó   € à��D˜˜ˆ}Ðr“   c                ó   — | › d|› �S )Nz >> r�   r  s     r‘   Úbitwise_right_shiftz#TritonOverrides.bitwise_right_shift  rØ  r“   c                ó    — d|› d�}t         j                  «       r,t        j                  j	                  «       \  }d| › d|› d|› d�S d| › d|› d�S )Nr9  ú).to(tl.uint32)ztriton_helpers.rand4x(r±  r²  ztl.rand(©rÆ  Ú_can_use_4x_randomrU   rà   r6  ©ÚseedrÖ   Úblocks      r‘   ÚrandzTritonOverrides.rand   s`   € à�V�H˜OÐ,ˆÜ×-Ñ-Ô/Ü—x‘x×/Ñ/Ó1‰HˆUØ+¨D¨6°°F°8¸2¸e¸WÀAÐFÐFØ˜$˜˜r & ¨Ð+Ð+r“   c                 ó‚  — t        t        j                  t        «      xr  t        t        j                  t        j
                  j                  j                  «       xra t        j                  j                  «       j                  dk(  xr4 t        j                  j                  «       dk(  xr t        j                   S )Nr8  rW   )r•   rU   rà   r  r¿   Ú	_inductorÚselect_algorithmÚTritonTemplateKernelra  r©  rM  rî   r$   Úalign_random_eagerr�   r“   r‘   rÞ  z"TritonOverrides._can_use_4x_random(  s“   € ô ”q—x‘x¤Ó.ò .ÜÜ—‘œ%Ÿ/™/×:Ñ:×OÑOóð ò.ô —‘×3Ñ3Ó5×:Ñ:¸fÑDò	.ô
 —‘×+Ñ+Ó-°Ñ2ò.ô ×-Ñ-Ð-ð	
r“   c                ón   — d|› d�}d|› d|› d�}d|› d|› d|› d�}d|› d|› d�}d	| › d
|› d|› d
|› d|› d�S )Nr9  rÜ  z((z)*(rý  z)//(z//4))z)%(z!triton_helpers.rand_eager_kernel(r±  ú+z, VEC=r²  r�   )	rà  Úbase_offsetÚthreads_per_roundÚtidÚvecÚtid_u32ÚdenomrC  Ú	tid_truncs	            r‘   Ú
rand_eagerzTritonOverrides.rand_eager4  s�   € ð �c�U˜/Ð*ˆØ�S�E˜Ð.Ð/¨rÐ2ˆØ��	˜˜e˜W C¨ u¨EÐ2ˆØ˜˜	  U G¨2Ð.ˆ	à2°4°&¸¸;¸-ÀqÈÈÈ2ÈiÈ[ÐX^Ð_bÐ^cÐcdÐeÐer“   c                ó    — d|› d�}t         j                  «       r,t        j                  j	                  «       \  }d| › d|› d|› d�S d| › d|› d�S )Nr9  rÜ  ztriton_helpers.randn4x(r±  r²  z	tl.randn(rÝ  rß  s      r‘   ÚrandnzTritonOverrides.randn>  s`   € à�V�H˜OÐ,ˆÜ×-Ñ-Ô/Ü—x‘x×/Ñ/Ó1‰HˆUØ,¨T¨F°"°V°H¸B¸u¸gÀQÐGÐGØ˜4˜&  6 (¨!Ð,Ð,r“   c           	     ó,   — d|› d�}d| › d|› d|› d|› d�	S )Nr9  rÜ  ztriton_helpers.randint64(r±  r²  r�   )rà  rÖ   ÚlowÚhighs       r‘   Ú	randint64zTritonOverrides.randint64F  s1   € à�V�H˜OÐ,ˆØ*¨4¨&°°6°(¸"¸S¸EÀÀDÀ6ÈÐKÐKr“   c                ó   — t        d«      ‚)Nz.ops.load_seed not implemented outside a kernelre  )rã   rÖ   s     r‘   Ú	load_seedzTritonOverrides.load_seedK  s   € ä!Ð"RÓSÐSr“   c                óN   — t         j                  j                  rd| › d�S d| › d�S )Nz	tl.rsqrt(r²  zlibdevice.rsqrt(r  rí  s    r‘   ÚrsqrtzTritonOverrides.rsqrtO  s/   € ô �=‰=×ÒØ˜q˜c Ð#Ð#à% a S¨Ð*Ð*r“   c                ó   — d| › d�S )Nzlibdevice.log1p(r²  r�   rí  s    r‘   Úlog1pzTritonOverrides.log1pX  r  r“   c                ó   — d| › d�S )Nzlibdevice.tan(r²  r�   rí  s    r‘   ÚtanzTritonOverrides.tan]  rt  r“   c                óR  — t         j                  j                  j                  j	                  | «      }|rt        |d«      r|j                  }nd }t        j                  rBt        j                  j                  r(t        «       dkD  r|t        j                  k7  r|�d| › d�S d| › d�S )Nr·   )r   é   zlibdevice.fast_tanhf(r²  zlibdevice.tanh()rU   rà   rá   râ   rì   rÐ   r·   r$   rý  r¿   r	  r
  r   rÁ   )r]  rõ   r·   s      r‘   ÚtanhzTritonOverrides.tanhc  s�   € ô —(‘(—,‘,×*Ñ*×.Ñ.¨qÓ1ˆÙ”w˜w¨Ô0Ø—M‘M‰EàˆEä× Ò Ü—‘×!Ò!Ü"Ó$ vÒ-ØœŸ™Ò&ØÐ!ð +¨1¨#¨QÐ/Ð/à$ Q C qÐ)Ð)r“   c                ó   — d| › d�S )Nztl.sigmoid(r²  r�   rí  s    r‘   ÚsigmoidzTritonOverrides.sigmoidy  s   € ð ˜Q˜C˜qÐ!Ð!r“   c                ó   — d| › d| › d| › d�S )Nz(libdevice.signbit(z) != 0) if (z).dtype is tl.float32 else z < 0r�   rí  s    r‘   ÚsignbitzTritonOverrides.signbit~  s#   € ð
 " !  L°°Ð3NÈqÈcÐQUÐVð	
r“   c                ó   — d| › d|› d�S )Nzlibdevice.fmod(r±  r²  r�   r  s     r‘   ÚfmodzTritonOverrides.fmod†  s   € ð !   2 a S¨Ð*Ð*r“   c                ó†  — t        «       j                  ||«      }|�mt        |«      rb| j                  ||«      }t	        |t
        j                  j                  «      r | j                  |t
        j                  «      n|› }d|› d|› d�S t        |«      xs t        |«      }|}|t
        j                  t
        j                  fvr-t        |«      s|rt
        j                  nt
        j                  }|t
        j                  k(  rVt        t        j                   j"                  «      s3t
        j                  }|t
        j                  k(  rt
        j                  }| j                  ||«      }| j                  ||«      }	d|› d|	› d�}
|�6||k7  r1t        |«      r|r|
› dt%        |«      › d�}
|
S |
› dt%        |«      › d�}
|
S )Nztriton_helpers.pow_integer(r±  r²  r:  r  )r©  Úpowr   rë  r•   r¿   r�  r‘  râ  Úint64r˜  rÀ   rÁ   rŒ  rD   rU   ra  r  rO   )rÂ   rP  rQ  r¾  r5  Úexponentr½  Ú	pow_dtypeÚcast_aÚcast_br�  s              r‘   r
  zTritonOverrides.powŒ  s¨  € ä(Ó*×.Ñ.¨q°!Ó4ˆØÐ#Ô(8¸Ô(FØ×*Ñ*¨1¨lÓ;ˆDô ˜a¤×!4Ñ!4×!;Ñ!;Ô<ð —‘˜Q¤§¡Ô,à�sð ð
 1°°°b¸¸
À!ÐDÐDä2°1Ó5ÒSÔ9PÐQRÓ9SÐØ ˆ	ØœUŸ]™]¬E¯M©MÐ:Ñ:ô $ LÔ1Ñ5Eô —’ä—]‘]ð ð
 œŸ™Ò%Ô.BÜ�G‰G×"Ñ"ô/
ô Ÿ™ˆIØœuŸ}™}Ò,Ü$Ÿ}™}�à×(Ñ(¨¨IÓ6ˆØ×(Ñ(¨¨IÓ6ˆØ! & ¨¨F¨8°1Ð5ˆØÐ#¨¸	Ò(AÜ Ô-Ù#Ø &˜x t¬K¸Ó,EÐ+FÀaÐH�Fð ˆð #˜8 4¬°LÓ(AÐ'BÀ!ÐD�Øˆr“   c                óN   — t         j                  j                  rd| › d�S d| › d�S )Nzlibdevice.log(r²  ztl_math.log()r$   rò  Úuse_pytorch_libdevicerí  s    r‘   ÚlogzTritonOverrides.logµ  s3   € ô × Ñ ×6Ò6ð $ A 3 aÐ(Ð(Ø˜a˜S Ð"Ð"r“   F)rÃ   c                ó   — d| › d�S )Nzlibdevice.isinf(ú).to(tl.int1)r�   rí  s    r‘   ræ  zTritonOverrides.isinf¿  ó   € ð " !  MÐ2Ð2r“   c                ó   — d| › d�S )Nzlibdevice.isnan(r  r�   rí  s    r‘   rå  zTritonOverrides.isnanÅ  r  r“   c                ó   — d| › d�S )Nzlibdevice.nearbyint(r²  r�   rí  s    r‘   ÚroundzTritonOverrides.roundË  s   € ð & a S¨Ð*Ð*r“   c                ó   — d| › d�S )Nr&  r²  r�   rí  s    r‘   ÚfloorzTritonOverrides.floorÑ  r~  r“   c                óò  — t        j                  dt        j                  «      }t        j                  dt        j                  «      }t        j                  ||«      }t        j
                  |||«      }t        j                  ||«      }t        j
                  |t        j                  || «      | «      } t        j
                  |t        j                  ||«      |«      }t        j                  | |«      }t        j
                  |t        j                  | «      | «      } t        j                  | |«      }t        j
                  |t        j                  |«      |«      }t        j
                  |||«      S ©Nr   rW   )
r  râ  r¿   r‡  Úeqr  Últré  rÑ  Útruncdiv)rP  rQ  Úzeror–  Úb_zeroÚb_negÚa_negr  s           r‘   ÚfloordivzTritonOverrides.floordiv×  s   € ô �|‰|˜AœuŸ{™{Ó+ˆÜ�l‰l˜1œeŸk™kÓ*ˆô
 —‘˜˜4“ˆÜ�I‰I�f˜c 1Ó%ˆÜ—‘�q˜$“ˆÜ�I‰I�eœSŸW™W T¨1Ó-¨qÓ1ˆÜ�I‰I�eœSŸW™W T¨1Ó-¨qÓ1ˆÜ—‘�q˜$“ˆÜ�I‰I�eœSŸ_™_¨QÓ/°Ó3ˆÜ�|‰|˜A˜qÓ!ˆÜ�y‰y˜¤§¡°Ó 5°tÓ<ˆÜ�y‰y˜  tÓ,Ð,r“   c                óf  — t        j                  dt        j                  «      }t        j                  t        j
                  || «      t        j                  «      }t        j                  t        j
                  | |«      t        j                  «      }t        j                  ||«      }|› d| › d�S )Nr   r  ú.dtype))r  râ  r¿   r‡  rÓ  r  r�  ré  )r]  r›  ÚleftÚrightré  s        r‘   r¢  zTritonOverrides.signó  sw   € ô �L‰L˜œEŸK™KÓ(ˆÜ�|‰|œSŸV™V A q›\¬E¯J©JÓ7ˆÜ—‘œcŸf™f Q¨›l¬U¯Z©ZÓ8ˆÜ�g‰g�d˜EÓ"ˆØ��d˜1˜#˜WÐ%Ð%r“   c                ó   — d| › d�S )Nrô  r²  r�   rí  s    r‘   ÚtrunczTritonOverrides.truncü  r~  r“   c                ó   — | › d|› �S )Nr  r�   r  s     r‘   r  zTritonOverrides.truncdiv	  s   € ð
 ��D˜˜ˆ}Ðr“   c                ó   — d| › d�S )Nr,  r²  r�   rí  s    r‘   ÚceilzTritonOverrides.ceil		  rw  r“   ©NT)r·   r¤  rË  útorch.dtype | None)r·   r¤  rË  r¤  ©r·   r¤  r´   rð   )r‰  r  r´   rð   )rW  rð   r±   úSequence[Any]rä   r}   r´   r	   )r]  r]   r´   r]   )]r¾   rÇ   rÈ   rÉ   rÛ  r¹  ÚeÚ_LOG_2_Er|  rÓ  r×  rà  rË   râ  ré  rë  rÄ  rî  rô  rù  rû  r6  rÿ  r  r  r  r  r  r  r!  r¿   rÀ   r_  ra  rc  rg  rj  rn  rp  rs  rv  ry  r{  r}  r€  r‚  r…  rŠ  r�  r§  r¬  r®  rÜ  r±  r³  rµ  r·  r¼  r¾  rÁ  rÅ  rÈ  rË  rÍ  rÑ  rÓ  rÕ  r×  rÚ  râ  rÞ  rñ  ró  r÷  rù  rû  rý  rÿ  r  r  r  r  r
  r  ræ  rå  r  r  r$  r¢  r*  r  r-  r�   r“   r‘   rÆ  rÆ  ö  sV  „ ÙOàˆt�y‰y˜Ÿ™Ó €Hàð )-Øð	H&àðH&ð &òH&ó ðH&ðT òó ðð  ñDó ðDð, ñ<ó ð<ð ñó ðð ò3ó ð3ð ÙÓñ#ó ó ð#ð ñó ðð, ñó ðð* ñó ðð ÙÓñ)ó ó ð)ð ÙÓñ&ó ó ð&ð ÙÓñ'ó ó ð'ð ÙÓñ"ó ó ð"ð ñó ðð" ñ7ó ð7ð ñ7ó ð7ð ñ*ó ð*ð ñvHó ðvHðp ð Ø�m‰mØØØóCó ðCðJ ÙÓñ#ó ó ð#ð ÙÓñ#ó ó ð#ð ñUó ðUð ñUó ðUð ñQó ðQð ÙÓñ(ó ó ð(ð ÙÓñ%ó ó ð%ð ÙÓñ&ó ó ð&ð ÙÓñ&ó ó ð&ð ÙÓñ&ó ó ð&ð ÙÓñ'ó ó ð'ð ÙÓñ&ó ó ð&ð ÙÓñ'ó ó ð'ð ÙÓñ,ó ó ð,ð òTó ðTð ò	
ó ð	
ð ò4Fó ð4Fðl ñó ðð: ÙÓñ'ó ó ð'ð ÙÓñ/ó ó ð/ð ÙÓñ&ó ó ð&ð ÙÓñ(ó ó ð(ð ÙÓñ,ó ó ð,ð ÙÓñ'ó ó ð'ð ÙÓñ&ó ó ð&ð ñ9ó ð9ð ÙÓñ0ó ó ð0ð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñ,ó ð,ð ñ	
ó ð	
ð ñfó ðfð ñ-ó ð-ð ñLó ðLð ñTó ðTð ÙÓñ+ó ó ð+ð ÙÓñ'ó ó ð'ð ÙÓñ%ó ó ð%ð ÙÓñ*ó ó ð*ð& ÙÓñ"ó ó ð"ð ñ
ó ð
ð ÙÓñ+ó ó ð+ð ñ&ó ð&ðP ÙÓñ#ó ó ð#ð Ù¨Ô/ñ3ó 0ó ð3ð Ù¨Ô/ñ3ó 0ó ð3ð ÙÓñ+ó ó ð+ð ÙÓñ'ó ó ð'ð ñ-ó ð-ð6 ñ&ó ð&ð ÙÓñ'ó ó ð'ð ñó ðð
 ÙÓñ&ó ó ñ&r“   rÆ  rÒ   c                  óÖ   ‡ — e Zd ZdZˆ fd„Zeej                  d„ «       «       Zed„ «       Z	ed„ «       Z
ed„ «       Zed„ «       Zed„ «       Zed	„ «       Ze	 	 	 	 	 	 	 	 	 	 dd
„«       Zˆ xZS )r%  a   Map element-wise ops to Triton within a TritonKernel

    Unlike TritonOverrides, these assume the code is going to be inserted into
    the body of the main triton kernel and so it may use indexing and mask
    variables which are assumed to already be defined in the current scope.
    c                óD   •— t        ‰| �  |i |¤Ž | j                  «        y r©   )rœ  r�  Ú_setup_libdevice_routing)r%  r±   r¢  rŸ  s      €r‘   r�  zTritonKernelOverrides.__init__	  s#   ø€ Ü‰Ñ˜$Ð) &Ò)ð 	×%Ñ%Õ'r“   c                ó¤  ‡— ddl mŠ t        j                  j                  j
                  D ]¢  }t        | |«      sJ ‚t        | |«      }ˆfd„}|dk(  rDt        ‰d«      sJ ‚t        j                  |||¬«      }||_
        t        | |t        |«      «       Œkd„ }t        j                  |||¬«      }||_
        t        | |t        |«      «       Œ¤ y)z<Set up routing to libdevice implementations for fp64 inputs.r   )ÚOpDecompositionsc                ó†   •— | j                   t        j                  k7  r || «      S  t        ‰|«      | «      j                  S r©   )r·   r¿   rÁ   r¤   r§  )r]  Ú_original_implÚ_fn_namer8  s      €r‘   Údecomposition_routerzLTritonKernelOverrides._setup_libdevice_routing.<locals>.decomposition_router1	  s9   ø€ Ø—7‘7œeŸm™mÒ+Ù)¨!Ó,Ð,à>œ7Ð#3°XÓ>¸qÓA×GÑGÐGr“   r  )r:  r;  c                ó^   — | j                   t        j                  k(  r	d|› d| › d�S  || «      S )Nz
libdevice.r9  r²  )r·   r¿   rÁ   )r]  r:  r;  s      r‘   Údtype_routerzDTritonKernelOverrides._setup_libdevice_routing.<locals>.dtype_router@	  s2   € Ø—7‘7œeŸm™mÒ+Ø'¨ z°°1°#°QÐ7Ð7á)¨!Ó,Ð,r“   N)Útorch._inductor.codegen.commonr8  r¿   rä  r'   Úop_requires_libdevice_fp64rÐ   r¤   Ú	functoolsÚpartialr¾   Úsetattrr|  )rÂ   Úfn_nameÚoriginal_implr<  Úfnr>  r8  s         @r‘   r6  z.TritonKernelOverrides._setup_libdevice_routing&	  sÒ   ø€ õ
 	Dä—‘×,Ñ,×GÑGò 	4ˆGÜ˜3 Ô(Ð(Ð(Ü# C¨Ó1ˆMôHð ˜)Ò#ÜÐ/°Ô;Ð;Ð;Ü×&Ñ&Ø(¸ÐQXô�ð &�”Ü˜˜W¤l°2Ó&6Ô7Øò-ô ×"Ñ"Ø¨]ÀWôˆBð "ˆBŒKÜ�C˜¤,¨rÓ"2Õ3ñ;	4r“   c                ór   — t         j                  j                  «       }dg|z  }| j                  |||¬«      S )NrW   rå  )rU   rà   rî   rà  )rÂ   r§  r·   rø   rä   s        r‘   râ  zTritonKernelOverrides.constantL	  s9   € ô
 �x‰x×*Ñ*Ó,ˆØ��d‘
ˆØ×#Ñ# E¨5¸Ð#Ó>Ð>r“   c                ó’  — t        ||«      }t        j                  j                  |dd ¬«      }t	        |t
        «      sJ ‚|j                  r|j                  }nt        j                  |j                  «      }t        j                  j                  «       }|t        j                  t        j                  fv r|}n|}t        |«      }t        j                  j                  j!                  t        j                  j"                  | j%                  d|j&                  › d�|«      |t)        |«      |¬«      }|j*                  |_        |S )NF©Ú	block_ptrÚtma_compatibility_checkerr9  r²  )r·   rž  rä   )r¸   rU   rà   Úindexingr•   r  r"  rÕ   rù   r!  Úget_index_dtype_as_torch_dtyper¿   r‡  r  rQ   rá   r&  r'  rÓ  r  rE   r  )	rÂ   r�   r·   rL  rä   rø  Ú
cast_dtypeÚoutput_dtyperô   s	            r‘   rg  z TritonKernelOverrides.index_exprU	  s  € ä/°°eÓ<ˆÜ—8‘8×$Ñ$Ø˜E¸Tð %ó 
ˆô ˜(¤OÔ4Ð4Ð4ð × Ò Ø×)Ñ)‰Eä!×1Ñ1°(·.±.ÓAˆEô —h‘h×=Ñ=Ó?ˆØ”U—[‘[¤%§+¡+Ð.Ñ.Ø$‰JàˆJô
 +¨:Ó6ˆÜ�h‰h�l‰l×#Ñ#Ü�H‰H×ÑØ�L‰L˜1˜X×/Ñ/Ð0°Ð2°JÓ?ØÜ(¨Ó.Øð $ó 
ˆð !×*Ñ*ˆŒØˆ
r“   c           	     ó2  — t         j                  j                  }|t        j                  t        j
                  fv r|nt        j
                  t         j                  _        	 | j                  ||«      }|t         j                  _        ||k7  s|j                  |k7  r_t         j                  j                  j                  t         j                  j                  d|› dt        |«      › d�||j                  ¬«      }|S # |t         j                  _        w xY w)zœ
        Like :meth:`index_expr`, but honors ``dtype`` by setting the kernel
        index dtype before emitting, and casting the result if needed.
        r9  rõ  r²  r"  )rU   rà   Ú_index_dtyper¿   r‡  r  rg  r·   rá   r&  r'  rO   rä   )rÂ   r�   r·   Úreal_index_dtyperô   s        r‘   rj  z TritonKernelOverrides.value_expr|	  sÔ   € ô Ÿ8™8×0Ñ0ÐàœuŸ{™{¬E¯K©KÐ8Ñ8‰E¼e¿k¹kô 	
�‰Ôð	5Ø—.‘.  uÓ-ˆCà$4ŒA�H‰HÔ!Ø˜uÒ$¨¯	©	°UÒ(:Ü—(‘(—,‘,×'Ñ'Ü—‘× Ñ Ø�C�5˜œk¨%Ó0Ð1°Ð3ØØ—i‘ið	 (ó ˆCð ˆ
øð %5ŒA�H‰HÕ!ús   Á#C? Ã?Dc           
     ó  — | �zt         j                  j                  �`t        j                  j
                  j                  t        j                  j                  | › d�t         j                  | j                  ¬«      } |j                  j                  d¬«      }|sJ d«       ‚d}|D ]>  }|j                  D ]-  }|j                  dk7  st        |j                  d   «      sŒ+d	} Œ> Œ@ |rd n|}t        j                  j                  | |¬
«      5 } |«       }	d d d «       |r¹	j                   j"                  rt        |«      }t        j                  j
                  j                  t        j                  j                  d|	› dt%        |«      › d|	› d�t'        j(                  |«      |	j*                  |	j                  ¬«      }t-        j.                  |	|«      }
n	}
|
j0                  j3                  «       |
S # 1 sw Y   ŒãxY w)Nú.to(tl.int1)r"  Úoutput)Úopz)graph for body does not contain an outputFÚloadrW   T)r§  rÙ  z.shape, r±  r&  )rž  r·   rä   )r¿   r	  r
  rU   rà   rá   r&  r'  r£   rä   ra  Ú
find_nodesr±   Útargetrt   Ú
mask_loadsrž  Úis_boolri   r"   Úwrapr·   r  r  r  Údiscard)r  rl  rm  ÚnodesÚ
need_wherer¥   r«   r§  Únew_maskr�  r  s              r‘   rn  zTritonKernelOverrides.masked“	  s¼  € àÐ¤§¡× 1Ñ 1Ð =Ü—8‘8—<‘<×(Ñ(Ü—‘× Ñ Ø�&˜Ð%Ü—j‘jØ—j‘jð	 )ó ˆDð —
‘
×%Ñ%¨Ð%Ó2ˆÙÐAÐAÓAˆuàˆ
ð ò 	ˆDØ—y‘yò �Ø—:‘: Ò'Ô+CÀCÇHÁHÈQÁKÕ+PØ!%�JÙñð	ñ #‘¨ˆä�X‰X× Ñ  ¨UÐ Ó3ð 	°xÙ“VˆF÷	ñ à�}‰}×$Ò$Ü˜U›�ä—H‘H—L‘L×)Ñ)Ü—‘× Ñ Ø˜6˜( (¬=¸Ó+?Ð*@ÀÀ6À(È'ÐRÜ"×'Ñ'¨Ó.Ø—l‘lØ—l‘lð *ó ˆEô —)‘)˜H f¨eÓ4‰CàˆCà�‰×Ñ˜hÔ'Øˆ
÷)	ð 	ús   ÄG8Ç8Hc                ó¶   — t         j                  j                  j                  | «      }d|› dt         j                  j                  j	                  d|«      › d�S )Nútl.load(ú + Úload_seed_offsetr²  )rU   rà   r±   ÚinputÚseed_offset)rã   rÖ   rô   s      r‘   rù  zTritonKernelOverrides.load_seedÂ	  sI   € ä�h‰h�m‰m×!Ñ! $Ó'ˆà�s�e˜3œqŸx™xŸ}™}×8Ñ8Ð9KÈVÓTÐUÐUVÐWð	
r“   c                ó0  — d| › d�}t         j                  j                  j                  |«      x}r|S t         j                  j                  j	                  | j
                  | j                  ¬«      }t         j                  j                  j	                  t        j                  | j                  ¬«      }t         j                  j                  j                  |› d|› d| › d�«       t         j                  j                  j                  |||f«       ||fS )Nzfrexp(r²  r"  r±  z = triton_helpers.frexp()rU   rà   rá   Útry_getrU  r·   rä   r¿   r‡  r'  rV  Úput)r]  Ú	cache_keyÚcse_valÚmantissar  s        r‘   ÚfrexpzTritonKernelOverrides.frexpÉ	  s×   € ð ˜Q˜C˜q�Mˆ	Ü—h‘h—l‘l×*Ñ*¨9Ó5Ð5ˆ7Ð5ØˆNä—8‘8—<‘<×&Ñ&¨Q¯W©W¸A¿G¹GÐ&ÓDˆÜ—8‘8—<‘<×&Ñ&¬U¯[©[ÀÇÁÐ&ÓHˆÜ	�‰×Ñ×"Ñ"Øˆj˜˜8˜*Ð$<¸Q¸C¸qÐAô	
ô 	
�‰�‰×Ñ˜ X¨xÐ$8Ô9Ø˜(Ð#Ð#r“   c                ó   — t         ‚r©   re  )rã   rŽ   r§  Ú
extra_metas       r‘   Úpartial_accumulatez(TritonKernelOverrides.partial_accumulateØ	  s
   € ô "Ð!r“   )
rã   rð   rŽ   rð   r§  r]   ro  údict[str, Any]r´   rÆ   )r¾   rÇ   rÈ   rÉ   r�  rË   rA  Úcacher6  râ  rg  rj  r|  rn  rù  rm  rp  r¥  r¦  s   @r‘   r%  r%  	  sê   ø„ ñô(ð Ø‡_�_ñ"4ó ó ð"4ðH ñ?ó ð?ð ñ$ó ð$ðL ñó ðð, ñ,ó ð,ð\ ñ
ó ð
ð ñ$ó ð$ð ð"Øð"àð"ð ð"ð #ð	"ð
 
ò"ó ô"r“   r%  c                  óH   — e Zd ZU dZded<   ded<   dd„Zddœdd	„Zd
„ Zd„ Zy)ÚHelperFunctionsz#An ordered set of helper functions.zdict[str, str]Ú_templates_seenú	list[str]Úfinalized_helpersc                ó    — i | _         g | _        y r©   )ru  rw  r$  s    r‘   r�  zHelperFunctions.__init__é	  s   € Ø!ˆÔØ!#ˆÕr“   Ú_triton_helper_fn©Ú	base_namec               óê   — | j                   j                  |«      }|�|S |› t        | j                  «      › �}|| j                   |<   | j                  j	                  |j                  |¬«      «       |S )a9  This accepts a function definition with the function name
        left as a format specifier e.g.

            @triton.jit
            def {name}(arg0, arg1):
                return arg0 + arg1

        We add the templated code to the function set and return the name
        assigned to that function.

        )rã   )ru  rì   rš   rw  rë  rÓ  )r%  Útemplate_coder{  Úexisting_namerã   s        r‘   ri  zHelperFunctions.addí	  sw   € ð ×,Ñ,×0Ñ0°Ó?ˆØÐ$à Ð à�œS ×!7Ñ!7Ó8Ð9Ð:ˆØ.2ˆ×Ñ˜]Ñ+Ø×Ñ×%Ñ% m×&:Ñ&:ÀÐ&:Ó&EÔFØˆr“   c                ó,   — t        | j                  «      S r©   )Úiterrw  r$  s    r‘   Ú__iter__zHelperFunctions.__iter__
  s   € Ü�D×*Ñ*Ó+Ð+r“   c                ó    — | j                   |   S r©   )rw  )r%  r˜  s     r‘   Ú__getitem__zHelperFunctions.__getitem__
  s   € Ø×%Ñ% cÑ*Ð*r“   N©r´   rÆ   )r}  rð   r´   rð   )	r¾   rÇ   rÈ   rÉ   rÊ   r�  ri  r�  rƒ  r�   r“   r‘   rt  rt  ã	  s+   … Ù-à#Ó#Ø Ó ó$ð 4Gõ ò,,ó+r“   rt  c                  ó�  — e Zd ZU dZ ej
                  e¬«      Zded<    ej
                  e¬«      Z	ded<    ej
                  e¬«      Z
ded<    ej
                  e¬«      Zded<   ej                   G d„ d	«      «       Zej                   G d
„ de«      «       Zej                   G d„ de«      «       Zdd„Z	 	 	 	 	 	 dd„Zdd„Zy)r@  zM
    Class representing ND block dimensions, for block pointer analysis.
    )Údefault_factoryr`  rä   rP  rR  rU  c                  óœ   — e Zd ZU ded<   ded<    ej
                  d¬«      Zded<   d„ Zed„ «       Z	e
e	 	 	 	 	 	 dd	„«       «       Zd
„ Zd„ Zy)rJ  rC  Úoriginal_stridesrº  F)Úinitr»  c                óÂ  — t        | j                  «      dkD  sJ ‚t        | j                  «      t        | j                  «      k(  sJ ‚t        t	        t        | j                  «      «      «      }| j                  |k(  | _        t        | j                  «      D ��ci c]  \  }}||“Œ
 }}}t	        t        |«      «      D �cg c]  }||   ‘Œ	 c}| _        y c c}}w c c}w rŒ  )rš   rˆ  rº  rt  rv  Ú_is_identityrR  r»  )r%  Úidentity_sort_idxrÄ  r  Úsorted_dims_by_strides_maps        r‘   Ú__post_init__z*BlockParameters.StrideSorter.__post_init__
  sÊ   € Ü�t×,Ñ,Ó-°Ò1Ð1Ð1Ü�t—}‘}Ó%¬¨T×-BÑ-BÓ)CÒCÐCÐCä $¤U¬3¨t×/DÑ/DÓ+EÓ%FÓ GÐØ $§¡Ð1BÑ BˆDÔô <EÀTÇ]Á]Ó;S×)T±4°1°a¨!¨Q©$Ð)TÐ&Ñ)Tô œsÐ#=Ó>Ó?ö$àð +¨1Ó-ò$ˆDÕ ùó *Uùò$s   ÂCÃCc                ó   — | j                   S r©   )r‹  r$  s    r‘   r¸  z(BlockParameters.StrideSorter.is_identity)
  s   € à×$Ñ$Ð$r“   c                 ó   — y)zBCreate a `StrideSorter` that can be used to sort block parameters.Nr�   ©rÂ   rˆ  r_  s      r‘   r‚  z#BlockParameters.StrideSorter.create-
  s   � r“   c                ób   — | j                   s| j                  D �cg c]  }||   ‘Œ	 c}S |S c c}w r©   )r¸  rº  ©r%  ÚattrrÄ  s      r‘   Úsortz!BlockParameters.StrideSorter.sort4
  s.   € Ø×#Ò#Ø)-¯©Ö7 A˜˜Q›Ò7Ð7ØˆKùò 8ó   ›,c                ób   — | j                   s| j                  D �cg c]  }||   ‘Œ	 c}S |S c c}w r©   )r¸  r»  r“  s      r‘   r¶  z#BlockParameters.StrideSorter.revert9
  s0   € Ø×#Ò#Ø)-×)=Ñ)=Ö> A˜˜Q›Ò>Ð>ØˆKùò ?r–  N©rˆ  zlist[int | sympy.Expr]r_  r{   r´   rJ  )r¾   rÇ   rÈ   rÊ   ÚdataclassesÚfieldr»  rŽ  r=  r¸  rË   r   r‚  r•  r¶  r�   r“   r‘   ÚStrideSorterzBlockParameters.StrideSorter
  s�   … à#Ó#ØÓØ%6 [×%6Ñ%6¸EÔ%Bˆ˜ÓBò	ð 
ñ	%ó 
ð	%ð 
Ø	ð	UØ#9ð	UØFNð	Uà)ò	Uó 
ó 
ð	Uò
	ó
	r“   r›  c                  ó<   ‡ — e Zd Zˆ fd„Ze	 	 	 	 	 	 dd„«       Zˆ xZS )ú$BlockParameters.IdentityStrideSorterc                ó"   •— t         ‰| �  «        y r©   ©rœ  rŽ  ©r%  rŸ  s    €r‘   rŽ  z2BlockParameters.IdentityStrideSorter.__post_init__@
  ó   ø€ Ü‰GÑ!Õ#r“   c           
     óL   —  | |t        t        t        |«      «      «      ¬«      S )N©rˆ  rº  )rt  rv  rš   r‘  s      r‘   r‚  z+BlockParameters.IdentityStrideSorter.createC
  s'   € ñ Ø!1Üœe¤CÐ(8Ó$9Ó:Ó;ôð r“   r˜  )r¾   rÇ   rÈ   rŽ  rË   r‚  r¥  r¦  s   @r‘   ÚIdentityStrideSorterr�  >
  s4   ø„ ô	$ð 
ð	Ø#9ð	ØFNð	à)ò	ó 
ô	r“   r¤  c                  ó@   ‡ — e Zd ZdZˆ fd„Ze	 	 	 	 	 	 dd„«       Zˆ xZS )ú+BlockParameters.TensorDecriptorStrideSorterzT
        Sorts BlockParameters dimensions with strides in descending order.
        c                ó"   •— t         ‰| �  «        y r©   rŸ  r   s    €r‘   rŽ  z9BlockParameters.TensorDecriptorStrideSorter.__post_init__R
  r¡  r“   c                ó¤   — t        t        t        |«      «      «      }	 t        j                  ||d¬«      } | ||¬«      S # t
        $ r |}Y Œw xY w)až  
            If the strides are not all known constants or if the strides are already
            sorted in descending order, return identity sort.

            For example if block_shape @ strides is [ZBLOCK, XBLOCK, YBLOCK] @ [8, 1, 16]
            The indices to sort the strides in descending order will be [2, 0, 1].
            The indices to revert back to the original order will be [1, 2, 0].
            T)Úreverser£  )rt  rv  rš   r'   rr  rs  )rÂ   rˆ  r_  Úidentity_sortrº  s        r‘   r‚  z2BlockParameters.TensorDecriptorStrideSorter.createU
  sa   € ô !¤¤sÐ+;Ó'<Ó!=Ó>ˆMð	)ô !×,Ñ,¨YÐ8HÐRVÔW�ñ
 Ø!1Ø!ôð øô	 "ò )à(’ð)ús   ŸA ÁAÁAr˜  )r¾   rÇ   rÈ   rÉ   rŽ  rË   r‚  r¥  r¦  s   @r‘   ÚTensorDecriptorStrideSorterr¦  L
  s9   ø„ ñ	ô	$ð 
ð	Ø#9ð	ØFNð	à)ò	ó 
ô	r“   r«  c                ó�   — t        | «      }t        d„ | |fD «       «      \  }} |di |D �ci c]  }|||   ||   z   “Œ c}¤ŽS c c}w )z0
        Concatenates block parameters.
        c              3  óF   K  — | ]  }t        j                  |«      –— Œ y ­wr©   )r™  ÚasdictrH  s     r‘   r­   z*BlockParameters.__add__.<locals>.<genexpr>w
  s   è ø€ ÒB¨q”[×'Ñ'¨×*ÑBùs   ‚!r�   )rM  r²   )r%  rm  rÂ   rP  rQ  rº  s         r‘   Ú__add__zBlockParameters.__add__r
  sR   € ô �4‹jˆÜÑB°T¸5°MÔBÓB‰ˆˆ1ÙÑ9°aÖ8¨s�c˜1˜S™6 A c¡F™?Ñ*Ò8Ñ9Ð9ùÒ8s   «Ac                óî   — |j                  | j                  |¬«      }t        di t        j                  | «      j                  «       D ��ci c]  \  }}||j                  |«      “Œ c}}¤Ž}||fS c c}}w )zÀ
        Sort `BlockParameter` with stride_sorter_cls. Returns block parameters
        as well as a `StrideSorter` which contains information on how the sort
        can be reverted.
        )r_  r�   )r‚  rR  r@  r™  r®  rµ  r•  )r%  r^  r_  rK  rº  r»  rA  s          r‘   rp  z,BlockParameters.maybe_sort_with_stride_orderz
  s~   € ð *×0Ñ0°·±ÈÐ0ÓSˆÜ ñ 
ô !,× 2Ñ 2°4Ó 8× >Ñ >Ó @÷á�C˜ð �]×'Ñ'¨Ó,Ñ,óñ
ˆð �}Ð$Ð$ùós   ÁA1c                ó¦   ‡— ˆfd„}t        di t        j                  | «      j                  «       D ��ci c]  \  }}| ||«      “Œ c}}¤ŽS c c}}w )zA
        Remove dimensions where removable_dims is True.
        c                óR   •— t        | ‰«      D ��cg c]	  \  }}|s|‘Œ c}}S c c}}w r©   )r·  )ÚitÚitemÚis_removableÚremovable_dimss      €r‘   Úfilter_dimsz0BlockParameters.remove_dims.<locals>.filter_dims�
  s3   ø€ ô +.¨b°.Ó*A÷á&�D˜,Ù#ò óð ùó s   ‘#r�   )r@  r™  r®  rµ  )r%  r¶  r·  rº  r»  s    `   r‘   rd  zBlockParameters.remove_dims‹
  sO   ø€ ô
	ô ñ 
Ü5@×5GÑ5GÈÓ5M×5SÑ5SÓ5U×V©¨¨cˆs‘K Ó$Ñ$ÓVñ
ð 	
ùÛVs   ´AN)rm  r@  r´   r@  )r^  ztype[StrideSorter]r_  r{   r´   z4tuple[BlockParameters, BlockParameters.StrideSorter])r¶  rG  r´   r@  )r¾   rÇ   rÈ   rÉ   r™  rš  rt  rä   rÊ   rP  rR  rU  Ú	dataclassr›  r¤  r«  r¯  rp  rd  r�   r“   r‘   r@  r@  

  sñ   … ñð 0˜k×/Ñ/ÀÔE€EÐÓEØ$5 K×$5Ñ$5ÀdÔ$K€KÐ!ÓKØ 1 × 1Ñ 1À$Ô G€GÐÓGØ 1 × 1Ñ 1À$Ô G€GÐÓGà×Ñ÷&ð &ó ð&ðP ×Ñô˜|ó ó ðð ×Ñô# ló #ó ð#óJ:ð%Ø!3ð%Ø@Hð%à	=ó%ô"
r“   r@  c                  ó*   — e Zd ZdZd„ Zdd„Zd„ Zd„ Zy)Ú"CooperativeReductionWorkspaceCachez‘
    The scratch space used for cooperative reductions can be reused
    after two reduction loops.  This keeps track of what can be reused.
    c                óš   — || _         g | _        g | _        t        j                  t        j
                  «      | _        d| _        d| _        y rŒ  )	r±   Úcurrent_loopÚ
prior_loopÚcollectionsÚdefaultdictÚdequeÚready_for_reuseÚ
loop_countÚstore_count)r%  r±   s     r‘   r�  z+CooperativeReductionWorkspaceCache.__init__¢
  s@   € ØˆŒ	ØˆÔØˆŒÜ*×6Ñ6´{×7HÑ7HÓIˆÔØˆŒØˆÕr“   c                óà   — | j                   j                  |«      }|r|j                  «       S | j                  j	                  |d«      \  }}}| j
                  j                  |||f«       ||fS rœ  )rÁ  rì   Úpopleftr±   Ú	workspacer¼  rë  )r%  ÚnbytesÚcachedÚws_namerY  Ú	ws_offsets         r‘   Úallocatez+CooperativeReductionWorkspaceCache.allocateª
  sk   € Ø×%Ñ%×)Ñ)¨&Ó1ˆÙØ—>‘>Ó#Ð#Ø $§	¡	× 3Ñ 3°F¸EÓ BÑˆ��IØ×Ñ× Ñ  &¨'°9Ð!=Ô>Ø˜Ð#Ð#r“   c                óÈ   — | j                   D ]&  \  }}}| j                  |   j                  ||f«       Œ( | j                  | _         g | _        | xj                  dz  c_        y ©NrW   )r½  rÁ  rë  r¼  rÂ  )r%  rÇ  rÉ  rÊ  s       r‘   Úon_loop_endz.CooperativeReductionWorkspaceCache.on_loop_end²
  s_   € à*.¯/©/ò 	FÑ&ˆF�G˜YØ× Ñ  Ñ(×/Ñ/°¸)Ð0DÕEð	Fà×+Ñ+ˆŒØˆÔØ�Š˜1ÑŽr“   c                óH   — | j                   }| xj                   dz  c_         |S rÍ  )rÃ  )r%  Úpriors     r‘   Úincrement_store_countz8CooperativeReductionWorkspaceCache.increment_store_countº
  s#   € Ø× Ñ ˆØ×Ò˜AÑÕØˆr“   N)rÇ  rµ   )r¾   rÇ   rÈ   rÉ   r�  rË  rÎ  rÑ  r�   r“   r‘   rº  rº  œ
  s   „ ñò
ó$òór“   rº  c                  ó$   — e Zd ZU ded<   d„ Zd„ Zy)ÚFixedTritonConfigzdict[str, int]r$   c                ó    — | j                   |   S r©   ©r$   ©r%  r´  s     r‘   rƒ  zFixedTritonConfig.__getitem__Ä
  s   € Ø�{‰{˜4Ñ Ð r“   c                ó   — || j                   v S r©   rÕ  rÖ  s     r‘   Ú__contains__zFixedTritonConfig.__contains__Ç
  s   € Ø�t—{‘{Ð"Ð"r“   N)r¾   rÇ   rÈ   rÊ   rƒ  rØ  r�   r“   r‘   rÓ  rÓ  À
  s   … àÓò!ó#r“   rÓ  c                  ó   — e Zd ZdZdd„Zy)Ú	TritonCSEz…
    Subclasses CSE to apply the current load mask to the cache key to avoid CSEing
    variables across separate masked blocks.
    c                óZ   — t         j                  j                  x}r||j                  fS |S r©   )rU   rà   Ú
_load_maskrã   )r%  rj  r  s      r‘   Úaugment_keyzTritonCSE.augment_keyÑ
  s,   € Ü—8‘8×&Ñ&Ð&ˆ4Ð&Ø˜tŸy™yÐ)Ð)àÐr“   N)rj  rð   r´   zstr | tuple[str, str])r¾   rÇ   rÈ   rÉ   rÝ  r�   r“   r‘   rÚ  rÚ  Ë
  s   „ ñô
r“   rÚ  c                  óx   — e Zd ZU dZded<   ded<   ded<   ded<   d	Zd
ed<   d„ Z	 	 dd„Z	 d	 	 	 	 	 dd„Zdd„Z	y	)ÚTMACompatibilityCheckerzO
    Checks if the TMA API can be used for load / store triton operations.
    r  rà   r¤  r·   r£   r¾  ÚforceNr  Úbuffer_namec                ó   — d| _         y )Nz2Cannot use TMA descriptor for load / store since: )Úfailed_debug_prefixr$  s    r‘   rŽ  z%TMACompatibilityChecker.__post_init__å
  s
   € Ø#WˆÕ r“   c                ó¾  — | j                   ryt        j                  j                  «       j                  dk(  r4t
        j                  j                  «       d   dk\  rt        j                  s+t        j                  j                  «       j                  dk(  r$t        j                  j                  r
t        «       s!t        j                  d| j                  «       y| j                   r7| j"                  j$                  r!t        j                  d| j                  «       y| j&                  t(        vr,t        j                  d	| j                  | j&                  «       yy)
NTr8  r   é	   Úxpuz}%s Requires triton>=3.4.0, a CUDA device with cc>=9.0 and `use_tensor_descriptor` and `assume_aligned_inputs` options enabledFz/%s stores with `no_x_dim` cannot load 16 bytes.z/%s dtype %s has no CUtensorMapDataType mapping.)rà  rU   ra  r©  rM  r¿   r8  Úget_device_capabilityr$   Úassume_aligned_inputsrÒ   Úuse_tensor_descriptorr   r  Údebugrã  r¾  rà   re  r·   rA   r$  s    r‘   Úcan_use_tmaz#TMACompatibilityChecker.can_use_tmaé
  s  € ð �:Š:Øô —G‘G×7Ñ7Ó9×>Ñ>À&ÒHÜŸ
™
×8Ñ8Ó:¸1Ñ=ÀÒBÜ×4Ò4ä—7‘7×6Ñ6Ó8×=Ñ=ÀÒFä—‘×3Ò3Ü)Ô+ô �I‰Ið[ð ×(Ñ(ôð ð �>Š>˜dŸk™k×2Ò2Ü�I‰IØAØ×(Ñ(ôð à�:‰:Ô2Ñ2Ü�I‰IØAØ×(Ñ(Ø—
‘
ôð
 àr“   c           
     óÂ  — | j                   r}|j                  D �cg c]+  }t        j                  j                  j                  |«      ‘Œ- }}t        j                  j                  j                  t        j                  |«      «      }n!|j                  }t        j                  |«      }t        j                  j                  j                  |d   t        j                  d«      «      s"t        j                  d| j                  |«       y| j                  j                  }|dd D ]„  }t        j                  j                  j                  t        ||z  dt        j                  d«      «      t        j                  d«      «      rŒbt        j                  d| j                  ||«        y t        j                  j                  j                  t        ||z  dt        j                  d«      «      t        j                  d«      «      s#t        j                  d	| j                  ||«       y| j                   �At#        | j                   «      r,t        j                  d
| j                  | j                   «       y|j$                  d   }t        j                  j                  j                  |t        j                  d«      «      r,t        j                  d| j                  |j$                  «       yd}	d}
|j&                  D ])  }t(        j*                  D ]  }t-        ||«      sŒ|}	|}
 Œ) Œ+ |	r|
sJ |› dt(        j*                  › �«       ‚| j.                  j0                  �r;| j2                  �s.|
t(        j4                  v �rt6        |
   }d}| j.                  j8                  D ],  }|j:                  sŒ|j<                  |k(  sŒ |j>                  } n |€-t        j                  d| j                  ||j$                  «       y| j.                  jA                  |«      }|jC                  |	|i«      |z  }t        j                  j                  jE                  |t        j                  d«      «      s-t        j                  d| j                  |j$                  |«       yy	 	 d	 	 	 	 	 	 	 dd„}||z  dz
  }|jG                  tH        |«      jG                  t        |«      }tK        tM        t        jN                  ||	d«      «      «      }|| j.                  jQ                  t6        |
   «      kD  r#t        j                  d| j                  ||«       y| j.                  jS                  |	«      }| j.                  jT                  rW|| j.                  jT                  |   kD  r‚t        j                  d| j                  || j.                  jT                  |   |«       ytW        || j.                  jX                  j[                  |d«      «      | j.                  jX                  |<   yc c}w # t\        $ r. t        j                  d| j                  |j$                  «       Y yw xY w)z±
        Check if the block parameters are valid for TMA.
        If force, we allow relying on symbolic hints equivalent
        to what we check for Triton templates.
        r\  rW   z=%s TMA API requires innermost stride to be 1. Strides are: %sFNé   r   zU%s TMA API requires outer strides to be 16 byte aligned. Dtype bytes: %d, strides: %sz{%s TMA descriptor base must be 16 byte aligned but constant_offset=%s with %d-byte dtype yields a non-16-byte aligned base.z‘%s TMA descriptor base must be 16 byte aligned but buffer %s is recorded as unaligned (e.g. produced by a sub-pointer view / reinterpret_tensor).z>%s innermost block shape cannot load 16 bytes. Block shape: %sz, expr must contain a single block type from zN%s could not find reduction range tree for innermost prefix %s Block shape: %szj%s persistent reduction innermost block shape cannot load 16 bytes. Block shape: %s, persistent RBLOCK: %dc                ó   — | |z  }|r||z  }|S r©   r�   )r]  rç  r›  r  s       r‘   Úindexing_div_repzQTMACompatibilityChecker.are_block_parameters_compatible.<locals>.indexing_div_repº  s   € ð
 ˜a™%�CÙØ! A™g˜Ø�Jr“   zC%s the minimum block size to satisfy expression %s is too large: %dzT%s For block %s, fixed config block size %d is smaller than the minimum required: %dz?%s innermost block shape cannot load 16 bytes. Block params: %sTr©   )r]  rµ   rç  rµ   r›  zsympy.Expr | Noner´   rµ   )/rà  rR  rU   ra  rZ  Ú!replace_backed_symbols_with_hintsr–   Úsympifyrb  r˜   r  rê  rã  r·   r†  r   rá  rr   rP  r›   rÕ   r  r    rà   Úpersistent_reductionr¾  r	  r   rx  r  rf  ÚnumelÚ_get_persistent_RBLOCKÚsubsÚstatically_known_geqrT  r   r9   r  ÚnsolveÚ	max_blockr¹  Úfixed_configr†   Útma_min_block_sizesrì   rw  )r%  Úblock_paramsrB  ÚstrR  Úconstant_offset_exprÚelement_sizer€  Úinnermost_block_shapeÚinnermost_block_typeÚinnermost_block_symtÚblock_type_strÚ
block_symtÚinnermost_tree_prefixÚ
tree_numelr•  Úpersistent_rblockÚinnermost_block_bytesrï  Ú
solve_exprÚsolve_expr_simplifiedÚmin_block_sizes                         r‘   Úare_block_parameters_compatiblez7TMACompatibilityChecker.are_block_parameters_compatible  së  € ð �:Š:ð '×.Ñ.öàô —‘× Ñ ×BÑBÀ2ÕFðˆGð ô $%§7¡7×#3Ñ#3×#UÑ#UÜ—‘˜oÓ.ó$Ñ ð #×*Ñ*ˆGÜ#(§=¡=°Ó#AÐ ô �w‰w×Ñ×7Ñ7¸À¹ÄUÇ]Á]ÐSTÓEUÔVÜ�I‰IØOØ×(Ñ(Øôð
 à—z‘z×*Ñ*ˆØ˜c˜r�lò 	ˆFÜ—7‘7×#Ñ#×;Ñ;Ü ¨Ñ 5°q¼%¿-¹-ÈÓ:KÓLÜ—‘˜aÓ õô —	‘	ØkØ×,Ñ,Ø Øô	ñ ð	ô$ �w‰w×Ñ×7Ñ7ÜÐ0°<Ñ?ÀÄEÇMÁMÐRTÓDUÓVÜ�M‰M˜!Óô
ô �I‰IðHà×(Ñ(Ø$Øôð ð
 ×ÑÐ'Ô,DÀT×EUÑEUÔ,VÜ�I‰Ið.ð ×(Ñ(Ø× Ñ ôð ð !-× 8Ñ 8¸Ñ <Ðô �7‰7×Ñ×3Ñ3Ø!¤5§=¡=°Ó#3ô
ô �I‰IØPØ×(Ñ(Ø×(Ñ(ôð
 à#ÐØ#ÐØ3×@Ñ@ò 	ˆNÜ+×7Ñ7ò �
Ü! .°*Õ=Ø+9Ð(Ø+5Ð(Ùñ	ð	ñ $Ñ(<ð 	
Ø$Ð%Ð%QÔR_×RkÑRkÐQlÐmó	
Ð<ð �K‰K×,Ó,Ø—N“NØ$¬×(EÑ(EÒEô %/Ð/CÑ$DÐ!ØˆJØ—[‘[×,Ñ,ò �Ø—>“> a§h¡hÐ2GÓ&GØ!"§¡�JÙðð Ð!ô
 —	‘	ØdØ×,Ñ,Ø)Ø ×,Ñ,ô	ð Ø $§¡× BÑ BÀ:Ó NÐà%×*Ñ*Ð,@ÐBSÐ+TÓUØñð "ô —7‘7×#Ñ#×8Ñ8Ø%¤u§}¡}°RÓ'8ôô —	‘	ð AØ×,Ñ,Ø ×,Ñ,Ø%ô	ð ðT ðIBð
 ,0ðØ!ðà!ðð )ðð  ó	ð 3°\ÑAÀBÑF�
à(2×(:Ñ(:ÜÐ.ó)ç‘'œ/Ð+;Ó<ð &ô "1ÜÜŸ™Ø1Ø0Øóóó"�ð " D§K¡K×$9Ñ$9ÜÐ3Ñ4ó%ò ô —I‘IØ]Ø×0Ñ0Ø-Ø&ô	ð !à!%§¡×!9Ñ!9Ð:NÓ!O�à—;‘;×+Ò+Ø%¨¯©×(@Ñ(@ÀÑ(PÒPÜŸ	™	ð<à ×4Ñ4Ø*Ø ŸK™K×4Ñ4°^ÑDØ*ôð  %ô GJØ&ØŸ™×7Ñ7×;Ñ;¸NÈAÓNóG�D—K‘K×3Ñ3°NÑCð ùòqøô` ò Ü—	‘	ØUØ×,Ñ,Ø ×,Ñ,ôñ
 ðús&   ›0X"Ò"B/X' ÕBX' ×AX' Ø'4YÙYc                ó   — | j                   S )aH  
        Can you lift the make_tensor_descriptor
        call to the top of the kernel? This requires
        being certain that all of the shape, stride,
        and block_shape information is handled in arguments
        or top level definitions.

        Right now we assume this is always possible if you force TMA.
        )rà  r$  s    r‘   rM  z TMACompatibilityChecker.can_liftþ  s   € ð �z‰zÐr“   r;  )r   )rû  r@  rB  zsympy.Expr | intr´   r£   )
r¾   rÇ   rÈ   rÉ   rÊ   rá  rŽ  rë  r  rM  r�   r“   r‘   rß  rß  Ø
  sm   … ñð ÓØÓØƒOØƒKà"€K�Ó"òXð.à	ó.ðf -.ðcà%ðcð *ðcð 
ó	côJ
r“   rß  c                  óŒ  ‡ — e Zd ZU dZeZded<   eZded<   dZ	e
ZeZded<   eZd	ed
<   dZded<   	 	 	 	 	 	 dr	 	 	 	 	 	 	 	 	 	 	 dsˆ fd„Zdtd„Zdud„Zdvd„Zdwd„Zdxd„Zedyd„«       Zedyd„«       Zdzd„Zdyd„Zd„ Zd„ Zd„ Zd„ Z dyd„Z!d„ Z"edwd„«       Z#ddddddd œ	 	 	 	 	 d{d!„Z$	 d|	 	 	 	 	 	 	 d}d"„Z%d|d#„Z&d$„ Z'd%„ Z(	 	 	 	 	 	 	 	 d~d&„Z)d'„ Z*dd(„Z+d€d)„Z,	 	 	 	 	 	 d�d*„Z-d+Z.d,Z/ed-„ «       Z0dd.œd/„Z1d0„ Z2d‚d1„Z3	 	 	 	 dƒd2„Z4d„d3„Z5	 d…	 	 	 	 	 	 	 	 	 d†d4„Z6d‡d5„Z7d6„ Z8dˆd7„Z9	 	 d‰	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dŠd8„Z:dwd9„Z;d‹d:„Z<	 	 	 	 	 	 dŒd;„Z=	 	 	 	 	 	 	 	 	 	 d�d<„Z>	 	 dŽd=„Z?dŽd>„Z@d?„ ZAd@„ ZBdA„ ZCdB„ ZD	 	 d�dC„ZE	 	 	 	 	 	 d�dD„ZF	 	 	 	 	 	 	 	 d‘dE„ZG	 	 	 	 	 	 	 	 	 	 	 	 d’dF„ZH	 	 	 	 	 	 	 	 	 	 	 	 	 	 d“dG„ZIe	 	 	 	 	 	 d”dH„«       ZJ	 	 	 	 	 	 d•dI„ZK	 	 	 	 	 	 	 	 d–dJ„ZL	 	 	 	 	 	 	 	 	 	 d—dK„ZMd‚dL„ZNdM„ ZOdvdN„ZPd˜dO„ZQdP„ ZRdQ„ ZSeT eUd«      dwdR„«       «       ZVeTdS„ «       ZWeTdT„ «       ZXd™dU„ZYeZj¶                  dydV„«       Z\d…dwdW„Z]edX„ «       Z^dšdY„Z_edZ„ «       Z`e	 	 	 	 	 	 d›d[„«       Zad\„ Zbdœd]„Zcd^„ Zd	 d�	 	 	 	 	 džd_„Zed‡d`„ZfdŸda„Zgd db„Zhdxdc„Zi	 	 	 	 	 	 d¡dd„Zjdxde„Zkd¢df„Zld£dg„Zmd¤dh„Zndydi„Zod¥dj„Zpeqdvdk„«       Zrd¦dl„Zsd§dm„Zteqd¨dn„«       Zud©do„Zvd¦dp„Zw	 	 	 	 	 	 dªdq„Zxˆ xZyS )«r  zdA class to represent a triton kernel and helpers to generate
    triton kernel programmatically
    rt  Úhelper_functionszCallable[[sympy.Expr], str]ÚkexprTztype[BlockPtrOptions]Úblock_ptr_options_clsztype[TensorDescriptorOptions]Útensor_descriptor_options_clsNzbool | NoneÚ3transpose_discontiguous_tensor_descriptors_overrideFc                óÖ  •— || _         || _        || _        || _        t	        ‰	| �  |fi |¤Ž t        | j                  | j                  «      | _	        i | _
        t        «       | _        t        «       | _        t        «       | _        t        t            «       | _        || _        t'        j(                  «       | _        t-        t.        t.        f   «       | _        t3        «       | _        t7        j8                  t,        «      | _        t-        t.        t<        f   «       | _        || _         t7        jB                  «       | _"        d| _#        d| _$        t        tJ           «       | _&        d | _'        | jP                  r| jS                  | jT                  «       | jV                  r| jY                  «        | j[                  «        | jV                  r| j]                  «        d| _/        g | _0        y )Nr   F)1Úoptimize_maskrù  Úis_combo_kernelÚper_subkernel_blocksrœ  r�  rÚ  Únewvar_prefixÚsuffixrá   Úprologue_cacher_   ÚprologueÚpost_loop_combineÚpost_loop_storer   r	   Úoutside_loop_varsrÏ  r¶  ÚcountÚblock_ptr_idÚdictrð   Úblock_ptr_to_bufferrt  r  r¾  r¿  Úpointer_advancementsr  rú  Úhint_overrideÚCounterÚ_load_countsÚ_pdl_load_indexÚ_pdl_has_waitr1   Úautotune_hintsÚtriton_metark  Úcodegen_reduction_numelsrl  Úcooperative_reductionÚinit_cooperative_reductionÚcodegen_range_treeÚinit_cooperative_reduction_maskÚhas_load_with_contiguous_rdimÚstores_with_contiguous_rdim)
r%  ÚtilingrÏ  r  rù  r#  r  r  r¢  rŸ  s
            €r‘   r�  zTritonKernel.__init__  sŠ  ø€ ð $1ˆÔØ(ˆÔØ%4ˆÔØ*>ˆÔ!Ü‰Ñ˜Ñ* 6Ò*Ü˜T×/Ñ/°·±Ó=ˆŒà.0ˆÔÜ(6Ó(8ˆŒÜ1?Ó1AˆÔÜ/=Ó/?ˆÔÜ!+¬C¡Ó!2ˆÔØ#6ˆÔ Ü%ŸO™OÓ-ˆÔÜ#'¬¬S¨¡>Ó#3ˆÔ Ü /Ó 1ˆÔä×#Ñ#¤DÓ)ð 	Ô!ô $(¬¬S¨¡>Ó#3ˆÔ Ø*ˆÔÜ6A×6IÑ6IÓ6KˆÔØ ˆÔØ"ˆÔô )¬Ñ6Ó8ˆÔØ26ˆÔà× Ò Ø×)Ñ)¨$¯)©)Ô4à×%Ò%Ø×+Ñ+Ô-à×ÑÔ!à×%Ò%Ø×0Ñ0Ô2à-2ˆÔ*à68ˆÕ(r“   c                ó:   — t        d„ | j                  D «       «      S )Nc              3  óJ   K  — | ]  }t        |j                  d u«      –— Œ y ­wr©   )r  rï   ©rª   r÷   s     r‘   r­   z2TritonKernel.triton_tensor_ndim.<locals>.<genexpr>S  s   è ø€ ÒQ¸”3�t—‘¨dÐ2×3ÑQùs   ‚!#)Úsumrx  r$  s    r‘   rî   zTritonKernel.triton_tensor_ndimR  s   € ÜÑQÀ×@PÑ@PÔQÓQÐQr“   c                ó^   — dg| j                  «       z  }d||<   ddj                  |«      › d�S )NrÆ   rê  rã  r±  rä  )rî   r7  )r%  rÄ  Úsizess      r‘   Úindexing_size_strzTritonKernel.indexing_size_strU  s9   € Ø�˜4×2Ñ2Ó4Ñ4ˆØˆˆa‰Ø�4—9‘9˜UÓ#Ð$ AÐ&Ð&r“   c                ó¬   — dg| j                  «       z  }| j                  «       D ],  }|j                  €Œ|j                  «       ||j                  <   Œ. |S )NrÞ   )rî   r3  rï   Úblock_size_str)r%  r7  r÷   s      r‘   r6  zTritonKernel.dense_size_listZ  sW   € Ø�˜×/Ñ/Ó1Ñ1ˆØ×+Ñ+Ó-ò 	?ˆDØ�‰Ñ*Ø)-×)<Ñ)<Ó)>��d—o‘oÒ&ð	?ð ˆr“   c                óH   — ddj                  | j                  «       «      › d�S râ  )r7  r6  r$  s    r‘   Údense_size_strzTritonKernel.dense_size_stra  s$   € Ø�4—9‘9˜T×1Ñ1Ó3Ó4Ð5°QÐ7Ð7r“   c                ó  — |j                   €$|j                  «       › d| j                  «       › d�S dg| j                  «       z  }d||j                   <   dj	                  |«      }|j                  «       › d|j                  «       › d|› d�S )	Nú = tl.full(z, True, tl.int1)rÆ   rê  r±  z = tl.full([z], True, tl.int1)[rä  )rï   r  r<  rî   r7  r:  )r%  Úentryr7  r  s       r‘   Úcreate_constant_maskz!TritonKernel.create_constant_maskd  s    € Ø×ÑÐ#à—?‘?Ó$Ð% [°×1DÑ1DÓ1FÐ0GÐGWÐXðð �˜4×2Ñ2Ó4Ñ4ˆØ"%ˆˆe×ÑÑØ—‘˜5Ó!ˆà�‰Ó Ð!ð "Ø×,Ñ,Ó.Ð/Ð/AÀ&ÀÈðLð	
r“   c                ó„  — t         j                  st         j                  j                  sy| j                  }|D �cg c]  }t        |t        j                  «      r|‘Œ  }}t        |«      dk(  ry	 t        j                  j                  j                  | ||«      }t        d„ |D «       «      S c c}w # t        $ r Y yw xY w)NFr   c              3  ó&   K  — | ]	  }|d k(  –— Œ y­wr­  r�   )rª   r€  s     r‘   r­   z4TritonKernel._has_stride1_on_rdim.<locals>.<genexpr>‹  s   è ø€ Ò9 6�6˜Q•;Ñ9ùó   ‚)r$   ÚdeterministicÚtest_configsÚforce_filter_reduction_configsr›   r    rÕ   r	  rš   rU   ra  rZ  Ústride_varsÚZeroDivisionErrorr…   )r!  Úsupport_varsrô   Úreduce_varsrG  s        r‘   Ú_has_stride1_on_rdimz!TritonKernel._has_stride1_on_rdimq  s¹   € ô × Ò ¤F×$7Ñ$7×$VÒ$VàØ×)Ñ)ˆð $ö
àÜ˜c¤=×#@Ñ#@ÔAò ð
ˆð 
ô ˆ{Ó˜qÒ Øð	ÜŸ'™'×*Ñ*×6Ñ6°u¸kÈ<ÓXˆKô Ñ9¨[Ô9Ó9Ð9ùò!
øô !ò 	Ùð	ús   ¼#B.Á1+B3 Â3	B?Â>B?c                ó<   — t        d„ | j                  D «       «       S )Nc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr©   )ra   )rª   rã   s     r‘   r­   z>TritonKernel.has_store_with_contiguous_rdim.<locals>.<genexpr>�  s   è ø€ ò 
Ø(,Ô˜d×#ñ
ùr´  )rc  r0  r$  s    r‘   Úhas_store_with_contiguous_rdimz+TritonKernel.has_store_with_contiguous_rdim�  s'   € äñ 
Ø04×0PÑ0Pô
ó 
ð 
ð 	
r“   c                ó   — t        |«      S r©   )rO   )r%  r·   s     r‘   Údtype_to_strzTritonKernel.dtype_to_str“  s   € Ü˜5Ó!Ð!r“   c                óè   — | j                   xre t        j                  j                  t        j                  j                  «       | j                  j                  | j                  j                  «      S r©   )	rk  rU   ÚchoicesÚ should_use_cooperative_reductionra  r©  rm  ró  Úreduction_numelr$  s    r‘   rS  z-TritonKernel.should_use_cooperative_reduction–  sP   € Ø×$Ñ$ò 
¬¯©×)SÑ)SÜ�G‰G×/Ñ/Ó1Ø�M‰M×ÑØ�M‰M×)Ñ)ó*
ð 	
r“   c                ó  ‡ — ‰ j                   sJ ‚‰ j                  D ]$  }|j                  €Œ|xj                  dz  c_        Œ& ‰ j                  d   }‰ j                  rt        |‰ j                  d   «      }‰ j                  j                  |«      ‰ _        t        ‰ j                  «      ‰ _
        ‰ j                  j                  d«       t        ˆ fd„‰ j                  D «       «      r‰ j                  j                  d«       yy)z/One time setup code for cooperative reductions.NrW   r]  r  a              RSPLIT_NEXT_POWER_OF_2: tl.constexpr = triton_helpers.constexpr_next_power_of_2(RSPLIT)
            RSPLIT_IS_POWER_OF_2: tl.constexpr = RSPLIT == RSPLIT_NEXT_POWER_OF_2
            HAS_RSPLIT: tl.constexpr = RSPLIT > 1
            rsplit_id = tl.program_id(0)
            num_rblocks = (rnumel + RBLOCK - 1) // RBLOCK
            rsplit_chunk = (num_rblocks + RSPLIT - 1) // RSPLIT * RBLOCK
            rsplit_start = rsplit_chunk * rsplit_id
            rsplit_end = rsplit_chunk * (rsplit_id + 1)
            c              3  óZ   •K  — | ]"  }|j                   r‰j                  |«       –— Œ$ y ­wr©   )r  r  ©rª   r÷   r%  s     €r‘   r­   z:TritonKernel.init_cooperative_reduction.<locals>.<genexpr>¹  s0   øè ø€ ò 
àØ× Ò ð ×'Ñ'¨Ó-Ô-ñ
ùs   ƒ(+z>rsplit_end = tl.where(rsplit_end < rnumel, rsplit_end, rnumel))r+  rx  Úgrid_dimrl  rù  r   r±   Ú
semaphoresÚsemaphores_namerº  Ú%cooperative_reduction_workspace_cacherl  Úsplicer…   rV  )r%  r÷   Ú	sem_counts   `  r‘   r,  z'TritonKernel.init_cooperative_reduction�  sî   ø€ à×)Ò)Ð)Ð)ð ×$Ñ$ò 	#ˆDØ�}‰}Ñ(Ø—’ Ñ"–ð	#ð —K‘K Ñ$ˆ	Ø×ÒÜ 	¨4×+<Ñ+<¸XÑ+FÓGˆIØ#Ÿy™y×3Ñ3°IÓ>ˆÔÜ5WØ�I‰Ió6
ˆÔ2ð 	�	‰	×Ñð	ô	
ô ó 
à×(Ñ(ô
ô 
ð
 �I‰I×ÑØPõð
r“   c                ó  — d}| j                   s|› d�}| j                  j                  d|› �«       | j                  «       r| j                  j	                  d«       y | j                   rJ ‚| j                  j                  d«       y )Nz$tl.arange(0, RSPLIT_NEXT_POWER_OF_2)z	[None, :]zrsplit_arange = z½                if RSPLIT_IS_POWER_OF_2:
                    rsplit_mask: tl.constexpr = None
                else:
                    rsplit_mask = rsplit_arange < RSPLIT
                zSrsplit_mask = xmask if RSPLIT_IS_POWER_OF_2 else ((rsplit_arange < RSPLIT) & xmask))re  rl  rV  Ú_has_constant_xmaskr\  )r%  Úrsplit_aranges     r‘   r.  z,TritonKernel.init_cooperative_reduction_maskÂ  s{   € Ø>ˆØ�}Š}Ø,˜o¨YÐ7ˆMØ�	‰	×ÑÐ.¨}¨oÐ>Ô?à×#Ñ#Ô%Ø�I‰I×Ñðõð —}’}Ð$Ð$Ø�I‰I×ÑØeõr“   c                ó2  — | j                   D ]q  }|j                  s| j                  || j                  «       Œ,| j                  sŒ9| j                  j                  |j                  › d| j                  |«      › �«       Œs | j                  r‹t        d„ | j                   D «       «      rS| j                  ddd¬«      }| j                  |«      }| j                  j                  d| j                  |«      › �«       y | j                  | j                  «       y y )Nzbase = c              3  ó4   K  — | ]  }|j                   –— Œ y ­wr©   )Úis_loopr4  s     r‘   r­   z2TritonKernel.codegen_range_tree.<locals>.<genexpr>ä  s   è ø€ Ò= D�4—<•<Ñ=ùs   ‚r5  Tr×   zrbase = )rx  rc  Úiteration_ranges_codegen_headerrl  rk  rV  rf  Úiteration_ranges_ranges_coder…   Ú_get_reduction_symbolsÚ_flatten_reduction_indicesr\  r¹  Úcodegen_reduction_indices)r%  r÷   Úrn_basesÚrbases       r‘   r-  zTritonKernel.codegen_range_tree×  sø   € Ø×$Ñ$ò 		ˆDà—<’<Ø×4Ñ4°T¸4¿9¹9ÕEØ×&Ó&ð —	‘	×#Ñ#Ø—{‘{�m 7¨4×+LÑ+LÈTÓ+RÐ*SÐTõð		ð × Ò ÜÑ=¨D×,<Ñ,<Ô=Ô=à×6Ñ6Ø D°dð 7ó �ð ×7Ñ7¸ÓA�Ø—	‘	× Ñ  8¨D×,=Ñ,=¸eÓ,DÐ+EÐ!FÕGð ×.Ñ.¨t¯y©yÕ9ð !r“   c                 ó   — y)zã
        Indicate whether we need provide numel as arguments for the generated
        kernel calls in the benchmark.

        Should be true for pointwise/reduction kernels but false for triton
        matmul kernels.
        Tr�   r$  s    r‘   Úneed_numel_argszTritonKernel.need_numel_argsï  s   € ð r“   c                ó†   — | j                   xr4 t        j                  j                  | j                  | j
                  «      S r©   )rk  rU   rR  Úshould_use_persistent_reductionrm  r+  r$  s    r‘   rn  z,TritonKernel.should_use_persistent_reductionù  s5   € Ø×$Ñ$ò 
¬¯©×)RÑ)RØ�M‰M˜4×5Ñ5ó*
ð 	
r“   c                ó¬   — | j                   xrG t        | j                  «      | j                  dz   k(  xr  | j                  xr | j                  d   dk(  S )NrW   r  )rò  rš   rl  rj  rù  r$  s    r‘   Úwant_no_x_dimzTritonKernel.want_no_x_dimþ  sY   € à×%Ñ%ò 1Ü�D—K‘KÓ  D×$;Ñ$;¸aÑ$?Ñ?ò1à×!Ñ!ò1ð ×!Ñ! (Ñ+¨qÑ0ð		
r“   c                 ó   — y)Nztl.device_assertr�   r$  s    r‘   Úassert_functionzTritonKernel.assert_function  s   € à!r“   )Ú
copy_shapeÚdense_indexingÚoverride_maskrJ  rK  Úmask_constant_indexc          
     óŠ  ‡ ‡‡‡‡!‡"‡#‡$— ‰ j                  ‰«      Š‰j                  }d}	t        «       Š!t        |t	        j
                  d«      ¬«      D �](  }
t        |
t        j                  «      sJ ‚|	xs t        j                  ‰ |
«      }	|rŒ=t        |
t        j                  «      r?‰ j                  j                  |
j                      }‰!j#                  |j$                  «       Œ–t        |
t        j&                  t        j(                  t        j*                  t        j,                  t        j.                  t        j0                  f«      rŒýt        j3                  ‰ |
«      x}	 €�Œ‰!j5                  |«       �Œ+ t6        j8                  j:                  xs |xs ‰ j<                  duxr ‰dk7  }d}d}t        «       }‰ j?                  «       D ]A  }|jA                  |jB                  «      rd}nd}|j5                  |jE                  «       «       ŒC |r&‰ jF                  rt6        j8                  jH                  s‰rŠ‰jK                  «       rz|sx‰ j<                  sltM        ‰!|z
  «      dk(  r[‰ jO                  ‰«      sJ|rH‰ jP                  dk(  r9	 	 	 	 	 	 dd„Š"	 	 	 	 	 	 dˆ fd	„Š$	 	 	 	 	 	 dˆ"ˆ$fd
„Š#dˆˆˆ!ˆ#ˆ ˆfd„} |«       }|�|S d}d}‰ jS                  ‰«      }ˆˆ fd„}tU        ‰«      rù‰stM        ‰ jW                  «       «      dk(  r |«       \  }}nLtY        dgtM        ‰ jW                  «       «      z  «      }t[        dgtM        ‰ jW                  «       «      z  «      }d|› d|› d�}‰ j\                  s‰ j^                  s|rt        ˆ fd„‰ j`                  D «       «      Š!n
t        «       Š!‰ j<                  r‰!j5                  ‰ j<                  «       tc        |‰!||	‰|¬«      S |�r×|�sÔ‰ jd                  �r±‰ jf                  �r¤‰!ji                  «       }‰ j<                  r|j5                  ‰ j<                  «       t        d„ ‰ j?                  «       D «       «      }|jk                  |«      sq|jm                  |«      }|jo                  «       }t        |tp        «      sJ ‚|js                  |«       |j#                  |j$                  «       |jk                  |«      sŒqdgtM        ‰ jW                  «       «      z  }|D ]o  }t        |tX        «      sJ ‚‰ j?                  «       D ]H  }|ju                  |«      sŒ|jv                  }t        |tx        «      sJ ‚‰ jW                  «       |   ||<   ŒJ Œq ddj{                  t}        tX        |«      «      z   dz   }t[        |«      }d|› d|› d�}n/ |«       \  }}d|› d|› d�}|Š!n|s‰r |«       \  }}d|› d|› d�}|Š!|€|s|r |«       \  } }nd}|rt        |g«      Š!‰ j<                  r‰!j5                  ‰ j<                  «       ‰ j                  ‰!«       tc        |‰!||	‰|¬«      S )zO
        Compute the index and mask to pass to tl.load() or tl.store()
        Frã   ©rº  Nr   Tútl.int32c                óÖ   — t        j                  | |j                  «       «      }|€yt        |j                  gt
        j                  |«      g|gt
        j                  |«      g¬«      S )z§
                Matches expressions of the form:
                    idx = s * xindex

                This implies stride (s,), and shape (XBLOCK,).
                N©rä   rP  rR  rU  )rX   Úmatch_affine_block_exprr  r@  ró  rÕ   rñ   rÿ   )r!  Ú
range_treer€  s      r‘   Úmatch_affine_blockz1TritonKernel.indexing.<locals>.match_affine_block\  sl   € ô -×DÑDØ˜:×,Ñ,Ó.ó�ð �>Øä&Ø%×+Ñ+Ð,Ü!.×!=Ñ!=¸jÓ!IÐ JØ#˜HÜ*×;Ñ;¸JÓGÐHô	ð r“   c                óÊ  •‡‡— |j                  «       }t        j                  dt        j                  t        j
                  |g¬«      ¬«      \  }}t        dt        |j                  «      | j                  t        ||«      «      | j                  t        |||«      «      z   «      }t        j                  j                  Š‰j                  | «      } ‰j                  |j                   «      }t#        j$                  | |||«      }|€y|\  }}	}
t#        j&                  |«      }t        j                  j                  Š‰j)                  |j*                  «      Št-        ˆˆfd„|D «       «      ryt.        j1                  |«      }t3        |‰j5                  |d   «      «      gt7        |dd |dd «      D ��cg c]9  \  }}t9        t3        |‰j5                  |«      «      ‰j5                  |«      «      ‘Œ; c}}z   }|
D �cg c]#  }t;        ||t.        j=                  |«      i«      ‘Œ% }}t?        |D �cg c]  }‰j5                  |«      ‘Œ c}||	|¬	«      S c c}}w c c}w c c}w )
aÍ  
                Matches higher-dimensional blocks coming from FloorDiv and ModularIndexing.

                Example expression to match:
                   sN * ((rindex//(d1 * ... * d(N-1))))
                       + s1 * ModularIndexing(rindex, 1, d1)
                       + ...
                       + s(N-1) * ModularIndexing(rindex, d1 * ... * d(N-2), d(N-1))

                This iterates over a block of shape (dN, ..., d1) and stride
                (sN, ..., s1). (d1,...,d(N-1)) and (s1,...,sN) are
                wildcards that we match.

                Note that dN does not appear in the expression, but we solve for it
                using range tree numels and the other dims.
                zdenom modulo)Úexclude©rÂ   r#   Nc              3  ól   •K  — | ]+  }‰j                  |‰«       xr ‰j                  |«       –— Œ- y ­wr©   )r”  Ústatically_known_power_of_2)rª   ró  rø  rZ  s     €€r‘   r­   zETritonKernel.indexing.<locals>.match_mod_div_block.<locals>.<genexpr>¿  sH   øè ø€ ò ð ð !×=Ñ=¸eÀYÓOÐOò HØ$×@Ñ@ÀÓGÐGóHñùs   ƒ14r   rW   r{  ) r  r–   ÚsymbolsrA  rB  ÚWildr†   rš   r^  r  r   r   rU   ra  rZ  Úremove_precomputed_replacementsró  rX   Úmatch_mod_div_block_exprÚget_slice_numelsrø  rf  r…   rÕ   rñ   r   rX  r·  r   rN   rÿ   r@  )r!  r}  Ú	index_varrï  ÚmoduloÚnum_dimsró  Úmatch_resultÚdimsrR  Úblock_index_exprsÚslice_numelsÚlinear_block_sizerz  rP  r�   r  Údrø  rZ  r%  s                     @@€r‘   Úmatch_mod_div_blockz2TritonKernel.indexing.<locals>.match_mod_div_blockr  sd  ú€ ð& '×-Ñ-Ó/�	ô !&§¡Ø"Ü!×)Ñ)¬%¯*©*¸y¸kÔJô!‘��vô
 Øô ˜
×(Ñ(Ó)àŸ™¤H¨Y¸Ó$>Ó?ØŸ+™+¤o°iÀÈÓ&OÓPñQó	�ô& Ÿ7™7×+Ñ+�Ø ×@Ñ@ÀÓG�Ø ×@Ñ@À×AQÑAQÓR�ä2×KÑKØ˜9 e¨Xó �ð  Ð'Øð !ñ	ØØØ%ä2×CÑCÀDÓI�ô Ÿ7™7×+Ñ+�Ø ŸN™N¨:×+<Ñ+<Ó=�	Üô ð ".ôô ð
  ô %2×$@Ñ$@ÀÓ$LÐ!äØ)Ø ×8Ñ8¸Àa¹ÓIóð1ô '*¨,°q°rÐ*:¸DÀÀ¸HÓ&E÷ñ #˜˜sô ÜØ-¨x×/OÑ/OÐPUÓ/Vóð !×8Ñ8¸Ó=õ	óñ1�ð( !2ö	3ð ô Ø˜y¬-×*HÑ*HÈÓ*TÐUõð3�ð 3ô 'ØHLÖMÀ1˜8×;Ñ;¸AÕ>ÒMØ +Ø#Ø)ô	ð ùó%ùò3ùò Ns   Æ7>IÇ?(IÈ2I c                ó~   •— ‰‰fD ]5  }t        j                  | |j                  «       «      } |||«      }|€Œ3|c S  y)ze
                Match a block indexing subexpression involving a single range tree.
                N)rX   Úfactor_index_exprr  )r�   r}  Ú
match_funcÚfactored_index_exprÚmatchr~  r’  s        €€r‘   Úmatch_block_subexprz2TritonKernel.indexing.<locals>.match_block_subexprì  s\   ø€ ð 'Ø'ð#ò 	%�Jô +>×*OÑ*OØ˜j×/Ñ/Ó1ó+Ð'ñ 'Ð':¸JÓG�EØÑ(Ø$šð	%ð r“   c            	     óÜ  •— t        ‰‰j                  j                  «       D � �ci c]  \  } }| |j                  “Œ c}} «      }‰j	                  «       }|D �cg c]&  }t        j                  ||j                  «       «      ‘Œ( }}t        d„ |D «       «      }t        «       }t        ||«      D ]@  \  }}t        |j                  |j                  «      «      dkD  r y  ‰||«      }	|	€ y ||	z  }ŒB |t        |«      z
  }
‰j                  ‰«       t         j"                  j$                  r‰j&                  n‰j(                  }t         j"                  j$                  rd}t        j*                  }n‰t-        t.        ‰«      Š‰j1                  «       }‰j2                  	 �‰j2                  }nt         j"                  j4                  }t7        ‰d«      r|‰d uz  }|rt        j8                  nt        j*                  }|j;                  ||
|‰‰j<                  ||¬«      }t?        |t@        «      r8t-        t.        ‰«      Š‰jC                  |jD                  |jF                  ¬«      sy |S c c}} w c c}w )Nc              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr©   )r  r4  s     r‘   r­   zBTritonKernel.indexing.<locals>.match_block_expr.<locals>.<genexpr>  s   è ø€ Ò*Q¸T¨4¯;©;¯=Ñ*Qùó   ‚rW   FÚtemplate_out_shape)rA  rB  rx  r  ry  rM  r^  )rB  )$rN   rë   rµ  r�   r3  rX   Úget_subexpr_involving_symbolr  r   r@  r·  rš   Úintersectionr›   r5  Úfilter_masksr$   rÒ   Úuse_block_ptrr  r  r¤  r
   rß  rM  r  Ú)transpose_discontiguous_tensor_descriptorrÐ   r«  r‚  rø  Ú
issubclassrÌ  r  rA  rB  )r  r•  Úindex_relative_to_xyr_indexrx  r÷   Úindex_subexprsÚrange_symbolsrû  ÚsubexprrA  rÖ   Úoptions_classrM  r^  Útranspose_contiguousÚoptionsrs  r!  r  r˜  r%  rK  s                   €€€€€€r‘   Úmatch_block_exprz/TritonKernel.indexing.<locals>.match_block_expr   s}  ø€ Ü.8Ø°$×2GÑ2G×2MÑ2MÓ2O×P©$¨!¨Q˜A˜qŸv™v™IÓPó/Ð+ð #×5Ñ5Ó7�ð !,ö	"ð ô (×DÑDØ3°T·[±[³]õð"�ð "ô !+Ñ*QÀ[Ô*QÓ Q�Ü.Ó0�Ü%(¨°nÓ%Eò 
+‘M�D˜'ô ˜=×5Ñ5°g×6JÑ6JÓKÓLÈqÒPÙ#ñ 1°¸$Ó?�FØ�~Ù#Ø  FÑ*‘Lð
+ð 5´s¸>Ó7JÑJ�ð ×!Ñ! )Ô,ô —}‘}×2Ò2ð ×.Ò.à×;Ñ;ð ô —=‘=×.Ò.Ø$�HÜ(7×(LÑ(LÑ%ä04Ü/Ð1Jó1Ð-ð  9×AÑAÓC�Hð ×PÑPØ#ð$ð !×TÑTñ -ô
 #ŸM™M×SÑSð -ô ˜tÐ%9Ô:Ø,°
À$Ð0FÑFÐ,ñ 0ô (×CÒCä,×AÑAð &ð (×.Ñ.Ø'Ø$*Ø +Ø'Ø"&§.¡.Ø%Ø&7ð /ó �ô ˜mÔ-DÔEÜ04Ü/Ð1Jó1Ð-ð 5×TÑTØŸ™Ø(/×(?Ñ(?ð Uô ð  $à�ùó} Qùò"s   ¥I#Á+I)c                 óÈ   •— ‰ r7t        ‰ t        «      r‰ › d�d fS ddj                  d„ ‰ D «       «      z   dz   ‰ fS ‰j                  «       t	        ‰j                  «       «      fS )Nz.shaperã  r±  c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr©   ©rð   )rª   rB  s     r‘   r­   zATritonKernel.indexing.<locals>._get_expand_str.<locals>.<genexpr>o  s   è ø€ Ò*F°a¬3¨q¯6Ñ*Fùr´  rä  )r•   rð   r7  r<  r²   r6  )rs  r%  s   €€r‘   Ú_get_expand_strz.TritonKernel.indexing.<locals>._get_expand_strj  sh   ø€ ÙÜ˜j¬#Ô.Ø(˜\¨Ð0°$Ð6Ð6à §¡Ñ*F¸:Ô*FÓ!FÑFÈÑLÈjÐXÐXà×*Ñ*Ó,¬e°D×4HÑ4HÓ4JÓ.KÐKÐKr“   rW   rÙ  r±  z, tl.int32)c              3  óx   •K  — | ]1  }|j                   s#‰j                  |«      s|j                  «       –— Œ3 y ­wr©   )r  r  r  rW  s     €r‘   r­   z(TritonKernel.indexing.<locals>.<genexpr>‡  s6   øè ø€ ò 'àØ×,Ò,°T×5LÑ5LÈTÔ5Rð —N‘N×$ñ'ùs   ƒ7:)r"  c              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr©   ©r  r4  s     r‘   r­   z(TritonKernel.indexing.<locals>.<genexpr>µ  s   è ø€ ò (Ø)-�D—N‘N×$ñ(ùr›  rÞ   rã  rD  rä  r°  r²  r�   )r!  rµ   r}  rl   r´   úBlockParameters | None)r�   rµ   r}  rl   r´   r²  )r´   zBlockDescriptorOptions | None)@Úprepare_indexingr›   r   r8  ÚoperatorÚ
attrgetterr•   r–   r  rÕ   r
  r    r!   rß   rá   râ   rã   r¡  r  rå   ræ   rç   rè   ré   rê   r  ri  r$   rÒ   rt  rÜ  r3  rž  Úvar_listr  Úallow_block_ptrr   rë  rš   Úis_indirect_indexingrø  r¹  rž   r6  rð   r²   rù  r  rx  r  rk  r5  ÚcopyÚissubsetÚ
differencerg  rš  r]  r2  rï   r  r7  r9  rŸ  )%r%  r!  rs  rt  ru  rJ  rK  rv  Ú
index_varsr*  rô   rõ   r  Ú
need_denseÚ
have_denseÚhave_loop_varsÚdense_mask_varsr÷   rª  r©  r  r"  r  r®  Ú
mask_shapeÚ
axis_masksÚ	tmp_masksr-  Úexpand_listr  rz  Úexpand_shape_strrY  r  r~  r˜  r’  s%   ```   `                          @@@@r‘   rL  zTritonKernel.indexing
  s  ÿ€ ð ×%Ñ% eÓ,ˆØ×'Ñ'ˆ
Øˆ
ä%/£\ˆ	Ü˜*¬(×*=Ñ*=¸fÓ*EÔFó 	-ˆCÜ˜c¤5§<¡<Ô0Ð0Ð0Ø#ò ¤}×'NÑ'NØ�có(ˆJñ ØÜ ¤T§X¡XÔ.àŸ(™(×.Ñ.¨s¯x©xÑ8�Ø× Ñ  ×!2Ñ!2Õ3ÜØä×%Ñ%Ü—I‘IÜ×)Ñ)Ü—J‘JÜ—J‘JÜ×'Ñ'ðô
ð ô "/×!CÑ!CÀDÈ#Ó!NÐN�IØòð —M‘M )Ö,ð7	-ô< �M‰M×(Ñ(ò +Øò+à�‰ dÐ*òð �q‰jð	 	ð ˆ
ØˆÜ+5«<ˆà×+Ñ+Ó-ò 	2ˆDØ×&Ñ& t§}¡}Ô5Ø!%‘à"�
Ø×Ñ §¡Ó 0Õ1ð	2ñ ˜t×3Ò3¼¿¹×8SÒ8Sá-Ø1×=Ñ=Ô?ñ "Ø—O’OÜ�I Ñ/Ó0°AÒ5Ø×-Ñ-¨eÔ4Ùà× Ñ  JÒ.ðØ!ðØ/Bðà'óð,xØ!ðxØ/Bðxà'õxðtØ ðà/ðð (ö÷(`ò `ñF 'Ó(ˆGØÐ"Ø�Øˆ
Ø'+ˆØ×%Ñ% eÓ,ˆ	õ	Lô ! Ô'ñ œS ×!5Ñ!5Ó!7Ó8¸AÒ=Ù+:Ó+<Ñ(�
™Lä  ! ¤s¨4×+?Ñ+?Ó+AÓ'BÑ!BÓC�
Ü$ a S¬3¨t×/CÑ/CÓ/EÓ+FÑ%FÓG�à" : ,¨b°°¸;ÐGˆIØ× Ò  D×$8Ò$8Ñ<OÜ&ó 'à $× 0Ñ 0ô'ó ‘	ô '›L�	Ø�ŠØ—‘˜dŸo™oÔ.Ü"ØØØØØØ)ôð ò šjØ×$Ó$¨×)>Ó)>ð. 'Ÿ^™^Ó-�
Ø—?’?Ø—N‘N 4§?¡?Ô3ä'ñ (Ø15×1HÑ1HÓ1Jô(ó �
ð %×-Ñ-¨jÔ9Ø *× 5Ñ 5°jÓ A�IØ#Ÿ-™-›/�CÜ% cÔ+<Ô=Ð=Ð=Ø×&Ñ& sÔ+Ø×%Ñ% c§m¡mÔ4ð %×-Ñ-¨jÕ9ð  #˜e¤c¨$×*>Ñ*>Ó*@Ó&AÑA�Ø&ò K�DÜ% d¬CÔ0Ð0Ð0Ø $× 7Ñ 7Ó 9ò K˜ØŸ>™>¨$Õ/Ø"&§/¡/˜CÜ#-¨c´3Ô#7Ð7Ð#7Ø/3×/CÑ/CÓ/EÀcÑ/J˜K¨Ò,ñ	KðKð ! 3§8¡8¬C´°[Ó,AÓ#BÑBÀSÑH�
Ü$ [Ó1�Ø.¨y¨k¸¸J¸<ÀqÐI‘	á+:Ó+<Ñ(�
˜LØ.¨y¨k¸¸J¸<ÀqÐI�	Ø+‘	Ù¡JÙ-<Ó->Ñ*Ð˜lØ*¨9¨+°RÐ8HÐ7IÈÐKˆIØ'ˆIàÐÙ™ZÙ"1Ó"3‘�‘<à!�áÜ" M ?Ó3ˆIà�?Š?Ø�M‰M˜$Ÿ/™/Ô*à×Ñ˜)Ô$äØØØØØØ%ô
ð 	
r“   c                óÎ  — |j                  «       }t        |t        «      r|r&|r$|dk(  sJ ‚d}n|sd}n|r|dk(  sJ ‚d|›d�}nd|›�}| j                  r)| j                  d   j
                  r|j                  «       s|j                  �rÇ|j                  r!|| j                  v r| j                  |   }||fS |j                  |d¬«      }| j                  j                  |«      }|rt        |«      |fS t        | j                  «      }	t        |t        «      rd|	› �}nd	|	› �}| j                  j!                  |t"        j$                  g ¬
«      }
| j                  j'                  ||
«       t)        ||› d|› �«      }|j                  r+| j*                  j-                  |«       || j                  |<   n| j.                  j-                  |«       t        |t        «      rn|| j0                  |<   t2        j4                  D ]L  }|j7                  |«      }t9        d„ |D «       «      rŒ'| j:                  |   }||vsJ d|› d|› d�«       ‚|||<   ŒN ||fS |j                  |«      }||fS )a•  Generate a block pointer or tensor descriptor for Triton kernel operations.

        This method creates either a block pointer (for regular Triton operations) or
        a tensor descriptor (for TMA operations) based on the indexing type. It handles
        caching and reuse of descriptors for performance optimization.

        Args:
            name: The name of the buffer/tensor being accessed
            var: The variable name for the pointer
            indexing: Block pointer options or tensor descriptor options containing
                     indexing information and boundary check settings
            other: Additional parameters string (e.g., padding options)

        Returns:
            A tuple containing:
            - block_descriptor: The generated block pointer or tensor descriptor variable name
            - other: Modified additional parameters string with boundary check options
        ú, other=0.0rÍ   ú, boundary_check=z, padding_option='zero'r\  F)rˆ  rJ  Útma_descriptorr"  rO  c              3  ó–   K  — | ]A  }t         j                  j                  j                  |t	        j
                  d «      «      –— ŒC y­w©r   N)rU   ra  rZ  rb  r–   r˜   )rª   rÖ   s     r‘   r­   z1TritonKernel.codegen_block_ptr.<locals>.<genexpr>C  s=   è ø€ ò ð !'ô ŸG™G×,Ñ,×DÑDØ &¬¯©°aÓ(8÷ñùs   ‚AA	z#duplicate advancement for pointer 'z' at type 'rK  )rš  r•   rÌ  rk  rx  rc  r*  rM  r  rÓ  rá   rh  rð   Únextr  r×  Únamedvarr¿   Úuint64ri  r^   r  rV  rl  r!  rÕ   r	  rÞ  rc  r"  )r%  rã   rô   rL  rm  ÚcheckÚblock_descriptorÚblock_ptr_lineÚ	block_varÚblock_descriptor_idÚ	named_varÚ	line_bodyr  Úadvance_offsetsÚadvancementss                  r‘   Úcodegen_block_ptrzTritonKernel.codegen_block_ptrì  sµ  € ð2 ×'Ñ'Ó)ˆÜ�hÔ 7Ô8Ù™ð  Ò-Ð-Ð-Ø‘áà‘ÙØ Ò-Ð-Ð-Ø+¨E¨9Ð4KÐL‘à+¨E¨9Ð5�ð ×!Ò!Ø× Ñ  Ñ$×,Ò,Ø×#Ñ#Ô%Ø×ÓØ× Ò  S¨D×,?Ñ,?Ñ%?ð $(×#6Ñ#6°sÑ#;Ð ðh   Ð&Ð&ðe "*§¡°¸e Ó!D�Ø ŸH™H×,Ñ,¨^Ó<�	ñ Ü˜y›>¨5Ð0Ð0ä&*¨4×+<Ñ+<Ó&=Ð#Ü˜h¬Ô8Ø)2Ð3FÐ2GÐ'HÑ$à)7Ð8KÐ7LÐ'MÐ$Ø ŸH™H×-Ñ-Ø$¬E¯L©LÀð .ó �	ð —‘—‘˜^¨YÔ7ä(¨Ð2BÐ1CÀ3À~ÐFVÐ/WÓX�	Ø×$Ò$Ø—M‘M×+Ñ+¨IÔ6à/?�D×'Ñ'¨Ò,à—I‘I×'Ñ'¨	Ô2ä˜h¬Ô8ð BF�D×,Ñ,Ð-=Ñ>ô !.× =Ñ =ò I˜Ø*2×*BÑ*BÀ4Ó*H˜ô ñ ð +:ô	ô ð %à'+×'@Ñ'@ÀÑ'F˜Ø/°|ÑCð ØAÐBRÐASÐS^Ð_cÐ^dÐdeÐfóÐCð :I˜Ð%5Ò6ð!Ið&   Ð&Ð&ð  (Ÿ™¨sÓ3ÐØ Ð&Ð&r“   c                ó  — d|› d|j                   › d�}|j                  }|j                  }|j                  j                  s6|j                  j                  |«      }|j                  j                  |«      }t        t        |j                   |«      «      D ]8  \  }\  }	}
t        j                  j                  j                  |	|
«      sŒ4d||<   Œ: |j                  j                  s!|j                  j                  |«      |_        n||_        |j                  ||j                   |j                  dd¬«      \  }}t        j                  j                  |«      }|| j                   j"                  v rU| j                   j"                  |   }t%        |t&        «      s,t        j                  j                  |j(                  d   «      }|› dt+        |«      › d�}t%        |t,        «      rd	|› d|› |› d�S | j/                  |||«      S )
Nr°  r±  r²  FT©r½  r¾  r   r  ú	tl.store()rI  rF  rH  rK  r¸  r¶  rR  r·  rU   ra  rZ  rb  r•  rÅ  rP  Ú	get_dtyper±   Úinplace_buffersr•   rd   Úother_namesr‚  r×  Úcodegen_descriptor_store_line)r%  rã   rL  rJ  r§  rm  rF  rH  r˜  rz  Úbroadcast_dimrY  Ústore_dtypeÚbufs                 r‘   Úcodegen_block_ptr_store_linez)TritonKernel.codegen_block_ptr_store_lineT  sç  € ð # 5 '¨¨H×,@Ñ,@Ð+AÀÐCˆð
 #×2Ñ2ˆØ$×6Ñ6ÐØ×%Ñ%×1Ò1Ø&×4Ñ4×;Ñ;¸OÓLˆOØ (× 6Ñ 6× =Ñ =Ð>OÓ PÐô *3Ü�×$Ñ$ oÓ6ó*
ò 	/Ñ%ˆCÑ%�#�}ô �w‰w×Ñ×7Ñ7¸¸]ÕKØ).Ð! #Ò&ð		/ð ×%Ñ%×1Ò1Ø)1×)?Ñ)?×)DÑ)DÐEVÓ)WˆHÕ&à):ˆHÔ&à×9Ñ9ØØ× Ñ Ø× Ñ Ø Øð :ó 
‰ˆˆqô —g‘g×'Ñ'¨Ó-ˆØ�4—9‘9×,Ñ,Ñ,Ø—)‘)×+Ñ+¨DÑ1ˆCÜ˜c¤:Ô.ÜŸg™g×/Ñ/°·±ÀÑ0BÓC�Ø�'˜Ô/°Ó<Ð=¸QÐ?ˆÜ�h¤Ô0Ø˜y˜k¨¨E¨7°5°'¸Ð;Ð;Ø×1Ñ1°)¸XÀuÓMÐMr“   c                ó`   — |› dt         j                  j                  |j                  «      › d�S )zFGenerate the descriptor load line. Override for backend customization.z.load(r²  ©rU   rà   r¹  rU  )r%  rÐ  rL  s      r‘   Úcodegen_descriptor_load_linez)TritonKernel.codegen_descriptor_load_line‡  s-   € à"Ð# 6¬!¯(©(×*?Ñ*?À×@PÑ@PÓ*QÐ)RÐRSÐTÐTr“   c                óf   — |› dt         j                  j                  |j                  «      › d|› d�S )zGGenerate the descriptor store line. Override for backend customization.z.store(r±  r²  rå  )r%  rJ  rL  r§  s       r‘   rß  z*TritonKernel.codegen_descriptor_store_line‹  s2   € à�˜G¤A§H¡H×$9Ñ$9¸(×:JÑ:JÓ$KÐ#LÈBÈuÈgÐUVÐWÐWr“   c                óÎ  — |s|sy t        |t        j                  «      sJ ‚| j                  |dd ¬«      }t        |t        «      sJ ‚|j
                  }|j                  «       r|j                  nd }|rt        | j                  |«      «      nd }| j                  ||rdnd ||«      }	| j                  |«      }
| j                  j                  |
|	dt        j                  ¬«       y )NFrI  Ú0)Ú
assignmentr·   )r•   r–   r—   rL  r  r  r&  r:  ÚtexprÚrename_indexingÚindirect_assertÚget_load_bufferrá   r&  r¿   r‡  )r%  r�   rð  rh  r  rL  r  r:  Úsize_strÚlineÚbuffers              r‘   Úcheck_boundszTritonKernel.check_bounds�  sÑ   € ñ ™Øä˜$¤§
¡
Ô+Ð+Ð+Ø—=‘= °ÐRV�=ÓWˆÜ˜(¤OÔ4Ð4Ð4à×&Ñ&ˆ	Ø(0×(9Ñ(9Ô(;�8×$Ò$ÀˆÙ8=”5˜×-Ñ-¨dÓ3Ô4À4ˆð ×#Ñ#Ø™e‘s¨¨x¸ó
ˆð ×%Ñ% hÓ/ˆØ�‰×Ñ˜& $°5ÄÇÁÐÕLr“   c                óô   — |j                  «       s|j                  «       r| j                  S | j                  r5| j                  d   j
                  r|j                  «       s| j                  S | j                  S )Nr\  )	r(  r/  r'  rk  rx  rc  r*  rl  Úloads)r%  rL  s     r‘   rî  zTritonKernel.get_load_buffer©  sb   € Ø× Ñ Ô" h×&:Ñ&:Ô&<à—<‘<Ðà×!Ò!Ø× Ñ  Ñ$×,Ò,Ø×'Ñ'Ô)ð —9‘9Ðà—:‘:Ðr“   c                ó’   — | j                  «       D ]4  }|j                  |«      sŒ|j                  | j                  «       «      c S  y r©   )r3  r2  rÁ  rî   )r%  r  r÷   s      r‘   Ú_range_tree_mask_shapez#TritonKernel._range_tree_mask_shape¸  sE   € Ø×+Ñ+Ó-ò 	BˆDØ�~‰~˜dÕ#Ø—‘ t×'>Ñ'>Ó'@ÓAÒAð	Bð r“   c                ó\   — t        |t        «      r|j                  S | j                  |«      S r©   )r•   rš  rä   rö  )r%  r  s     r‘   Ú_mask_shapezTritonKernel._mask_shape¾  s(   € Ü�dÔ-Ô.Ø—:‘:ÐØ×*Ñ*¨4Ó0Ð0r“   c                ó„   — |€y t        |«      }|D ],  }| j                  |«      }|€ y t        |t        |«      «      }Œ. |S r©   )r²   rø  r?   )r%  rä   r  Úresult_shaper  rÁ  s         r‘   Ú_broadcast_shape_with_masksz(TritonKernel._broadcast_shape_with_masksÃ  sX   € ð
 ˆ=Øä˜U“|ˆØò 	RˆDØ×)Ñ)¨$Ó/ˆJØÐ!ÙÜ0°¼uÀZÓ?PÓQ‰Lð		Rð Ðr“   ztl.extra.cuda.gdc_wait()z%tl.extra.cuda.gdc_launch_dependents()c                 ó²  — t         j                  j                  j                  j                  syt        t        j                  t         j                  j                  j                  «      ryt         j                  j                  ryt        j                  j                  «       j                  dk(  xr$ t         j                  j!                  «       d   dk\  S )NFr8  r   rå  )r¿   rä  r$   rÒ   Ú
enable_pdlr•   rU   rà   rå  ræ  r	  r
  ra  r©  rM  r8  rç  r�   r“   r‘   Ú_enable_pdl_codegenz TritonKernel._enable_pdl_codegen×  sŽ   € ä�‰×%Ñ%×,Ñ,×7Ò7ØÜ”a—h‘h¤§¡× @Ñ @× UÑ UÔVØä�=‰=×ÒØä�G‰G×/Ñ/Ó1×6Ñ6¸&Ñ@ò ;Ü—
‘
×0Ñ0Ó2°1Ñ5¸Ñ:ð	
r“   ©Úconsider_readsc               óÊ  ‡‡‡‡— | j                  «       sy t        j                  j                  Št        j                  j
                  �$t        j                  j
                  j                  nd Šˆˆˆfd„Š|sJ ‚‰d u xs t        ˆfd„|D «       «      }|sy | j                  r%| j                  d   j                  r| j                  }|j                  | j                  «       y )Nc                ó¼   •‡ — ‰€J ‚‰j                   j                  }‰r*t        j                  |‰j                   j                  «      }t        ˆˆ fd„|D «       «      S )Nc              3  ó„   •K  — | ]7  }‰‰j                   j                  |j                  |j                  «      k(  –— Œ9 y ­wr©   )Úmutation_renamesrì   rã   )rª   ÚwÚcurrent_nodeÚdeps     €€r‘   r­   zOTritonKernel._handle_pdl_before_access.<locals>.matching_dep.<locals>.<genexpr>ô  s9   øè ø€ ò àð �|×4Ñ4×8Ñ8¸¿¹ÀÇÁÓHÕHñùs   ƒ=A )Úread_writesÚwritesr¶  r·  Úreadsr…   )r  Ú	prev_depsr   r  Ú	prev_nodes   ` €€€r‘   Úmatching_depz<TritonKernel._handle_pdl_before_access.<locals>.matching_depï  sY   ù€ ØÐ(Ð(Ð(Ø!×-Ñ-×4Ñ4ˆIÙÜ%ŸO™O¨I°y×7LÑ7L×7RÑ7RÓS�	Üô à"ôó ð r“   c              3  ó.   •K  — | ]  } ‰|«      –— Œ y ­wr©   r�   )rª   r‘  r  s     €r‘   r­   z9TritonKernel._handle_pdl_before_access.<locals>.<genexpr>ú  s   øè ø€ Ò,SÀ©\¸!¯_Ñ,Sùs   ƒr\  )rþ  rU   rà   r  ra  Ú	schedulerÚprevious_noder…   rk  rx  rc  rl  rV  ÚGDC_WAIT)r%  Úwait_bufferr   ÚdependenciesÚ	need_waitr  r  r  s     `  @@@r‘   Ú_handle_pdl_before_accessz&TritonKernel._handle_pdl_before_accesså  s³   û€ ð ×'Ñ'Ô)ØÜ—x‘x×,Ñ,ˆä/0¯w©w×/@Ñ/@Ð/LŒA�G‰G×Ñ×+Ò+ÐRVð 	ö	ñ Ðˆ|Ø Ð%ÒS¬Ó,SÀlÔ,SÓ)Sˆ	ÙØà× Ò  T×%5Ñ%5°bÑ%9×%AÒ%AØŸ)™)ˆKà×Ñ˜dŸm™mÕ,r“   c                ó  — | j                  «       sy |j                  dkD  ry | j                  r%| j                  d   j                  r| j
                  }|j                  | j                  «       |j                  | j                  «       y )NrW   r\  )	rþ  Ú	use_countrk  rx  rc  r  rV  r  Ú
GDC_LAUNCH)r%  Úlaunch_bufferÚ
result_vars      r‘   Ú_handle_pdl_after_loadz#TritonKernel._handle_pdl_after_load  so   € Ø×'Ñ'Ô)ØØ×Ñ !Ò#Øà× Ò  T×%5Ñ%5°bÑ%9×%AÒ%AØ ×2Ñ2ˆMð 	×Ñ §¡Ô.Ø×Ñ §¡Õ0r“   c                ó$  — g }d}d }|j                   D ]t  }t        |«      t        u r| j                  |v r|rŒ%d}t        |«      t        u r,| j                  |v r|�|j                  |«       t        |«      }|j                  |«       Œv ||_         y )NFT)Ú_linesrM  rð   r  r  rg  rš   rë  )r%  ÚcodeÚ	new_linesÚhas_waitÚprevious_launchÚls         r‘   Ú_filter_pdlzTritonKernel._filter_pdl  s�   € Øˆ	ØˆØˆØ—‘ò 
	 ˆAÜ�A‹wœ#‰~ $§-¡-°1Ñ"4ÙØà#�HÜ�A‹wœ#‰~ $§/¡/°QÑ"6Ø"Ð.Ø—M‘M /Ô2Ü"% i£.�Ø×Ñ˜QÕð
	 ð  ˆ�r“   c                óP   — | j                   j                  t        |||«      «       y r©   )Úsaved_partial_accumulaterë  rm   )r%  rã   rŽ   r»  ro  s        r‘   rp  zTritonKernel.partial_accumulate$  s$   € ð 	×%Ñ%×,Ñ,Ü˜d N°CÓ8õ	
r“   c                óÆ  ‡‡‡‡‡— | j                   j                  ‰«      }| j                  Š‰‰xx   dz  cc<   t        }| j	                  |«      Š|}t
        j                  j                  ‰«      }t        ||«      }| j                  |d| j                  | |dt        | dd«      ‰¬«      ¬«      }t        |t        «      r"| j                  |j                  «      rd| _        |j#                  «       Š|j%                  «       }	t'        d„ | j)                  |«      j+                  «       D «       «      }
| j-                  |«      rd}nd|
sd}n_| j.                  rQ| j0                  s| j2                  d	   j4                  r,ˆˆˆˆˆfd
„}‰‰   Šd}t7        j8                  t:        d|«      }nd}|	s‰r=|j=                  «       r-| j>                  rdtA        | j>                  «      › �}n
|rd}nd}nd}	 d}tB        jD                  jF                  r&| jH                  jK                  «       }‰|v r|‰   dkD  }	 | j-                  |«       xr | j.                   xr | xr |
}d}|rd}d}d}tM        ‰«      re|}|tN        jP                  tN        jR                  fv r=tB        jD                  jT                  rtN        jV                  }n|dtY        |«      › d�z  }d}�nžt        |tZ        t\        f«      rt| j_                  ‰|||«      \  }}t        |tZ        «      rd|› |› |› |› d�}n| ja                  ||«      }|jc                  ||jd                  |jf                  dd¬«      \  }}n�ti        |«      rd|› d|› d�}|jj                  }d}n^d|› d|jl                  › d|jn                  › |› |› |› d�
}|jp                  r|jp                  }ntr        ju                  |j                  «      }|tN        jP                  tN        jR                  fv r/tB        jD                  jT                  r|dz  }tN        jV                  }|tN        jv                  k(  r/tN        jx                  jz                  €|dz  }tN        jv                  }| j}                  |«      }| j                  |‰«       | j€                  jƒ                  | ||«      ||¬«      }| j…                  ||«       |j†                  dkD  r‰‰xx   dz  cc<   t        |tˆ        «      sJ ‚|jŠ                  |_E        |�r|}|tN        jv                  k(  r#t�        |«      dv rdt�        |«      d k(  rdnd!› d"�}d#|› d$|› d�}| j€                  jƒ                  ||||jp                  ¬«      }|jŠ                  r£|jŽ                  rd%}n|tN        jv                  k(  rd }nd&}| j>                  rtA        | j>                  «      n|}d'|jn                  › d$|› d$|› d�}| j€                  jƒ                  |||| j‘                  |j’                  |jŠ                  «      ¬«      }| j.                  r|j•                  «       s‰s| j–                  j™                  |«       |S )(zc
        Load from the memory location 'name', offset by some indexing expression 'index'.
        rW   TFÚtma_load_for_template_epilogue©r¾  rà  rá  rI  c              3  ó&   K  — | ]	  }|d k(  –— Œ y­wr­  r�   )rª   rÄ  s     r‘   r­   z$TritonKernel.load.<locals>.<genexpr>V  s   è ø€ ò 
ØˆA��Fñ
ùrC  z, eviction_policy='evict_last'r\  c                 ó    •— ‰‰   ‰ kD  r‰s‰ryy)NÚ
evict_lastÚevict_firstr�   )Úexpected_countr*  Úindirect_indexingÚload_countsrã   s   €€€€€r‘   Údecide_laterz'TritonKernel.load.<locals>.decide_latera  s   ø€ Ø˜tÑ$ ~Ò5ÙÑ"3à'Ø$r“   z, eviction_policy='<EP>'z<EP>rÍ   z, other=z	, other=0rÇ  z, cache_modifier='.cg'Nr  r²  r�   rb  rÚ  rÎ  rý  ú), r¬  rT  r"  )ÚTrueÚFalseztl.full([1], r2  r   z
, tl.int1)r°  r±  z0.0ré  r@  )Mr±   re  r%  r   r¸  rU   ra  rÜ  rv   rL  Útma_compatibility_checker_clsr¤   r•   r  rK  r!  r/  r*  r/  r…   Úget_strides_of_loadr¸  Úis_broadcastedrk  rò  rx  rc  rA  rB  rC   r&  Ú_load_otherri   r$   rÒ   Úskip_l1_cacherm  Úbuffer_read_countsrt   r¿   r–  r—  r•  rÀ   rO   r×  rÌ  rØ  ræ  rÅ  rP  rI  rž   r  r  r:  r"  rÕ   rù   r£   r	  r
  rî  r  rá   r&  r  r  rš  r  rð   r¶   rû  rä   r4  r  ri  )r%  rã   r!  rô   Ú	make_lineÚoriginal_indexr·   Úuses_uint8_storagerL  r/  Úis_coalescedÚepr0  rm  Úhas_read_depsr9  r8  ÚcachemodÚappend_broadcasträ   rð  rÐ  Úload_bufferr  Úbcast_operandr   Ú	other_valr-  r*  r.  r/  s    `                         @@@@r‘   rW  zTritonKernel.load+  sr  ü€ ð �i‰i�o‰o˜dÓ#ˆØ×'Ñ'ˆØ�DÓ˜QÑÓÜ=Eˆ	Ø ×5Ñ5°eÓ<ÐØˆÜ—‘×!Ñ! $Ó'ˆÜLÈUÐTWÓXÐØ—=‘=ØØØ&*×&HÑ&HØØØÜ˜dÐ$DÀeÓLØ ð 'Ió 'ð !ó 

ˆô �h¤Ô0°T×5NÑ5NØ�N‰Nô6
ð 26ˆDÔ.à×(Ñ(Ó*ˆ
Ø×*Ñ*Ó,ˆô ñ 
Ø ×4Ñ4°^ÓD×KÑKÓMô
ó 
ˆð ×Ñ˜~Ô.Ø1‰BÙØ1‰BØ×"Ò"Ø×%Ò%¨×)9Ñ)9¸"Ñ)=×)EÒ)E÷%ð %ð )¨Ñ.ˆNØ+ˆBÜ!×)Ñ)Ô*:¸FÀLÓQ‰IàˆBá™:¨8×+<Ñ+<Ô+>Ø×ÒØ"¤=°×1AÑ1AÓ#BÐ"CÐD‘Ù#Ø#‘à%‘àˆEð	ð ˆÜ�=‰=×&Ò&Ø!%§¡×!AÑ!AÓ!CÐð Ð)Ñ)Ø 2°4Ñ 8¸1Ñ <�ð	ð ×#Ñ# NÓ3Ð3ò Ø×)Ñ)Ð)òà!Ð!òð ð	 	ð ˆÙØ/ˆHàÐØ $ˆä# DÔ)ØˆDð œŸ™¬¯©Ð7Ñ7Ü—=‘=×7Ò7Ü!ŸM™M‘Eà˜d¤;¨uÓ#5Ð"6°aÐ8Ñ8�DØŠEô ˜(¤_Ô6MÐ$NÔOØ*.×*@Ñ*@Ø˜#˜x¨ó+Ñ'Ð  %ô ˜h¬Ô8Ø%Ð&6Ð%7¸°w¸r¸dÀ8À*ÈAÐN‘Dà×<Ñ<Ð=MÈxÓX�DØ&×DÑDØØ×(Ñ(Ø×(Ñ(Ø#'Ø#ð Eó ‘�‘eô ' ~Ô6Ø! #  d¨>Ð*:¸"Ð=�Ø#+×#6Ñ#6Ð Ø‘à! #  d¨8×+=Ñ+=Ð*>¸cÀ(×BSÑBSÐATÐUWÐTXÐY^ÐX_Ð`hÐ_iÐijÐk�ð ×(Ò(Ø$×1Ñ1‘Eä)×9Ñ9¸(¿.¹.ÓI�Eð œ%Ÿ-™-¬¯©Ð8Ñ8Ü—M‘M×8Ò8àÐ)Ñ)�ÜŸ™�ØœŸ
™
Ò"¤u§}¡}×'8Ñ'8Ð'@ð ˜Ñ&�ÜŸ
™
�à×*Ñ*¨8Ó4ˆØ×&Ñ& {°DÔ9Ø—X‘X×&Ñ&Ø™ 4›°¸Uð 'ó 
ˆ
ð 	×#Ñ# K°Ô<Ø×Ñ !Ò#Ø˜Ó Ñ"ÓÜ˜*Ô&7Ô8Ð8Ð8Ø'×1Ñ1ˆ
ÔâØ&ˆMØœŸ
™
Ò"¤s¨:£Ð:KÑ'Kà#¬¨Z«¸FÒ)B¡AÈÐ#JÈ*ÐUð ð & m _°BÐ7GÐ6HÈÐJˆDØŸ™×*Ñ*Ø˜T¨°h×6KÑ6Kð +ó ˆJð ×!Ò!Ø×*Ò*Ø ‘DØœeŸj™jÒ(Ø!‘Dà�Dà7;×7GÒ7G”M $×"2Ñ"2Ô3ÈTð ð # 8×#4Ñ#4Ð"5°R¸
°|À2ÀiÀ[ÐPQÐR�Ø!ŸX™X×.Ñ.ØØØØ×:Ñ:Ø"×(Ñ(¨(×*<Ñ*<óð	 /ó �
ð ×$Ò$¨X×-?Ñ-?Ô-AÉ*Ø×"Ñ"×&Ñ& zÔ2àÐr“   c           	     ó  — | j                   j                  |«      }|}t        j                  j	                  |«      }d}|�|dk(  r*|dk(  xs t        | dd«      }	| j                  | |d|	|¬«      }| j                  |d|du ||dk(  ¬«      }
t        |
t        «      r6| j                  |
j                  «      r| j                  j                  |«       || j                   j                  v }| j                  |«      }|r'|r%| j                   j#                  t%        |d	«      «       t        |
t&        t(        f«      r-| j+                  |||
«      \  }}| j-                  ||
|||«      }�nV|€¯|
j.                  }t1        |«      r~| j2                  r|d
| j5                  «       › d�z  }nZ|j6                  �Nt9        d„ |j6                  D «       «      s2dj;                  t=        t>        |j6                  «      «      }|d
|› d�z  }d|› d|› d|› d|
j@                  › d�	}n¥|dk(  r’d| _!        |
j.                  }t1        |«      rZ|j6                  �Nt9        d„ |j6                  D «       «      s2dj;                  t=        t>        |j6                  «      «      }|d
|› d�z  }d|› d|› d|› d|
j@                  › d�	}ntE        d|› �«      ‚tG        jH                  «       }| jJ                  s7| jL                  r+|jO                  | jQ                  || j                   «      «       | jS                  | j                   |d¬«       | j                   j#                  t%        ||«      «       | jJ                  s| jT                  jW                  |«       |jY                  «        y)zn
        store the 'value' to the memory location 'name', offset by some indexing expression 'index'.
        NÚtmaÚ	tma_storeFTr(  Ú
atomic_add)rt  rJ  rK  rv  ztl.debug_barrier()ú.broadcast_to(r²  c              3  ó8   K  — | ]  }t        |«      d k(  –— Œ y­w©rÞ   Nr­  rH  s     r‘   r­   z%TritonKernel.store.<locals>.<genexpr>8  s   è ø€ ò 9Ø&'”C˜“F˜c•Mñ9ùó   ‚r±  rÛ  rÎ  r1  c              3  ó8   K  — | ]  }t        |«      d k(  –— Œ y­wrK  r­  rH  s     r‘   r­   z%TritonKernel.store.<locals>.<genexpr>D  ó   è ø€ Ò?¨aœC ›F c�MÑ?ùrL  ztl.atomic_add(z, sem='relaxed')zstore mode=rÿ  )-r±   rU  rU   ra  rÜ  r¤   r4  rL  r•   r  rK  r!  r0  rë  rÝ  r6  ÚstoresrV  r^   r×  rÌ  rØ  rã  r  rž   r  r<  rä   rc  r7  r9  rð   r:  Úatomic_add_foundr-  Ú
contextlibÚ	ExitStackrk  r+  Úenter_contextÚguard_cooperative_storer  r  ri  Úclose)r%  rã   r!  r§  Úmoderô   r;  r·   rK  rà  rL  Ú
is_inplacer6  rÐ  rm  rð  Úindexing_strÚvalue_shapeÚ
exit_stacks                      r‘   ÚstorezTritonKernel.storeø  se  € ð �i‰i×Ñ˜tÓ$ˆØˆÜ—‘×!Ñ! $Ó'ˆà$(Ð!Øˆ<˜4 5š=Ø˜E‘MÒF¤W¨T°;ÀÓ%FˆEØ(,×(JÑ(JØØØØØ ð )Kó )Ð%ð —=‘=ØØØ˜d�lØ&?Ø $¨Ñ 4ð !ó 
ˆô �h¤Ô0°T×5NÑ5NØ�N‰Nô6
ð ×,Ñ,×3Ñ3°DÔ9ð ˜TŸY™Y×6Ñ6Ð6ˆ
Ø×,Ñ,¨^Ó<ˆÙ™.Ø�K‰K×!Ñ!¤,¨tÐ5IÓ"JÔKä�h¤Ô2IÐ JÔKØ&*×&<Ñ&<¸TÀ3ÈÓ&QÑ#Ð˜eà×4Ñ4Ø�hÐ 0°%¸óŠDð ˆ\ð $×-Ñ-ˆLÜ$ UÔ+Ø×'Ò'à  n°T×5HÑ5HÓ5JÐ4KÈ1Ð$MÑM‘LØ—[‘[Ð,´Sñ 9Ø+0¯;©;ô9ô 6ð #'§)¡)¬C´°U·[±[Ó,AÓ"B�KØ  n°[°MÀÐ$CÑC�LØ˜s˜e 4¨ ~°S¸¸¸rÀ(×BSÑBSÐATÐTUÐV‰DØ�\Ò!Ø$(ˆDÔ!Ø#×-Ñ-ˆLä% eÔ,Ø—K‘KÐ+ÜÑ?°5·;±;Ô?Ô?à"Ÿi™i¬¬C°·±Ó(=Ó>�Ø .°°¸QÐ ?Ñ?�Ø# C 5¨¨\¨N¸#¸e¸WÀBÀx×GXÑGXÐFYÐYiÐj‰Dä%¨°D°6Ð&:Ó;Ð;ä×)Ñ)Ó+ˆ
Ø×$Ò$¨×)CÒ)CØ×$Ñ$ T×%AÑ%AÀ$ÈÏÉÓ%TÔUà×&Ñ& t§{¡{°DÈÐ&ÔNØ�‰×Ñœl¨4°Ó6Ô7à×$Ò$Ø×"Ñ"×&Ñ& uÔ-à×ÑÕr“   c                óZ   — | j                   j                  d|› dt        |«      › d�«       y )Nztl.device_assert(r±  r²  )r'  rV  rS  )r%  ÚcondÚmsgs      r‘   Údevice_assert_asyncz TritonKernel.device_assert_asyncX  s(   € Ø�‰×ÑÐ!2°4°&¸¼4À»9¸+ÀQÐGÕHr“   c                ó”   — | j                   j                  «       }|j                  t        |d|› d�«      «       |j	                  «       S )z«
        For cooperative reductions only one thread block should write out the result.
        We rotate which thread block does each write for better parallelism
        zif rsplit_id == (z % RSPLIT):)r[  rÑ  rV  r^   Úindent)r%  rã   rñ  r˜  s       r‘   rT  z$TritonKernel.guard_cooperative_store[  sC   € ð
 ×8Ñ8×NÑNÓPˆØ×Ñœ dÐ.?À¸uÀKÐ,PÓQÔRØ�}‰}‹Ðr“   c                ót   — d }|D ]0  }|€Œt        |d«      sŒ|€|j                  }Œ"||j                  z  }Œ2 |S )Nr  )rÐ   r  )r%  Ú	variablesÚmasksÚelems       r‘   Ú_combine_maskszTritonKernel._combine_masksd  sK   € ØˆØò 	3ˆDØˆ|ØÜ�t˜[Õ)Ø�=Ø ŸN™N‘Eà! D§N¡NÑ2‘Eð	3ð ˆr“   c                óV  — | j                   j                  t        j                  «       | j                  j                  |d   «      }| j                  |d   «      }	| j                  |d   «      }
| j                  |d   «      }|r| j                  j                  |d   «      nd}|r| j                  |d   «      nd}|t        j                  k(  rd}n!|t        j                  k(  rd}nt        d«      ‚ | j                  | j                  |d   g|r|d   gng ¢­Ž  | j                  j                  | j                  d	|› d
|› d
|	› d
|
› d
|› d
|› d
|› d
|› d
|› d
|› d
|› d�||j                  ¬«      }| j!                  | j                  |«       | j#                  |||«      }||_        |S )z3
        See [Note: Inductor bucketize op]
        r   rW   r#   r   rÆ   ry  ztl.int64z5Bucketize only supports indexing with int32 and int64z'triton_helpers.bucketize_binary_search(r±  z, )r"  )r(  ri  r1   ÚONE_ELEMENT_PER_THREADr±   re  r¹  r¿   r‡  r  r-  r  r'  rá   r&  rä   r  rf  r  )r%  r¸  Ú
boundariesÚboundary_indicesÚindexing_dtyper(  ÚsorterÚsorter_indicesÚboundaries_ptrÚboundary_sizeÚboundaries_underlying_numelÚboundary_strideÚ
sorter_ptrÚsorter_strideÚtriton_dtyper�  rd  s                    r‘   Ú	bucketizezTritonKernel.bucketizep  sÇ  € ð$ 	×Ñ×Ñ¤× CÑ CÔDàŸ™Ÿ™¨°A©Ó7ˆØ×)Ñ)¨*°Q©-Ó8ˆØ&*×&7Ñ&7¸
À1¹Ó&FÐ#Ø×+Ñ+¨J°q©MÓ:ˆÙ39�T—Y‘Y—_‘_ V¨A¡YÔ/¸vˆ
Ù8>˜×)Ñ)¨&°©)Ô4ÀFˆàœUŸ[™[Ò(Ø%‰LØœuŸ{™{Ò*Ø%‰Lä%ØGóð ð 	'ˆ×&Ñ&Ø�L‰L˜* Q™-ð	
Ù:@¨F°1©I©;Àbó	
ð —‘×"Ñ"Ø�L‰LØ5°f°X¸RØÐ˜b  ¨rÐ2MÐ1NÈbÐQ`ÐPaÐacØÐ  Øˆn˜BØˆg�RØˆl˜"˜]˜O¨2ØÐð ðð !Ø—,‘,ð #ó 
ˆð 	×#Ñ# D§L¡L°&Ô9à×#Ñ# FÐ,<¸nÓMˆØ ˆÔàˆr“   c                óž   — | j                  «       }|dk(  rd|› d�S | j                  }dg||z
  z  dg|z  z   }|› ddj                  |«      › d�S ©	NrW   z!triton_helpers.promote_to_tensor(r²  rê  rÆ   rã  r±  rä  ©rî   rj  r7  )r%  r§  ÚndimsÚnreducer7  s        r‘   Úreduction_resizezTritonKernel.reduction_resize«  sj   € Ø×'Ñ'Ó)ˆØ�AŠ:Ø6°u°g¸QÐ?Ð?à×)Ñ)ˆØ�˜ ™Ñ)¨V¨H°wÑ,>Ñ>ˆØ�˜˜$Ÿ)™) EÓ*Ð+¨1Ð-Ð-r“   c                óÐ   — | j                  «       }|dk(  rd|› d�|fS | j                  }dg||z
  z  dg|z  z   }|�g |d ||z
   ¢dg|z  ¢­nd }|› ddj                  |«      › d�|fS rw  rx  )r%  r§  rä   ry  rz  r7  r©  s          r‘   Úreduction_resize_and_shapez'TritonKernel.reduction_resize_and_shape´  s£   € Ø×'Ñ'Ó)ˆØ�AŠ:Ø6°u°g¸QÐ?ÀÐFÐFà×)Ñ)ˆØ�˜ ™Ñ)¨V¨H°wÑ,>Ñ>ˆà=BÐ=NÐ9ˆeÐ'�u˜w‘Ð(Ð9¨A¨3°©=Ò9ÐTXð 	ð �˜˜$Ÿ)™) EÓ*Ð+¨1Ð-¨yÐ8Ð8r“   c                ó  — | j                   dk(  r|S | j                  «       | j                   z
  }| j                  «       }|d| dgz   }| j                  j	                  |t        t        |«      ||«      |t        |«      ¬«      S )zC
        Reshape to RBLOCK, collapsing all reduction dims.
        rW   Nr0  r"  )rj  rî   r6  rá   r&  r¥  rð   r²   )r%  rñ  r§  r·   Útarget_ndimr¼  Útarget_shapes          r‘   Úreduction_collapse_dimsz$TritonKernel.reduction_collapse_dimsÀ  s‹   € ð ×"Ñ" aÒ'ØˆLà×-Ñ-Ó/°$×2IÑ2IÑIˆØ×,Ñ,Ó.ˆØ$ \ kÐ2°h°ZÑ?ˆØ�x‰x× Ñ ØÜœ3˜u›: }°lÓCØÜ˜Ó%ð	 !ó 
ð 	
r“   c                ó–   ‡ ‡‡‡‡K‡L‡M‡N‡O‡P‡Q‡R‡S‡T‡U— dKd„ŠRdLˆRfd„}t        j                  ˆRfd„|«      }‰}‰}|rJt        j                  ||«      } ‰R‰«      rt        j                  n‰Š ‰R‰«      rt        j                  n‰Š‰ j
                  sJ ‚t        d„ ‰ j                  D «       «      }	‰ j                  |	«       t        |	«      }	‰ j                  r|	j                  ‰ j                  «       ‰ j                  d   j                  d   }
‰ j                  rY‰ j                  «       }t        |«      dk\  sJ ‚|D �cg c]  }d|v sd	|v sŒ|‘Œ }}d
dj!                  |«      › d�ŠNt#        |«      ŠTn)‰ j%                  «       ŠNt#        ‰ j                  «       «      ŠT‰ j'                  ˆNˆ ˆTfd„|«      }d}dŠKdŠL|‰Kz   ‰Lz   }dddddddœ}d}‰|v rt)        |t"        «      r|\  }}‰ j+                  «       ‰ j,                  z
  ŠO	 	 	 	 	 	 dMˆOˆˆˆ fd„ŠP	 	 	 	 	 	 	 	 dNˆPfd„}dOˆOˆQˆ fd„	}ˆKˆLˆfd„}‰‰|f}|‰ j.                  j0                  v r‰ j.                  j0                  |   S t3        ‰«      }t5        ‰«      }‰|v r‰ j6                  j9                  «       nd}t;        ‰ j                  «       «      }t=        ‰O‰O‰ j,                  z   «      D ]  }d||<   Œ	 t        d„ |	D «       «      }‰‰Lv r_|€J ‚‰ j.                  j?                  |t#        |«      ¬«      ‰ j.                  j?                  |t#        |«      ¬«      f}|D ]	  }||_         Œ nc‰|v r2|€J ‚‰ j.                  j?                  |t#        |«      ¬«      }||_         n-‰ j.                  j?                  |t#        |«      ¬«      }||_         dj!                  |	«      ŠMˆMfd„ŠU‰ jB                  �råtD        jF                  jI                  ‰‰«      }d„ ŠSdPˆ ˆˆSˆUfd „}‰d!k(  rt)        |t"        «      sd} nwt)        |t"        «      r&tK        ||«      D �!�"cg c]  \  }!}" ||!|"«      ‘Œ } }!}"nA‰d"k(  r3‰ j.                  jM                  ‰ jN                  ||jP                  ¬#«      } n	 |||«      } ‰|v rŸt)        | tR        «      sJ ‚|€J ‚|r"d$tU        |«      › d%‰ jW                  |«      › d&�}#nCtU        ‰ j.                  jM                  ‰ jN                  d'|
› d(| › d)�|| jX                  ¬«      «      }#|‰   ŠQ |‰ jN                  || |# |«       «       �n�‰d*k(  r8‰ jZ                  r‰ j]                  |‰|‰U|‰«      }�nd‰ j_                  ‰|«      }�nP‰d+k(  rMt)        | t`        «      sJ ‚| \  }$}%}&t#        ˆˆ fd,„‰ jc                  ‰ jN                  |$|%|&‰O‰«      D «       «      }�nþ‰d!k(  r”t)        |t"        «      rpt)        | t`        «      sJ ‚‰ j.                  j?                  ‰te        tR        |«      jX                  ¬«      }'‰ jg                  ‰ jN                  ||'| d   | d-   ‰O‰«      }�ny‰ ji                  ‰|«      }�net)        | tR        «      sJ ‚ ‰P‰ jN                  | | jP                  «      \  }(})}*‰ j.                  jM                  ‰ jN                  |(|)|*¬«      }�n‰‰Lv rte        tj        |«      d   n|}+‰ j.                  jm                  d.|+› �|t#        ‰ j                  «       «      ¬«      },tD        jF                  jo                  ‰‰«      }‰ j'                  tp        |«      }t)        |t"        «      s¿‰d"k(  r…‰ j                  «       }t        |«      dk\  sJ ‚|D �cg c]  }d|v sd	|v sŒ|‘Œ }}t#        |«      |,_,        d
dj!                  |«      › d�ŠN‰ jr                  ju                  |,› d/‰N› d|› d|› d&�«       n5‰ jr                  ju                  |,› d/‰ j%                  «       › d|› d|› d&�«       ‰|v �rd.|+› d0�}#|€J ‚‰ jr                  ju                  |#› d/‰ j%                  «       › dt        jv                  |«      jx                  › d‰ jW                  |«      › d&�«       |‰   ŠQ|�!d$tU        |«      › d%‰ jW                  |«      › d&�n|
› d�}-‰ jN                  j{                  d1|,› d2|#› d3‰Q› d4|,› d|#› d|› d|-› d5|,› d6 ‰U|,› d7�|,«      › d8|#› d6 ‰U|#› d7�|#«      › d8�«        |‰ j|                  ||,|# |«       «       �n¥t        ‰«      r‰ j]                  |‰|‰U|‰«      }�n‚‰d!k(  �r–d.|› d9�}.d.|› d:�}/‰ jr                  ju                  |.› d/‰ j%                  «       › d;|› d&�«       ‰ jr                  ju                  |/› d<‰ j%                  «       › d|› d&�«       t)        |t"        «      rE|\  }0}1‰ jN                  j{                  d=|.› d2|/› d>|.› d|/› d|0› d|1› dt€        j‚                  › d?�«       n<‰ jN                  j{                  d=|.› d2|/› d@|.› d|/› d|› dt€        j‚                  › d?�«       ‰ jN                  j{                  dA|.› d6 ‰U|.› d7�|.«      › dA|/› d6 ‰U|/› d7�|/«      › dA�	«       |}2‰ j.                  j?                  ‰te        tj        |2«      jX                  ¬«      }'‰ jg                  ‰ j|                  |2|'|.|/‰O‰«      }nætE        j„                  ‰‰«      }3 |3|,|«      }4‰d"k(  r!‰ jN                  ju                  |,› d6|4› �«       n'‰ jN                  ju                  |,› d6 ‰U|4|,«      › �«       ‰t        j†                  k(  rD‰ j.                  jM                  ‰ j|                  |,› dB�t        jˆ                  |,jX                  ¬«      }, |‰ j|                  te        tR        |«      |,d«       ‰ jZ                  �r tD        jF                  jo                  ‰‰«      }t‹        jŒ                  «       }5‰ j|                  ‰ jŽ                  fD ]2  }6|6ju                  dC«       |5j‘                  |6j“                  «       «       Œ4 ‰|v �rm‰‰Lv r9te        t"        tR        tR        f   |«      \  }7}8|7}+tU        |7«      }9tU        |8«      }:nl‰‰Kv r0te        tR        |«      }+tU        |«      }9‰ j•                  |› dD�«      }:n8te        tR        |«      }+‰ j•                  |› dE�«      }9‰ j•                  |› dD�«      }:|+› dF�};‰ j|                  ju                  |;› d6|9› �«       ‰ j—                  |;‰|«      }<‰ j6                  j9                  «       }|+› dG�}=‰ j|                  ju                  |=› d6|:› �«       ‰ j—                  |=|t        jv                  |«      jx                  «      }> |‰ jŽ                  ||<|> |«       «       �n�t        ‰«      r®‰d*k(  sJ ‚te        t"        tR        tR        tR        f   |«      \  }?}@}A‰ j—                  |?t5        ‰«      |d   «      }B‰ j—                  |@t5        ‰«      |d-   «      }C‰ j—                  |At5        ‰«      |dH   «      }D‰ j™                  ‰ jŽ                  |?|@|A|B|C|D‰O‰«	       nä‰d!k(  r’te        t"        tR        tR        f   |«      \  }2}'t)        |t`        «      sJ ‚‰ j—                  |2t5        ‰«      |d   «      }E‰ j—                  |'t5        ‰«      |d-   «      }F‰ jg                  ‰ jŽ                  |2|'|E|F‰O‰«       nM‰ j—                  te        tR        |«      t5        ‰«      |«      }G |‰ jŽ                  te        tR        |«      |Gd«       |5j›                  «        te        tj        |«      ‰ j.                  j0                  |<   t)        |t"        «      r|n|f}H‰ jœ                  jŸ                  |H«       t¡        dI„ |HD «       «      sJ ‚|ret£        H«      D ]W  \  }}I‰‰Lv r|dkD  rŒ‰‰K‰Lz   v r|n|}JIjP                  |Jk7  sŒ+‰ j|                  ju                  I› d6|I› dJt¥        J«      › d&�«       ŒY |S c c}w c c}"}!w c c}w )QzS
        codegen reduction of value to Triton according the reduction_type
        c                óH   — | d uxr | j                   xr | j                  dk  S )Nr„  )r¶   r†  )r‘  s    r‘   Úshould_upcastz-TritonKernel.reduction.<locals>.should_upcastß  s$   € Ø˜D�=ÒK Q×%8Ñ%8ÒK¸Q¿Z¹ZÈ!¹^ÐKr“   c                ót   •—  ‰| j                   «      r$t        j                  | t        j                  «      S | S r©   )r·   r  rÓ  r¿   rÀ   )r§  r„  s    €r‘   Úmaybe_upcastz,TritonKernel.reduction.<locals>.maybe_upcastâ  s4   ø€ ñ ! §¡Ô-ô —‘˜U¤E§M¡MÓ2ðð ðr“   c                ó(   •—  ‰| j                   «      S r©   r~  )r  r„  s    €r‘   ú<lambda>z(TritonKernel.reduction.<locals>.<lambda>í  s   ø€ ©m¸A¿G¹GÓ.D€ r“   c              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr©   r±  r4  s     r‘   r­   z)TritonKernel.reduction.<locals>.<genexpr>÷  ó   è ø€ ÒI°˜4Ÿ>™>×+ÑIùr›  r\  r   r   ÚXÚYrã  r±  rä  c                óx   •— ‰j                   j                  ‰j                  d| › d‰› d�| j                  ‰¬«      S )Nr°  r±  r²  r"  )rá   r&  r'  r·   )r  r<  r%  rY  s    €€€r‘   rˆ  z(TritonKernel.reduction.<locals>.<lambda>  s?   ø€ �d—h‘h×'Ñ'Ø—‘Ø" 1 # R¨Ð'7°qÐ9Ø—g‘gØ!ð	 (ó € r“   )ÚargmaxÚargmin)Úargmax_valueÚargmin_value)Úargmax_with_valueÚargmin_with_valuer†   r‡   )rŽ  r�  r�  r‘  r’  r“  Nc                ó¢  •— t        ‰	«      }‰
j                  | |‰«      }‰	dk(  rYt        ‰
j                  «       «      dk(  }|j                  €J ‚|r|› d�}dg|j                  ¢d‘}n>|› d�}g |j                  ¢d‘}n(‰
j                  |› d|› d‰› d�|j                  «      \  }}|�|› d	‰
j                  |«      › d�}n|j                  }|||fS )
zK
            Helper to generate a reduction call, e.g. tl.sum.
            r!  r„  z[None,:,:,None]rW   z
[:,:,None]r9  r±  r²  r  )r’   r�  rš   r6  rä   r}  rP  r·   )rñ  r§  Úresult_typeÚtriton_reduction_fnÚis_bmmr�  rä   rz  r·   rŽ   r%  s          €€€€r‘   Úfinal_reductionz/TritonKernel.reduction.<locals>.final_reduction9  s  ø€ ô #@ÀÓ"OÐà×0Ñ0°¸ÀÓFˆEØ Ò&ä˜T×1Ñ1Ó3Ó4¸Ñ9�Ø—{‘{Ð.Ð.Ð.ÙØ %˜w oÐ6�FØÐ0 §¡Ð0¨aÐ0‘Eà %˜w jÐ1�FØ-˜eŸk™kÐ-¨1Ð-‘Eà $× ?Ñ ?Ø*Ð+¨1¨U¨G°2°c°U¸!Ð<¸e¿k¹kó!‘�˜ð Ð&Ø"˜8 4¨×(9Ñ(9¸+Ó(FÐ'GÀqÐI‘à#Ÿk™k�à˜;¨Ð-Ð-r“   c                óN   •—  ‰| ||«      \  }}}| j                  |› d|› �«       y)zU
            Generate a reduction and assign it to an existing variable.
            rO  N)r\  )rñ  r  r§  r•  rY  r˜  s        €r‘   Úfinal_reduction_definez6TritonKernel.reduction.<locals>.final_reduction_defineZ  s0   ø€ ñ *¨&°%¸ÓE‰KˆE�1�aØ�M‰M˜Z˜L¨¨E¨7Ð3Õ4r“   r!  c                ó¸  •— ‰	j                  | ||j                  «      }‰	j                  | |t        |t        «      r$t	        t
        j                  |j                  «      nt        j                  j                  «       «      }|dk(  rV|\  }}| j                  d|› d|› d‰› d|› d|› d‰› d|› d‰	j                  |› «      › d|› d‰	j                  |› «      › d�«       y |d	k(  r=| j                  d|› d
|› d‰› d|› d|› d‰› d|› d‰	j                  |› d�«      › d�«       y | j                  d|› d
|› d‰› d|› d|› d‰› d|› d‰	j                  |› d�«      › d�«       y )NÚvalue_and_indexz                    r±  z = triton_helpers.z_with_index(z)
                    rO  ú
                    r§  z_val, z_idx = triton_helpers.Ú_valÚ_idx)r�  r·   r•   r]   r
   r¿   rU   rà   rM  r\  r{  )
rñ  r  r§  r!  Úresult_kindÚresult_valueÚresult_indexrz  Úroot_opr%  s
          €€€r‘   Úfinal_argreducez/TritonKernel.reduction.<locals>.final_argreduceg  sà  ø€ Ø×0Ñ0°¸ÀÇÁÓLˆEØ×0Ñ0ØØä˜e¤[Ô1ô ”U—[‘[ %§+¡+Ô.ä—X‘X×<Ñ<Ó>óˆEð Ð/Ò/Ø-7Ñ*�˜lØ—‘ðØ!�N " \ NÐ2DÀWÀIÈ\ÐZ_ÐY`Ð`bÐchÐbiÐikÐloÐkpð qØ!�N # d×&;Ñ&;¸|¸nÓ&NÐ%Oð PØ!�N # d×&;Ñ&;¸|¸nÓ&NÐ%Oð Pðõð  Ò'Ø—‘ðØ�L  z lÐ2HÈÈ	ÐQ]Ð^cÐ]dÐdfÐglÐfmÐmoÐpsÐotð uØ�L  D×$9Ñ$9¸Z¸LÈÐ:MÓ$NÐ#Oð Pðõð —‘ðØ�L  z lÐ2HÈÈ	ÐQ]Ð^cÐ]dÐdfÐglÐfmÐmoÐpsÐotð uØ�L  D×$9Ñ$9¸Z¸LÈÐ:MÓ$NÐ#Oð Pðõr“   c                 ó   •— ‰‰v ry‰‰ v ryy)Nrœ  r§  r!  r�   )Úarg_value_reduction_typesÚarg_with_value_reduction_typesrŽ   s   €€€r‘   Úargreduce_result_kindz5TritonKernel.reduction.<locals>.argreduce_result_kindˆ  s   ø€ ØÐ!?Ñ?Ø(ØÐ!:Ñ:ØØr“   rÞ   c              3  ó>   K  — | ]  }t        |d    «      rŒ|–— Œ y­wrË  )rK   r³  s     r‘   r­   z)TritonKernel.reduction.<locals>.<genexpr>�  s!   è ø€ ò &
ØÔ(;¸CÀ¹FÕ(CŒCñ&
ùs   ‚–r"  r6  c                ó:   •— ‰s| S t         j                  ‰| |«      S r©   )r%  r  )ÚtvalÚfvalr]  s     €r‘   r+  z*TritonKernel.reduction.<locals>.where_cond´  s    ø€ ÙØ�Ü(×.Ñ.¨t°T¸4Ó@Ð@r“   c                ód  — |j                   s|t        j                  k(  r| S ||k(  s| dk(  r| S | t        j                  |«      j                  k(  rt        j                  |«      j                  S | t        j                  |«      j
                  k(  rt        j                  |«      j
                  S | S )z7update reduction constant mask value to match dst_dtyper   )r¶   r¿   r£   Úiinfor†   r‡   )râ  rË  rÌ  s      r‘   Úupdate_constant_dtypez5TritonKernel.reduction.<locals>.update_constant_dtype¼  s�   € ð
 ×.Ò.°)¼u¿z¹zÒ2IØ#�Oà 	Ò)¨X¸ª]Ø#�OàœuŸ{™{¨9Ó5×9Ñ9Ò9Ü Ÿ;™; yÓ1×5Ñ5Ð5Ø¤§¡¨YÓ!7×!;Ñ!;Ò;Ü Ÿ;™; yÓ1×5Ñ5Ð5à#�Or“   c                óà   •—  ‰|‰| j                   «      }‰j                  t        |«      }‰j                  j	                  ‰j
                   ‰| |«      | j                   | j                  ¬«      S r�  )r·   Ú_map_tuple_or_scalarri   rá   r&  r'  rä   )r§  r(  Údefault_strr%  rË  r¯  r+  s      €€€€r‘   Ú_mask_valuez+TritonKernel.reduction.<locals>._mask_valueÎ  sb   ø€ Ù/°¸ÀEÇKÁKÓP�Ø"×7Ñ7¼ÀwÓO�à—x‘x×(Ñ(Ø—L‘LÙ˜u kÓ2ØŸ+™+ØŸ+™+ð	 )ó ð r“   Úonline_softmax_reducer!  r~  r9  rõ  r²  r°  zindex, z.shape)Úwelford_reduceÚwelford_combinec              3  óv   •K  — | ]0  \  }}‰j                   j                  ‰j                  |‰|¬ «      –— Œ2 y­w)r"  N)rá   r&  r'  )rª   r§  rä   r·   r%  s      €€r‘   r­   z)TritonKernel.reduction.<locals>.<genexpr>  s9   øè ø€ ò #á$˜˜uð —H‘H×%Ñ% d§l¡l°EÀÈeÐ%×Tñ#ùr®   rW   rY  r>  Ú_indexú                ú_next, z_next = triton_helpers.z%imum_with_index(
                    ú#
                )
                rO  Ú_nextú
                Ú_maxÚ_sumz, float('-inf'), ú = tl.zeros(z
                        zT_next = triton_helpers.online_softmax_combine_with_sum(
                            z3
                        )
                        zK_next = triton_helpers.online_softmax_combine(
                            r�  z.to(tl.int8)zif HAS_RSPLIT:rŸ  rž  Ú_bvalÚ_bidxr#   c              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­wr©   )r•   rš  rH  s     r‘   r­   z)TritonKernel.reduction.<locals>.<genexpr>4  s   è ø€ ÒJ¸”:˜aÔ!2×3ÑJùr›  r  )r‘  r/  r´   r£   )r§  r]   r´   r]   )r§  r]   r•  r/  r´   z.tuple[str, torch.dtype | None, BlockShapeType])r  r]   r§  r]   r•  r/  r´   rÆ   )r!  ©r´   r]   )SÚpytreeÚtree_anyÚtree_mapr¿   rÀ   rk  r   rx  rŸ  r8  rÜ  rë  rf  r5  r6  rš   r7  r²   r<  r±  r•   rî   rj  rá   Úreduction_cacherŠ  rˆ  rm  Úselect_index_dtypert  rv  rU  r  rò  r%   r#  r$  r·  r&  r'  r·   r]   rð   rP  rä   r+  rµ  Úwelford_reduce_fallbackr   Ú_welfordr
   Ú%online_softmax_reduce_final_reductionÚ prepare_softmax_twopass_fallbackr	   rÍ  Údefault_accumulatorri   rl  rV  r®  r†   r\  r  rH   r$   rý  Úget_reduction_combine_fnr£   r�  rQ  rR  r  rS  ra  r{  Ú*codegen_cooperative_reduction_peer_combineÚwelford_reduce_final_reductionrU  r  r¡  rc  rR  r  )Vr%  r·   rË  rŽ   r§  r†  Ú	do_upcastÚoriginal_dtypeÚoriginal_src_dtyperd  Úreduction_range_prefixÚdense_sizesrð  Úxy_sizes_onlyÚarg_index_reduction_typesÚarg_reduction_typesÚarg_root_opsÚlogical_indexrš  r¤  r¨  rj  Úacc_typeÚtorch_acc_typerø  rú  rÄ  Úresult_mask_varsr  rô   r(  r³  Úmasked_valuer  r‘  Úaccumulator_indexÚmeanÚm2ÚweightÚ
result_sumÚ_resultÚ_dtypeÚ_shapeÚresult_prefixÚaccumulatorr‰  Úaccumulator_maxÚaccumulator_sumÚ	value_maxÚ	value_sumÚ
result_maxÚ
combine_fnÚupdatedrZ  râ  r¡  r¢  Úblock_valueÚblock_indexÚblock_value_nameÚpeer_valÚpeer_idx_inputÚpeer_idxÚresult_meanÚ	result_m2Úresult_weightÚ	peer_meanÚpeer_m2Úpeer_weightÚpeer_maxÚpeer_sumÚpeersÚresult_tupler�  Útarget_dtyper¦  r§  r]  r<  rz  r˜  r£  r„  r¯  rY  r+  sV   ````                                                                       @@@@@@@@@@@r‘   Ú	reductionzTritonKernel.reductionÔ  s  ÿþ€ ó	Lõ		ô —O‘OÓ$DÀeÓLˆ	ØˆØ&ÐÙä—O‘O L°%Ó8ˆEÙ)6°yÔ)AœŸšÀyˆIÙ%2°5Ô%9”E—M’M¸uˆEà×$Ò$Ð$Ð$ÜÑI¸×8HÑ8HÔIÓIˆØ×Ñ˜%Ô Ü�u“ˆØ�?Š?Ø�L‰L˜Ÿ™Ô)Ø!%×!1Ñ!1°"Ñ!5×!<Ñ!<¸QÑ!?Ðð × Ò Ø×.Ñ.Ó0ˆKÜ�{Ó# qÒ(Ð(Ð(Ø.9ÖX d¸SÀD¹[ÈCÐSWÊKšTÐXˆMÐXØ  §¡¨=Ó!9Ð :¸!Ð<ˆNÜ Ó.‰Kà!×0Ñ0Ó2ˆNÜ × 4Ñ 4Ó 6Ó7ˆKð ×)Ñ)õð ó
ˆð %9Ð!Ø$DÐ!Ø)SÐ&à%Ø'ñ(à,ñ-ð 	ð ØØ!Ø!Ø!&Ø!&ñ
ˆð ˆØÐ0Ñ0Ü˜%¤Ô'Ø',Ñ$��}à×%Ñ%Ó'¨$×*AÑ*AÑAˆð	.àð	.ð ,ð	.ð <÷		.ð 	.ðB	5à#ð	5ð ð	5ð ,ð		5ð
 õ	5÷	öB	ð  °Ð6ˆ	Ø˜Ÿ™×0Ñ0Ñ0Ø—8‘8×+Ñ+¨IÑ6Ð6ä" 9Ó-ˆÜ)¨)Ó4ˆð Ð!4Ñ4ð �M‰M×,Ñ,Ô.àð 	ô
 ˜D×0Ñ0Ó2Ó3ˆÜ�s˜C $×"9Ñ"9Ñ9Ó:ò 	"ˆAØ!ˆL˜ŠOð	"ä%ñ &
Ø ô&
ó 
Ðð Ð;Ñ;ØÐ*Ð*Ð*à—‘—‘ n¼EÀ,Ó<O�ÓPØ—‘—‘ k¼¸|Ó9L�ÓMðˆJð "ò 1�Ø 0�•ñ1àÐ8Ñ8ØÐ*Ð*Ð*ØŸ™Ÿ™¨{Ä%ÈÓBU˜ÓVˆJØ#3ˆJÕ àŸ™Ÿ™Ø$¬E°,Ó,?ð )ó ˆJð $4ˆJÔ Ø�z‰z˜%Ó ˆô	Að
 ×$Ó$Ü—l‘l×0Ñ0°ÀÓKˆGò$÷$	ð 	ð Ð!8Ò8ÄØ”uôBð
  $‘Ü˜E¤5Ô)Ü>AÀ%ÈÓ>Q×R±d°a¸¡¨A¨qÕ 1ÐR�ÒRØ 5Ò(ð
  $Ÿx™x×0Ñ0°·±¸uÈEÏKÉKÐ0ÓX‘á*¨5°'Ó:�àÐ!4Ñ4Ü! ,´Ô<Ð<Ð<Ø"Ð.Ð.Ð.Ù àœC Ó.Ð/¨u°T×5FÑ5FÀ{Ó5SÐ4TÐTUÐVñ &ô ),ØŸ™×)Ñ)Ø ŸL™LØ.Ð/EÐ.FÀgÈlÈ^Ð[bÐcØ"-Ø".×"4Ñ"4ð	 *ó ó)Ð%ð ' ~Ñ6�ÙØ—L‘LØØ Ø%Ù)Ó+öð  Ð#3Ò3Ø×-Ò-à!%×!4Ñ!4Ø" N°E¸:ÀxÐQVó"’Jð "&×!=Ñ!=¸eÀUÓ!K’JØÐ#4Ò4Ü! ,´Ô9Ð9Ð9Ø%1Ñ"��r˜6Ü"ô #à(,¯©ØŸ™ d¨B°¸¸Uó)ô#ó ’
ð  Ð#:Ò:Ü˜e¤UÔ+Ü% l´HÔ=Ð=Ð=Ø!%§¡§¡Ø#¬4´¸ZÓ+H×+NÑ+Nð "1ó "�Jð "&×!KÑ!KØŸ™Ø"Ø"Ø$ Q™Ø$ Q™ØØó"’Jð "&×!FÑ!FÀuÈeÓ!T’Jä! ,´Ô<Ð<Ð<Ù*9Ø—L‘L ,°×0BÑ0Bó+Ñ'�˜ ð "ŸX™X×.Ñ.Ø—L‘L '°¸vð /ó ’
ð "Ð%CÑCô ”S˜*Ó% aÒ(àð ð
 Ÿ(™(×+Ñ+Ø�M�?Ð#Ø$Ü˜D×0Ñ0Ó2Ó3ð ,ó ˆKô
 —l‘l×6Ñ6°~ÀyÓQˆGØ×/Ñ/´¸wÓGˆGÜ˜g¤uÔ-Ø! UÒ*Ø"&×"6Ñ"6Ó"8�KÜ˜{Ó+¨qÒ0Ð0Ð0à)4ö%Ø!%¸¸t¹ÀsÈdÂ{šð%�Mð %ô ).¨mÓ(<�KÔ%Ø'(¨¯©°=Ó)AÐ(BÀ!Ð%D�NØ—I‘I×'Ñ'Ø&˜- {°>Ð2BÀ"ÀWÀIÈRÐPXÈzÐYZÐ[õð —I‘I×'Ñ'Ø&˜- {°4×3FÑ3FÓ3HÐ2IÈÈGÈ9ÐTVÐW_ÐV`Ð`aÐbôð Ð!4Ò4Ø&'¨ °fÐ$=Ð!Ø"Ð.Ð.Ð.Ø—	‘	×#Ñ#Ø(Ð)¨°T×5HÑ5HÓ5JÐ4KÈ2Ü—{‘{ ;Ó/×3Ñ3Ð4°B°t×7HÑ7HÈÓ7UÐ6VÐVWðYôð ' ~Ñ6�ð %Ð0ð œ˜MÓ*Ð+¨5°×1BÑ1BÀ;Ó1OÐ0PÐPQÑRà2Ð3°5Ð9ð ð
 —‘×#Ñ#ðØ�˜WÐ%6Ð$7Ð7NÈwÈið XØ �M Ð$5Ð#6°b¸¸¸rÀ)Àð Mà�˜S¡¨{¨m¸5Ð,AÀ;Ó!OÐ Pð QØ"Ð# 3¡zÐ5FÐ4GÀuÐ2MÐO`Ó'aÐ&bð cðôñ  Ø×*Ñ*ØØØ%Ù)Ó+öô & nÔ5Ø!×0Ñ0Ø °°zÀ8ÈUó’
ð  Ð#:Ó:Ø$% j \°Ð"6�Ø$% j \°Ð"6�ð —	‘	×#Ñ#Ø&Ð' {°4×3FÑ3FÓ3HÐ2IÐIZÐ[cÐZdÐdeÐfôð —	‘	×#Ñ#Ø&Ð' |°D×4GÑ4GÓ4IÐ3JÈ"ÈXÈJÐVWÐXôô ˜e¤UÔ+Ø+0Ñ(�I˜yØ—L‘L×'Ñ'ðØ(Ð)¨°Ð0Að BØ,Ð-¨R°Ð/@ÀÀ9À+ÈRÐPYÈ{ÐZ\Ô]c×]qÑ]qÐ\rð sðõð —L‘L×'Ñ'ðØ(Ð)¨°Ð0Að BØ,Ð-¨R°Ð/@ÀÀ5À'ÈÌF×L`ÑL`ÐKað bðôð —‘×#Ñ#ðØ$Ð% S©°Ð6GÀuÐ4MÈÓ)_Ð(`ð aØ$Ð% S©°Ð6GÀuÐ4MÈÓ)_Ð(`ð aðôð (�
Ø!ŸX™XŸ_™_Ø¤t¬C°Ó'<×'BÑ'Bð -ó �
ð "×GÑGØ×*Ñ*ØØØ#Ø#ØØó‘
ô  ×8Ñ8¸ÈÓS�
Ù$ [°%Ó8�Ø! UÒ*Ø—L‘L×*Ñ*¨k¨]¸#¸g¸YÐ+GÕHà—L‘L×*Ñ*Ø&˜- s©:°g¸{Ó+KÐ*LÐMôð ¤§
¡
Ò*ð #'§(¡(×"3Ñ"3Ø×.Ñ.Ø&˜- |Ð4Ü#Ÿj™jØ)×/Ñ/ð	 #4ó #�Kñ 'Ø×*Ñ*Üœ jÓ1ØØô	ð ×%Ó%Ü—l‘l×6Ñ6°~ÀyÓQˆGÜ#×-Ñ-Ó/ˆJØ×.Ñ.°×0DÑ0DÐEò 7�à—‘Ð.Ô/Ø×(Ñ(¨¯©«Õ6ð7ð
 Ð!4Ò4Ø!Ð%CÑCÜ15Üœk¬;Ð6Ñ7¸ó2Ñ.�L ,ð %1�MÜ"% lÓ"3�KÜ"% lÓ"3‘KØ#Ð'@Ñ@Ü$(¬°jÓ$A�MÜ"% j£/�KØ"&×"7Ñ"7¸:¸,ÀdÐ8KÓ"L‘Kä$(¬°jÓ$A�MØ"&×"7Ñ"7¸:¸,ÀdÐ8KÓ"L�KØ"&×"7Ñ"7¸:¸,ÀdÐ8KÓ"L�KØ&3 _°EÐ#:Ð Ø×&Ñ&×0Ñ0Ð4DÐ3EÀSÈÈÐ1VÔWØ×JÑJØ$ i°ó�ð #Ÿm™m×>Ñ>Ó@�Ø$1 ?°%Ð!8�Ø×&Ñ&×0Ñ0°NÐ3CÀ3À{ÀmÐ1TÔUØ×JÑJØ" K´·±¸[Ó1I×1MÑ1Mó�ñ  Ø×(Ñ(ØØØÙ)Ó+öô & nÔ5Ø%Ð)9Ò9Ð9Ð9Ü8<Üœ+¤{´KÐ?Ñ@À*ó9Ñ5�˜Y¨ð !×KÑKØÜ$ YÓ/Ø˜A‘Jó�	ð
 ×IÑIØÜ$ YÓ/Ø˜A‘Jó�ð
 #×MÑMØ!Ü$ YÓ/Ø˜A‘Jó�ð
 ×3Ñ3Ø×(Ñ(ØØØ!ØØØØØõ
ð  Ð#:Ò:Ü)-Üœ+¤{Ð2Ñ3°Zó*Ñ&�
˜Jô " '¬8Ô4Ð4Ð4Ø×JÑJØÔ 0°Ó ;¸WÀQ¹Zó�ð  ×JÑJØÔ 0°Ó ;¸WÀQ¹Zó�ð ×:Ñ:Ø×(Ñ(ØØØØØØõð ×GÑGÜœ jÓ1Ô3CÀIÓ3NÐPWó�ñ 'Ø×(Ñ(¬$¬{¸JÓ*GÈÐPTôð ×ÑÔä.2´3¸
Ó.Cˆ�‰× Ñ  Ñ+ä%/°
¼EÔ%B‘zÈÈˆØ×Ñ×%Ñ% lÔ3ÜÑJ¸\ÔJÔJÐJÐJñ Ü& |Ó4ò ‘	��6Ø!Ð%CÑCÈÈAÊØð &Ø1Ð4RÑRñTñ 'ð (ð	 ð —<‘< <Ó/Ø×*Ñ*×4Ñ4Ø!˜( # f X¨TÔ2EÀlÓ2SÐ1TÐTUÐVõðð Ðùò} Yùóp  SùòD%s#   Ä<A@;Å
A@;Ð2AA Ý4AAÞAAc                óš  — | j                  |||«      }| j                  |||«      }t        d«      D �cg c]'  }t        | j                  j	                  |¬«      «      ‘Œ) c}\  }}|j                  d|› d|› d|› d|› d|› dt        j                  › d|› d| j                  |› «      › d|› d| j                  |› «      › d�«       ||fS c c}w )Nr#   r~  ú
            r±  ú9 = triton_helpers.online_softmax_reduce(
                ú)
            rO  )	r�  rv  rð   rá   rU  r\  r$   rý  r{  )	r%  rñ  rê  rë  rz  r·   rY  rî  rä  s	            r‘   Ú_online_softmax_reducez#TritonKernel._online_softmax_reduceI  sù   € ð ×6Ñ6°v¸ÐPUÓVˆØ×6Ñ6°v¸ÐPUÓVˆÜMRÐSTËXÖ!VÈ¤# d§h¡h§o¡o¸E oÓ&BÕ"CÒ!VÑˆ
�JØ�‰ðØˆL˜˜:˜,ð 'Ø Ð!  OÐ#4°B°s°e¸2¼f×>RÑ>RÐ=Sð TØˆL˜˜D×1Ñ1°Z°LÓBÐCð DØˆL˜˜D×1Ñ1°Z°LÓBÐCð Dð	ô	
ð ˜:Ð%Ð%ùò "Ws   ´,Cc           
     óˆ  ‡ ‡‡‡— ˆˆˆ fd„|||fD «       \  }}}d|› d|› d|› d‰› d�	}ˆfd„}|||fD �	cg c]/  }	‰ j                   j                  ‰ ||	j                  «      ¬«      ‘Œ1 }
}	‰j                  dj	                  |
D �cg c]  }t        |«      ‘Œ c}«      › d|› �«       t        ˆ fd„|
D «       «      S c c}	w c c}w )	z;
        Helper to codegen triton_helpers.welford.
        c              3  óD   •K  — | ]  }‰j                  ‰|‰«      –— Œ y ­wr©   )r�  )rª   r§  rñ  r·   r%  s     €€€r‘   r­   z(TritonKernel._welford.<locals>.<genexpr>^  s(   øè ø€ ò 
àð ×(Ñ(¨°¸×>ñ
ùs   ƒ ztriton_helpers.welford(r±  r²  c                ó2   •— t        | d‰ | ‰dz   d  z   «      S r  )r²   rà  s    €r‘   Úreduced_shapez,TritonKernel._welford.<locals>.reduced_shaped  s$   ø€ Ü˜˜q ˜¨¨c°A©g¨iÐ(8Ñ8Ó9Ð9r“   r"  rO  c              3  óV   •K  — | ]   }‰j                  ||j                  «      –— Œ" y ­wr©   )r}  rä   )rª   r§  r%  s     €r‘   r­   z(TritonKernel._welford.<locals>.<genexpr>m  s*   øè ø€ ò 
àð ×+Ñ+¨E°5·;±;×?ñ
ùs   ƒ&))rá   rU  rä   rV  r7  rð   r²   )r%  rñ  rá  râ  rã  rz  r·   Úwelfordr  r§  Úwelford_resultsrC  s   ``   ``     r‘   rË  zTritonKernel._welfordZ  sà   û€ õ
à  FÐ+ô
Ñˆˆb�&ð ,¨D¨6°°B°4°r¸&¸ÀÀCÀ5ÈÐJˆô	:ð
   FÐ+ö
àð �H‰H�O‰O %©}¸U¿[¹[Ó/IˆOÕJð
ˆð 
ð 	×Ñ˜DŸI™I°Ö&G°!¤s¨1¥vÒ&GÓHÐIÈÈWÈIÐVÔWäó 
à(ô
ó 
ð 	
ùò
ùò 'Hs   ´4B:ÂB?c                ó¢  — | j                  «       | j                  z
  }t        |› d�t        | j	                  «       «      |t        j                  «       ¬«      }t        |› d�t        | j	                  «       «      |t        j                  «       ¬«      }	t        |› d�t        | j	                  «       «      |t        j                  «       ¬«      }
| j                  j                  |› d| j                  «       › d|› d�«       | j                  j                  |	› d| j                  «       › d|› d�«       | j                  j                  |
› d| j                  «       › d|› d�«       |dk(  r>|\  }}}| j                  j                  d	|› d
|	› d
|
› d|› d|	› d|
› d|› d|› d|› d�«       n8|dk(  sJ ‚| j                  j                  d	|› d
|	› d
|
› d|› d|› d|	› d|
› d�«       | j                  j                  d|› d ||› d�|«      › d|	› d ||	› d�|	«      › d|
› d ||
› d�|
«      › d�«       |}| j                  | j                  |dd||	|
||«	      S )z%Helper to codegen a welford reductionÚ_mean©rä   r·   rž  Ú_m2Ú_weightrÀ  r±  r²  r¶  r¹  rº  z<_next = triton_helpers.welford_combine(
                    z,
                    r»  rµ  z;_next = triton_helpers.welford_reduce(
                    z1, roffset == 0
                )
                z            rO  r¼  r  N)rî   rj  rš  r²   r6  r"   Úunknownrl  rV  r<  r'  r\  rÑ  r  )r%  r  rŽ   r§  r+  rÜ  r·   rz  ré  Úaccumulator_m2Úaccumulator_weightrá  râ  rã  r÷  s                  r‘   rµ  zTritonKernel.welford_reducer  s   € ð ×%Ñ%Ó'¨$×*AÑ*AÑAˆä'Øˆl˜%Ð Ü˜×,Ñ,Ó.Ó/ØÜ×&Ñ&Ó(ô	
ˆô +Øˆl˜#ÐÜ˜×,Ñ,Ó.Ó/ØÜ×&Ñ&Ó(ô	
ˆô /Øˆl˜'Ð"Ü˜×,Ñ,Ó.Ó/ØÜ×&Ñ&Ó(ô	
Ðð 	�	‰	×ÑØˆm˜<¨×(;Ñ(;Ó(=Ð'>¸bÀÀ
È!ÐLô	
ð 	�	‰	×ÑØÐ˜l¨4×+>Ñ+>Ó+@Ð*AÀÀHÀ:ÈQÐOô	
ð 	�	‰	×ÑØ!Ð" ,¨t×/BÑ/BÓ/DÐ.EÀRÈÀzÐQRÐSô	
ð Ð.Ò.Ø$ÑˆD�"�fØ�L‰L×ÑðØ�˜W ^Ð$4°GÐ<NÐ;Oð PØ �M  NÐ#3°2Ð6HÐ5Ið JØ�F˜"˜R˜D  6 (ð +ðõð "Ð%5Ò5Ð5Ð5Ø�L‰L×ÑðØ�˜W ^Ð$4°GÐ<NÐ;Oð PØ�G˜2˜k˜]¨"¨^Ð,<¸BÐ?QÐ>Rð Sðôð 	�‰×ÑðØˆM˜™Z¨;¨-°uÐ(=¸{ÓKÐLð MØÐ˜C¡
¨nÐ-=¸UÐ+CÀ^Ó TÐUð VØÐ  ¡JÐ2DÐ1EÀUÐ/KÐM_Ó$`Ð#að bðô	
ð !ˆØ×2Ñ2Ø×"Ñ"ØØØØØØØØó

ð 
	
r“   c
           
     ó  — t        | j                  ||||||	«      «      }
|||g}t        t        ||
«      «      D ]E  \  }\  }\  }}|€"| j                  j                  |	|¬«      }|||<   |j                  |› d|› �«       ŒG t        |«      S )z0Helper to codegen call to triton_helpers.welfordr"  rO  )rt  rË  rR  r·  rá   rU  r\  r²   )r%  rñ  r÷  rø  rù  rá  râ  rã  rz  r·   r¸  Úresult_exprsrÄ  Úresult_exprr§  rä   s                   r‘   rÑ  z+TritonKernel.welford_reduce_final_reductionº  sŸ   € ô �d—m‘m F¨D°"°f¸cÀ5ÓIÓJˆà# Y°Ð>ˆÜ09¼#¸lÈFÓ:SÓ0Tò 	6Ñ,ˆAÑ,�™^˜e UØÐ"Ø"Ÿh™hŸo™o°EÀ˜oÓG�Ø"-�˜Q‘Ø�M‰M˜[˜M¨¨U¨GÐ4Õ5ð		6ô �\Ó"Ð"r“   c                ó  — | j                  |||«      }| j                  |||«      }	|j                  d|› d|› d|› d|	› d|› dt        j                  › d|› d| j	                  |› «      › d|› d| j	                  |› «      › d�«       ||fS )Nr  r±  r  r  rO  )r�  r\  r$   rý  r{  )
r%  rñ  rî  rä  rý  rþ  rz  r·   rê  rë  s
             r‘   rÌ  z2TritonKernel.online_softmax_reduce_final_reductionÒ  sÃ   € ð ×6Ñ6°v¸xÈÓOˆØ×6Ñ6°v¸xÈÓOˆØ�‰ðØˆL˜˜:˜,ð 'Ø Ð!  OÐ#4°B°s°e¸2¼f×>RÑ>RÐ=Sð TØˆL˜˜D×1Ñ1°Z°LÓBÐCð DØˆL˜˜D×1Ñ1°Z°LÓBÐCð Dð	ô	
ð ˜:Ð%Ð%r“   c                óD   — | j                   r| j                   d   S t        S )NÚRSPLIT)rù  r7   r$  s    r‘   Ú
max_rsplitzTritonKernel.max_rsplitá  s"   € Ø×ÒØ×$Ñ$ XÑ.Ð.Ü Ð r“   c                ó  — | j                   d   }| j                  «       sdnd}||j                  z  | j                  «       z  }| j                  j                  |«      \  }}| j                  j                  d|› d|› d| j                  |«      › dt        |«      › d|› d	|› d
|› d�d¬«       | j                  |› d�ddg|t        j                  «       ¬«      }	| j                  j                  |	› d|› dt        |«      › d�«       |	S )a	  
        Generate code to save a [XBLOCK, RSPLIT] temporary workspace, where each thread block writes a different
        column.  After the barrier, every thread block loads the completed value so that it can compute the final
        value independently.
        r]  zxindex < xnumelNr½  z_ws = (rc  z).to(tl.pointer_type(z))
                tl.store(z%_ws + (xindex * RSPLIT + rsplit_id), r±  r  T©rQ  Ú_peersr  r  r  z = tl.load(z_ws + (xindex * RSPLIT + rsplit_arange), rsplit_mask, eviction_policy='evict_first', other=triton_helpers.if_mask(rsplit_mask, rý  )rl  r_  r†  r  r[  rË  r  r\  r¹  rO   Úcreate_cse_varr"   r  r  rV  ri   )
r%  r  r·   Údefault_valÚxnumelr  rÇ  rÉ  rÊ  rÿ  s
             r‘   rÐ  z7TritonKernel.codegen_cooperative_reduction_peer_combineæ  sS  € ð —‘˜SÑ!ˆØ(,×(@Ñ(@Ô(BÑ Èˆà˜%Ÿ.™.Ñ(¨4¯?©?Ó+<Ñ<ˆØ!×GÑG×PÑPÐQWÓXÑˆ�à×Ñ×%Ñ%ðØ�˜G G 9¨C°×0AÑ0AÀ)Ó0LÐ/MÐMbÔcnÐotÓcuÐbvð wØ$˜Ð%JÈ:È,ÐVXÐY]ÐX^ð _ðð ð 	&ô 	
ð ×#Ñ#Øˆl˜&Ð!Ø˜XÐ&ØÜ×&Ñ&Ó(ð	 $ó 
ˆð 	×Ñ×&Ñ&Øˆg�[  ð -eÜerÐs~Óeð  eAð  ACðDô	
ð ˆr“   c                óH  — | j                   sJ ‚d| _         t        j                  j                  |«      }| j	                  |d| j                  | |dd¬«      ¬«      }d| _         | j                  j                  |«      }t        j                  «       }| j                  r+|j                  | j                  || j                  «      «       | j                  | j                  |«       t        |t         t"        f«      rY| j                  j%                  t'        || j)                  |||j+                  |«      |d|j-                  «       ›�«      «      «       n¿t        |t.        «      sJ ‚|j0                  }t3        |«      rZ|j4                  �Nt7        d„ |j4                  D «       «      s2dj9                  t;        t<        |j4                  «      «      }	|d|	› d	�z  }| j                  j%                  t'        |d
|› d|› d|› d|j>                  › d	�	«      «       |jA                  «        y )NFT)rà   r·   r¾  rà  rI  rÈ  c              3  ó8   K  — | ]  }t        |«      d k(  –— Œ y­wrK  r­  rH  s     r‘   r­   z/TritonKernel.store_reduction.<locals>.<genexpr>9  rN  rL  r±  rI  r²  rÛ  rÎ  r1  )!rk  rU   ra  rÜ  rL  r4  r±   rU  rQ  rR  r+  rS  rT  r  r  r•   r×  rÌ  rV  r^   rã  rÓ  rš  r  r  rž   rä   rc  r7  r9  rð   r:  rU  )
r%  rã   r!  r§  r·   rL  rô   rZ  rX  rY  s
             r‘   Ústore_reductionzTritonKernel.store_reduction  sÿ  € ð ×$Ò$Ð$Ð$Ø %ˆÔÜ—‘×!Ñ! $Ó'ˆØ—=‘=ØØØ&*×&HÑ&HØØØØð	 'Ió 'ð !ó 	
ˆð !%ˆÔØ�i‰i×Ñ˜tÓ$ˆä×)Ñ)Ó+ˆ
Ø×%Ò%Ø×$Ñ$Ø×,Ñ,¨T°4×3GÑ3GÓHôð 	×&Ñ& t×';Ñ';¸SÔAä�h¤Ô2IÐ JÔKØ× Ñ ×*Ñ*ÜØØ×5Ñ5ØØ Ø Ÿ™¨Ó,ØØ+¨H×,CÑ,CÓ,EÐ+HÐIóó	õô ˜h¬Ô8Ð8Ð8à#×-Ñ-ˆLä% eÔ,Ø—K‘KÐ+ÜÑ?°5·;±;Ô?Ô?à"Ÿi™i¬¬C°·±Ó(=Ó>�Ø .°°¸QÐ ?Ñ?�à× Ñ ×*Ñ*ÜØØ ˜u D¨¨°c¸%¸ÀÀ8×CTÑCTÐBUÐUVÐWóôð 	×ÑÕr“   c                ót   — | j                   j                  | j                  | j                  ||«      ||¬«      S )z=Emit a tl.reshape into a new tile shape, returning a CSE var.r"  )rá   r&  r'  Ú_reshape_expr)r%  r§  rä   r·   s       r‘   Úemit_reshapezTritonKernel.emit_reshapeG  s=   € ð �x‰x× Ñ Ø�L‰LØ×Ñ˜u eÓ,ØØð	 !ó 
ð 	
r“   c           	     ó|   — t        |«      }| j                  j                  | j                  |› d|› d|› d�||¬«      S )zDEmit a Triton reduction primitive along `axis`, returning a CSE var.r9  r±  r²  r"  )r’   rá   r&  r'  )r%  r§  rŽ   Úaxisr·   rä   Ú	reduce_fns          r‘   Úemit_reducezTritonKernel.emit_reduceU  sM   € ô 2°.ÓAˆ	Ø�x‰x× Ñ Ø�L‰LØˆk˜˜5˜'  D 6¨Ð+ØØð	 !ó 
ð 	
r“   c                óÚ   — | j                  ||«      }d|› dt        |«      › d�}t        |t        |«      t        |«      «      }	| j                  j                  | j                  |	||¬«      S )zßreshape(broadcast_to(reshape(value, pre_broadcast), broadcast), final).

        Used for nested-reduction broadcasts that lift a reduced-resolution
        value (one element per group) to full or half resolution.
        r°  r±  r²  r"  )r(  ræ  r¥  rt  rá   r&  r'  )
r%  r§  rÀ  rF  rI  r·   Ú	out_shapeÚreshapedÚbroadcastedrð  s
             r‘   Úemit_broadcast_via_reshapez'TritonKernel.emit_broadcast_via_reshapef  s{   € ð ×%Ñ% eÐ-@ÓAˆà˜x˜j¨Ô+;¸OÓ+LÐ*MÈQÐOð 	ô ˜k¬4°Ó+@Ä$À{ÓBSÓTˆØ�x‰x× Ñ Ø�L‰LØØØð	 !ó 
ð 	
r“   c                ó”   — t        | dd «      }|€d| › dt        |«      › d�S t        t        | «      t	        |«      t	        |«      «      S )Nrä   rè  r±  r²  )r¤   ræ  r¥  rð   rt  )r§  rä   r¨  s      r‘   r(  zTritonKernel._reshape_expr€  sO   € ô
 ˜E 7¨DÓ1ˆ	ØÐØ    rÔ*:¸5Ó*AÐ)BÀ!ÐDÐDÜœc %›j¬$¨y«/¼4À»;ÓGÐGr“   c                óN  ‡‡‡‡‡‡‡— t        «       Š‰j                  d«       t        «       Št        d«      D �‡cg c]*  Št	        ˆˆfd„t        t        ||«      «      D «       «      ‘Œ, }}dj                  d„ t        j                  j                  |«      D «       «      }‰j                  d|› d�«       t        «       ŠdŠd	d
lm} d	dlm}  |«       Š |«       Š G ˆˆˆˆˆˆfd„dt         «      }	‰j#                  «       5  t%        j&                   |	«       «      5   ||Ž }
dj                  d„ |
D «       «      }
‰j                  d|
› �«       d d d «       d d d «       | j(                  j+                  ‰j-                  «       ‰¬«      S c c}w # 1 sw Y   ŒAxY w# 1 sw Y   ŒExY w)Nz@triton.jitr#   c              3  ór   •K  — | ].  \  }\  }}‰j                  d ‰› d|› �||j                  ¬«      –— Œ0 y­w)r«   rY  r"  N)rÍ  rä   )rª   r»  r§  r·   rá   rÄ  s       €€r‘   r­   z,TritonKernel._lift_helper.<locals>.<genexpr>”  s@   øè ø€ ò á%�A‘~˜˜uð —‘˜s 1 # Q q c˜]°%¸u¿{¹{�×Kñùs   ƒ47r±  c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr©   r­  rH  s     r‘   r­   z,TritonKernel._lift_helper.<locals>.<genexpr>š  s   è ø€ ÒR¨œc !ŸfÑRùr´  zdef {name}(ú):ry  r   ry   )ÚShapePropagationOpsHandlerc                  ó4   •— e Zd Z	 	 	 	 	 	 	 	 dˆ ˆˆˆˆˆfd„Zy)ú+TritonKernel._lift_helper.<locals>.CSEProxyc                ó¦   •— ‰	d|› �z  Š	 t        ‰|«      |i |¤Ž} t        ‰|«      |i |¤Ž}‰j                  ‰ t        ‰
|«      |i |¤Ž||¬«      S )NrY  r"  )r¤   r&  )r%  rã   r±   r¢  rO  Úoutput_shaperá   Údtype_handlerÚhelperÚhelper_nameÚ	overridesÚshape_handlers         €€€€€€r‘   Ú_defaultz4TritonKernel._lift_helper.<locals>.CSEProxy._default¬  sœ   ø€ ð   4 &˜zÑ)�ð œwØ!Øó ð ð #ð "ñ #�ð
 œwØ!Øó ð ð #ð "ñ #�ð
 —|‘|ØØ,”G˜I tÓ,¨dÐ=°fÑ=Ø&Ø&ð	 $ó ð r“   N)rã   rð   r±   ztuple[Any, ...]r¢  rq  r´   r	   )r¾   rÇ   rÈ   rB  )rá   r=  r>  r?  r@  rA  s   €€€€€€r‘   ÚCSEProxyr:  «  s-   ø„ ðØðØ'6ðØ@Nðà÷ó r“   rC  c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr©   r­  )rª   rU  s     r‘   r­   z,TritonKernel._lift_helper.<locals>.<genexpr>Å  s   è ø€ ÒB°¤ F§ÑBùr´  úreturn rz  )r_   rV  r\   rv  r²   rR  r·  r7  r¶  r·  Úfrom_iterablerÆ  r¨  rz   Ú!torch._inductor.shape_propagationr8  r.   ra  rU   Úset_ops_handlerr  ri  Úgetvalue)r%  rF  r¸  ÚdtypesrÄ  r±   Ú	signaturerz   r8  rC  Úoutputsrá   r=  r>  r?  r@  rA  s       `      @@@@@@r‘   Ú_lift_helperzTritonKernel._lift_helperŠ  sy  þ€ ô
  Ó!ˆØ×Ñ˜Ô'Ü‹eˆô ˜1“X÷
ð
 ô	 ô ä)2´3°v¸vÓ3FÓ)Gôõ ð
ˆð 
ð —I‘IÑR¬i¯o©o×.KÑ.KÈDÓ.QÔRÓRˆ	Ø×Ñ˜=¨¨°2Ð6Ô7ä#Ó%ˆ	ð *ˆåPÝPá2Ó4ˆÙ2Ó4ˆ÷	ó 	”~ô 	ð0 �]‰]‹_ñ 	2œa×/Ñ/±³
Ó;ñ 	2Ù˜$�iˆGØ—i‘iÑB¸'ÔBÓBˆGØ×Ñ˜w w iÐ0Ô1÷	2÷ 	2ð
 ×$Ñ$×(Ñ(¨¯©Ó):ÀkÐ(ÓRÐRùòk
÷`	2ð 	2ú÷ 	2ð 	2ús)   »/F
ÄFÄ2FÅFÆF	ÆFÆF$c                óB  ‡ ‡— ‰ j                   sJ ‚‰ j                  rJ d«       ‚t        d„ ‰ j                  D «       «      }‰ j	                  |«       t        |«      }‰ j                  rJ d«       ‚g }g }t        d„ |D «       «      }t        j                  ‰ j                  j                  ‰ j                  «      }‰ j                  |||«      }‰ j                  «       ‰ j                  z
  }	t!        ||«      D �]U  \  }
}‰ j                  j                  ‰ j                  |
› dt#        |«      › d�||
j$                  ¬«      }‰ j                  j                  ‰ j                  d|› d	‰ j'                  «       › d�|t        ‰ j)                  «       «      ¬«      }
|j+                  |
«       t-        |«      }‰ j.                  rŒÇ‰ j)                  «       }d
|d<   ‰ j                  j1                  ||¬«      }dd	j3                  |«      › d�}|j4                  rdnd}‰ j6                  j9                  |› d|› d	|› d	|› d�«       |j+                  |«       �ŒX d„ Šˆˆ fd„} |d ‰|«      › d|	› d	|› d�|||«      }‰ j.                  sâd„ }|D �cg c]*  } |d|› d�t;        |j<                  «       ||«      ¬«      ‘Œ, }} |t        |«      t        |«      «      } |t        |«      |«      }t!        ||«      D ��cg c]+  \  }} |d|› d	|› d�|j<                  |j$                  ¬«      ‘Œ- }}}t!        |||«      D ]*  \  }}}‰ j                  j9                  |› d|› d	|› d�«       Œ, n|}|D ]$  }t?        |t@        «      sJ ‚t        |«      |_!        Œ& t        |«      S c c}w c c}}w )z:
        Perform an associative scan on 'values'.
        ÚTODOc              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr©   r±  r4  s     r‘   r­   z$TritonKernel.scan.<locals>.<genexpr>×  rŠ  r›  z(ops.scan not supported inside ops.maskedc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr©   ©rQ   ©rª   r·   s     r‘   r­   z$TritonKernel.scan.<locals>.<genexpr>ß  ó   è ø€ ÒF°eÔ*¨5×1ÑFùr´  r  r²  r"  r°  r±  rÞ   r\  rã  rä  zfloat('nan')ré  r>  c                ó2   — dj                  d„ | D «       «      S )NrL  c              3  ó&   K  — | ]	  }|› d �–— Œ y­w©rD  Nr�   ©rª   r§  s     r‘   r­   z1TritonKernel.scan.<locals>.csv.<locals>.<genexpr>  ó   è ø€ Ò<¨E˜u˜g QœKÑ<ùrC  ©r7  ©r¸  s    r‘   ÚcsvzTritonKernel.scan.<locals>.csv  ó   € Ø—8‘8Ñ<°VÔ<Ó<Ð<r“   c                óN  •— t        |«      }t        |«      D �cg c]  }| › d|› d|› �‘Œ }}t        ˆfd„|D «       «      r)|D �cg c]  }‰j                  j	                  |«      ‘Œ c}S t        ||«      D ��	cg c],  \  }}	‰j                  j                  ||	j                  ¬«      ‘Œ. }
}}	‰j                  j                   ‰|
«      › d| › �«       t        |
|«      D ]*  \  }}|r||_
        ‰j                  j                  ||«       Œ, t        |
«      S c c}w c c}w c c}	}w )Nr±  c              3  óT   •K  — | ]  }‰j                   j                  |«      –— Œ! y ­wr©   ©rá   Úcontains©rª   rj  r%  s     €r‘   r­   z:TritonKernel.scan.<locals>.cse_multiple.<locals>.<genexpr>  ó    øè ø€ ÒL°I�4—8‘8×$Ñ$ Y×/ÑLùó   ƒ%(r"  rO  ©rš   rv  rc  rá   rì   r·  rU  rä   r'  rV  r  ri  r²   )rð  r¸  rd  rJ  r»  rÄ  Ú
cache_keysrj  r·   r§  Úresult_varsr  r\  r%  s               €€r‘   Úcse_multiplez'TritonKernel.scan.<locals>.cse_multiple  s  ø€ Ü�F“ˆAÜ;@À»8ÖD°a˜T˜F " Q C r¨%¨Ò1ÐDˆJÐDÜÓLÀÔLÔLØAKÖL°I˜Ÿ™Ÿ™ YÕ/ÒLÐLô '*¨&°&Ó&9÷á"�U˜Eð —‘—‘ e°5·;±;�Õ?ðˆKñ ð �L‰L×"Ñ"Ù�{Ó#Ð$ C¨ vÐ.ôô *-¨[¸*Ó)Eò 4Ñ%�
˜IÙØ+0�JÔ(Ø—‘—‘˜Y¨
Õ3ð4ô ˜Ó%Ð%ùò EùâLùóó   šDÁ"DÁ91D!ztl.associative_scan((r1  c                óT   — | j                   €y t        | j                   «      }d|d<   |S )NrÞ   r\  )rä   rt  )rô   rä   s     r‘   Ú_partial_scan_shapez.TritonKernel.scan.<locals>._partial_scan_shape"  s*   € Ø—9‘9Ð$Øä  §¡›O�EØ #�E˜"‘IØ �Lr“   ztriton_helpers.select_one((z1), rbase == (RBLOCK - 1), dim=-1, keep_dims=True)ztl.where(roffset > 0, z = tl.where(roffset > 0, )"rk  r+  r   rx  rŸ  r8  rÜ  r²   rA  rB  rá   r&  r'  rM  rî   rj  r·  r  rä   r<  r6  rë  rŠ  rò  rU  r7  r¶   rl  rV  rQ   r·   r•   rš  r  ) r%  rJ  rï  r¸  rd  Úbroadcasted_valuesÚaccumulatorsÚcse_computeÚcombine_helper_fnrz  r§  r·   Úvalue_dtyperÜ  Úreduced_sizeré  Úreduced_size_strr(  rh  Úpartial_scan_varsrk  Úpartial_scan_varÚpartial_reduce_varsÚ	accs_nextÚfull_scan_varsÚ	full_scanÚpartial_scanrg  Úacc_nextÚpartial_reducer  r\  s    `                              @r‘   ÚscanzTritonKernel.scanÊ  sö  ù€ ð ×$Ò$Ð$Ð$Ø×-Ò-Ð5¨vÓ5Ð-ÜÑI¸×8HÑ8HÔIÓIˆØ×Ñ˜%Ô Ü�u“ˆØ—?’?ÐNÐ$NÓNÐ"àÐØˆäÑF¸vÔFÓFˆÜ×'Ñ'¨¯©×(9Ñ(9¸4¿<¹<ÓHˆØ ×-Ñ-¨j¸&À&ÓIÐØ×%Ñ%Ó'¨$×*AÑ*AÑAˆä ¨Ó/ó 	1‰LˆE�5ØŸ(™(×+Ñ+Ø—‘Ø�'˜Ô1°%Ó8Ð9¸Ð;ØØ—k‘kð	 ,ó ˆKð —H‘H×%Ñ%Ø—‘Ø" ; -¨r°$×2EÑ2EÓ2GÐ1HÈÐJØÜ˜D×0Ñ0Ó2Ó3ð	 &ó ˆEð ×%Ñ% eÔ,ä& uÓ-ˆHà×,Ó,Ø#×3Ñ3Ó5�Ø#&�˜RÑ Ø"Ÿh™hŸo™o°EÀ˜oÓN�Ø%& t§y¡y°Ó'>Ð&?¸qÐ#AÐ à,1×,CÒ,C™.È�Ø—	‘	×#Ñ#Ø"�m ;Ð/?Ð.@ÀÀ7À)È2ÈhÈZÐWXÐYôð ×#Ñ# KÖ0ð9	1ò<	=õ	&ñ$ )Ø#¡CÐ(:Ó$;Ð#<¸CÀ¸uÀBÐGXÐFYÐYZÐ[ØØØó	
Ðð ×(Ò(ò!ð ):ö#ð %ñ Ø1Ð2BÐ1CÐCtÐuÜ-Ð.>×.DÑ.DÓEÙ-Ð.>Ó?öð#Ðð #ñ #¤5¨Ó#6¼Ð>QÓ8RÓSˆIÙ'¬¨lÓ(;Ð=NÓOˆNô 03°>ÐCTÓ/U÷ñ ,�I˜|ñ Ø,¨Y¨K°r¸,¸ÀqÐIØ&×,Ñ,Ø&×,Ñ,öðˆKñ ô :=Ø˜<Ð)<ó:ò Ñ5�˜+ ~ð —‘×&Ñ&Ø"�mÐ#<¸X¸JÀbÈÐHXÐXYÐZõñð ,ˆKà%ò 	5ˆJÜ˜jÔ*;Ô<Ð<Ð<Ü#-¨eÓ#4ˆJÕ ð	5ô �[Ó!Ð!ùò?#ùós   Ê/NË20Nc                ó,  ‡ ‡— ‰ j                   sJ ‚‰ j                  rJ d«       ‚t        d„ ‰ j                  D «       «      }‰ j	                  |«       t        |«      }‰ j                  rJ d«       ‚‰ j                  sJ d«       ‚t        j                  ‰ j                  j                  ‰ j                  «      }‰ j                  «       ‰ j                  z
  }t        d„ |D «       «      }t!        |«      t!        |«      k(  sJ ‚t#        |«      D ��	cg c]?  \  }}	 |d|	› d‰ j%                  «       › d�||   t        ‰ j'                  «       «      ¬	«      ‘ŒA }
}}	d
„ Šˆˆ fd„}‰ j                  d   j(                  sJ ‚‰ j+                  ‰ j                  d   «      rdnd}t!        |«      dk(  r'd|
d   › d|
d   › d|› d|› d|› d|› d�} |||
||«      }nt-        d«      ‚t/        ||«      D ]  \  }}||_        |j2                  |_        Œ t        |«      S c c}	}w )NrO  c              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr©   r±  r4  s     r‘   r­   z$TritonKernel.sort.<locals>.<genexpr>T  rŠ  r›  z(ops.sort not supported inside ops.maskedz3ops.sort is only supported in persistent reductionsc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr©   rR  rS  s     r‘   r­   z$TritonKernel.sort.<locals>.<genexpr>_  rT  r´  r°  r±  r²  r"  c                ó2   — dj                  d„ | D «       «      S )NrL  c              3  ó&   K  — | ]	  }|› d �–— Œ y­wrW  r�   rX  s     r‘   r­   z1TritonKernel.sort.<locals>.csv.<locals>.<genexpr>k  rY  rC  rZ  r[  s    r‘   r\  zTritonKernel.sort.<locals>.csvj  r]  r“   c                óN  •— t        |«      }t        |«      D �cg c]  }| › d|› d|› �‘Œ }}t        ˆfd„|D «       «      r)|D �cg c]  }‰j                  j	                  |«      ‘Œ c}S t        ||«      D ��	cg c],  \  }}	‰j                  j                  ||	j                  ¬«      ‘Œ. }
}}	‰j                  j                   ‰|
«      › d| › �«       t        |
|«      D ]*  \  }}|r||_
        ‰j                  j                  ||«       Œ, t        |
«      S c c}w c c}w c c}	}w )Nr±  c              3  óT   •K  — | ]  }‰j                   j                  |«      –— Œ! y ­wr©   r`  rb  s     €r‘   r­   z:TritonKernel.sort.<locals>.cse_multiple.<locals>.<genexpr>p  rc  rd  r"  rO  re  )rð  rl  rd  rJ  r»  rÄ  rf  rj  r·   r§  rg  r  r\  r%  s               €€r‘   rh  z'TritonKernel.sort.<locals>.cse_multiplem  s  ø€ ÜÐ&Ó'ˆAÜ;@À»8ÖD°a˜T˜F " Q C r¨%¨Ò1ÐDˆJÐDÜÓLÀÔLÔLØAKÖL°I˜Ÿ™Ÿ™ YÕ/ÒLÐLô %(¨Ð0BÓ$C÷á �E˜5ð —‘—‘ e°5·;±;�Õ?ðˆKñ ð �L‰L×"Ñ"Ù�{Ó#Ð$ C¨ vÐ.ôô *-¨[¸*Ó)Eò 4Ñ%�
˜IÙØ+0�JÔ(Ø—‘—‘˜Y¨
Õ3ð4ô ˜Ó%Ð%ùò EùâLùóri  r\  rÆ   Úrnumelr#   ztriton_helpers.sort_with_index(r   rW   z	, stable=z, descending=zUnhandled sort)rk  r+  r   rx  rŸ  r8  rÜ  rò  rA  rB  rá   r&  r'  rî   rj  r²   rš   rR  r<  r6  r  r  rs  r·  r  rž  )r%  rJ  r¸  ÚstableÚ
descendingrd  rn  rz  rÄ  r§  rl  rh  r„  rð  rg  r  Ú	input_varr\  s   `                @r‘   r•  zTritonKernel.sortK  s@  ù€ ð ×$Ò$Ð$Ð$Ø×-Ò-Ð5¨vÓ5Ð-ÜÑI¸×8HÑ8HÔIÓIˆØ×Ñ˜%Ô Ü�u“ˆØ—?’?ÐNÐ$NÓNÐ"Ø×(Ò(ð 	
ØAó	
Ð(ô  ×'Ñ'¨¯©×(9Ñ(9¸4¿<¹<ÓHˆØ×%Ñ%Ó'¨$×*AÑ*AÑAˆäÑF¸vÔFÓFˆÜ�6‹{œc &›kÒ)Ð)Ð)ô & fÓ-÷
ñ ��5ñ Ø" 5 '¨¨D×,?Ñ,?Ó,AÐ+BÀ!ÐDØ˜Q‘iÜ˜D×0Ñ0Ó2Ó3öð
Ðñ 
ò	=õ	&ð$ ×Ñ Ñ#×0Ò0Ð0Ð0Ø×2Ñ2°4×3CÑ3CÀBÑ3GÔH‘Èhˆäˆv‹;˜!Òà1Ð2DÀQÑ2GÐ1HÈÐK]Ð^_ÑK`ÐJað bØ�8˜2˜c˜U )¨F¨8°=ÀÀÈAðOð ñ ' tÐ-?ÀÈÓO‰Kä Ð!1Ó2Ð2ä%(¨°fÓ%=ò 	1Ñ!ˆJ˜	Ø#(ˆJÔ Ø )× 0Ñ 0ˆJÕð	1ô �[Ó!Ð!ùó]
s   ÄAHc                ó¼   — | j                   sy|j                  | j                   «       | j                   j                  «        | j                  j                  «        y)z¤
        Generate the output from prologue. This should be
        extracted from the subgraph, which is why this is
        partitioned from codegen_body.
        N)r  r\  Úclearr  )r%  r  s     r‘   Úcodegen_prologuezTritonKernel.codegen_prologue‘  s@   € ð �}Š}Øà�‰�D—M‘MÔ"Ø�‰×ÑÔØ×Ñ×!Ñ!Õ#r“   c                óf  — | j                   s=| j                  s1| j                  s%| j                  s| j                  s| j
                  sy| j                  D �cg c]  }|j                  sŒ|‘Œ }}| j                  �rÍ| j                  sJ d«       ‚i }t        | j                  «      D ]ª  \  }}|j                  }t        j                  j                  |t         j"                  «      }| j%                  t&        |«      }d|› �}| j(                  j+                  |› d|› d�«       | j,                  j/                  |t         j"                  d¬«      ||<   Œ¬ | j(                  j+                  d«       | j(                  j+                  d	«       | j(                  j1                  d
¬«      5  | j3                  «       sZ| j                  d   }	|	j4                  dk(  sJ ‚|	j4                  }
| j(                  j+                  |
› d|	j6                  › d|
› d�«       | j(                  j9                  | j                   «       | j(                  j;                  dg«       | j(                  j9                  | j                  «       | j(                  j9                  | j                  «       | j(                  j9                  | j                  «       | j(                  j9                  | j
                  «       t        | j                  «      D ]ü  \  }}|j<                  }d|› �}t        j>                  |j                  t         j"                  «      }tA        |j                  «      }| j,                  jC                  | j(                  |› d|› d�|jD                  d¬«      }ddl#}|jH                  jJ                  jM                  | d| j(                  «      5   |||   |«      }ddd«       | j(                  j+                  |› d› �«       Œþ 	 ddd«       tO        tQ        | j                  «      «      D ]$  }| j(                  j+                  d|› d|› d�«       Œ& �n/| jR                  �rŽtQ        |«      dkD  �rt        |«      D �]  \  }}| j(                  j1                  |¬«      5  |j4                  }| jT                  rdnd}| jT                  rdn|› d�}t         jV                  jX                  rt[        «       dkD  rd}nd}| j(                  j+                  d |› d!|› d"|› d"|j]                  «       › d#|› d$�«       ddd«       | j(                  j1                  |d
z   ¬«      5  | j_                  || j(                  «       ddd«       �Œ | j(                  j1                  tQ        |«      ¬«      5  | ja                  | j(                  «       | j(                  j9                  | j                   «       | j(                  j9                  | j                  «       | j(                  j9                  | j                  «       | j(                  j9                  | j                  «       ddd«       tc        g t        |«      ¢«      D �]u  \  }}| j(                  j1                  |d
z   ¬«      5  | jd                  |jf                     ji                  «       D ]ç  \  }}|tQ        |«      d
z
  k  ry||d
z      }| jd                  |jf                     }||v rT||   }tj        jm                  |«      }to        |jp                  |«      }ts        ||«      D ��cg c]  \  }}|||z  z
  ‘Œ }}}| j(                  j+                  tu        | jv                  |   |› d%|› d"tx        jz                  j}                  |«      › d&�«      «       Œé 	 ddd«       | j,                  j                  | j€                  «       |jƒ                  «        �Œx n”| j(                  j9                  | j                   «       | j(                  j9                  | j                  «       | j(                  j9                  | j                  «       | j(                  j9                  | j                  «       | j(                  j9                  | j                  «       | jT                  rb| j                  s| j
                  rJ| j„                  › d'�}| j(                  j9                  d(|› d)�d*¬+«       | j†                  j‰                  «        | j                  s%| j(                  j9                  | j
                  «       | j                   j‹                  «        | j                  j‹                  «        | j                  j‹                  «        | j                  j‹                  «        | j                  j‹                  «        | j
                  j‹                  «        yc c}w # 1 sw Y   �ŒxY w# 1 sw Y   �ŒóxY w# 1 sw Y   �ŒÒxY w# 1 sw Y   �ŒŸxY w# 1 sw Y   �ŒÈxY wc c}}w # 1 sw Y   �Œ„xY w),a  
        Concat output code from index_code, loads, compute, stores,
        suffix into self.body.

        For pointwise kernels, this is called just once at the end.

        For reduction kernels, this generates a loop over the reduction
        axis.
        Nz1Mix order reduction requires persistent reductionÚaccumz = tl.full([R0_BLOCK], z, tl.float32)[None, :])rÞ   ÚR0_BLOCKr"  z/split_size = min(RSPLIT_SIZE, xnumel - xoffset)z@for _ in tl.range(0, split_size, XBLOCK, num_stages=NUM_STAGES):rW   )rÖ   r   r]  zmask = ú < ró  zxindex += XBLOCKr9  z, 0))r�  r'  rO  z&tl.store(ws_ptr + (tl.program_id(0) + z3 * tl.num_programs(0)) * r0_numel + r0_index, accumz
, r0_mask)Úrsplit_startré  Ú
rsplit_end)r   r#   z, num_stages = 2rÍ   zfor zoffset in tl.range(r±  rÚ   r7  z = tl.advance(r²  z + tl.program_id(1)zR
                if HAS_RSPLIT:
                    triton_helpers.x_grid_barrier(z)
                Tr  )FÚindexing_coderô  rO  r'  r  r  rx  rc  Úmix_order_reductionrò  rR  r%  rŽ   r%   r#  rÎ  r¿   r<  r±  ri   rl  rV  rá   rÍ  ra  r_  rf  rã   r\  Ú
writelinesr§  rÏ  r’   r&  r·   ÚunittestÚmockÚpatchÚobjectrv  rš   rk  r+  r	  r
  r   r  rd  rh  ru  r"  r  rµ  rÕ   rñ   r   ró  r·  r^   r!  rU   rà   r¹  Ú
invalidater  Úcache_clearrZ  r[  rÎ  r‰  ) r%  r÷   Ú
loop_treesÚaccumname2varr˜  Úpartial_accumrŽ   r(  rã   r?  r]  rô   rï  Útriton_reduction_functionÚnewvalr”  rð  Úlevelrf  Ú
loop_startÚloop_endÚ
num_stagesrJ  ÚadvancementÚ	prev_treeÚprev_advancementsÚprev_advancementÚ
prev_blockÚprev_num_iterÚcurÚprevÚsem_ptrs                                    r‘   Úcodegen_bodyzTritonKernel.codegen_bodyž  sØ  € ð ×ÒØ�zŠzØ�{Š{Ø�|Š|Ø×%Ò%Ø×#Ò#àà'+×'7Ñ'7ÖH˜t¸4¿<»<’dÐHˆ
ÐHØ×#Ó#Ø×,Ò,ð ØCóÐ,ð ˆMÜ&/°×0MÑ0MÓ&Nò 
Ñ"��]Ø!.×!=Ñ!=�ÜŸ,™,×:Ñ:¸>Ì5Ï;É;ÓW�Ø×3Ñ3´MÀ7ÓK�Ø˜s˜e�}�Ø—	‘	×#Ñ#Ø�fÐ3°G°9Ð<RÐSôð '+§h¡h×&7Ñ&7Ø¤§¡Ð3Dð '8ó '�˜dÒ#ð
ð �I‰I×ÑÐ QÔRØ�I‰I×ÑØRôð —‘×!Ñ!¨Ð!Ó+ñ )?à×/Ñ/Ô1Ø ×,Ñ,¨QÑ/�EØ Ÿ<™<¨3Ò.Ð.Ð.ØŸ™�AØ—I‘I×'Ñ'¨1¨#¨W°U·Z±Z°LÀÀAÀ3ÀeÐ(LÔMØ—	‘	× Ñ  ×!3Ñ!3Ô4Ø—	‘	×$Ñ$à*ðôð
 —	‘	× Ñ  §¡Ô,Ø—	‘	× Ñ  §¡Ô.Ø—	‘	× Ñ  §¡Ô-Ø—	‘	× Ñ  ×!5Ñ!5Ô6ô +4°D×4QÑ4QÓ*Rò ?Ñ&�C˜Ø'×-Ñ-�CØ" 3 %˜=�DÜ!#×!<Ñ!<Ø%×4Ñ4´e·k±kó"�Jô 1NØ%×4Ñ4ó1Ð-ð "ŸX™X×.Ñ.ØŸ	™	Ø4Ð5°Q°s°e¸4Ð@Ø!Ÿi™iØ+ð	 /ó �Fó $à!Ÿ™×,Ñ,×3Ñ3°D¸)ÀTÇYÁYÓOñ Ù",Ø)¨$Ñ/Ø"ó#˜÷ð
 —I‘I×'Ñ'¨4¨&°°G°9Ð(=Õ>ñ-?÷')?ôV œS ×!>Ñ!>Ó?Ó@ò �Ø—	‘	×#Ñ#Ø<¸S¸EÐAtÐuxÐtyð  zDð  Eõòð
 ×"Ó"¤s¨:£¸Ó':ä(¨Ó4ó J‘��tØ—Y‘Y×%Ñ%¨UÐ%Ó3ñ Ø!Ÿ[™[�FØ37×3MÒ3M¡ÐSV�Jà(,×(BÒ(B™È6È(ÐRWÐHXð ô
 —}‘}×(Ò(Ô-?Ó-AÀFÒ-JØ%7™
à%'˜
Ø—I‘I×'Ñ'Ø˜v˜hÐ&9¸*¸ÀRÈÀzÐQSÐTZ×T`ÑT`ÓTbÐScÐchÐisÐhtÐtvÐwô÷ð —Y‘Y×%Ñ%¨U°Q©YÐ%Ó7ñ JØ×8Ñ8¸¸t¿y¹yÔI÷Jñ Jð!Jð( —‘×!Ñ!¬¨Z«Ð!Ó9ñ .Ø×.Ñ.¨t¯y©yÔ9Ø—	‘	× Ñ  ×!3Ñ!3Ô4Ø—	‘	× Ñ  §¡Ô,Ø—	‘	× Ñ  §¡Ô.Ø—	‘	× Ñ  §¡Ô-÷.ô  (Ð(@¬)°JÓ*?Ð(@ÓAó  #‘��tØ—Y‘Y×%Ñ%¨U°Q©YÐ%Ó7ñ à26×2KÑ2KØŸ	™	ñ3ç‘e“gòÑ.˜	 ;ð !¤3 z£?°QÑ#6Ò6Ø(2°5¸1±9Ñ(=˜IØ04×0IÑ0IØ )§¡ñ1Ð-ð
  )Ð,=Ñ=Ø3DÀYÑ3OÐ 0Ü-:×-IÑ-IÈ)Ó-T 
Ü07¸	¿¹ÈÓ0T ô 69¸ÐFVÓ5W÷/"á(1¨¨Tð %(¨$°Ñ*>Ó$>ð/" ñ /"ð
 Ÿ	™	×+Ñ+Ü(Ø $× 8Ñ 8¸Ñ CØ#, +¨^¸I¸;ÀbÌÏÉ×I^ÑI^Ð_jÓIkÐHlÐlmÐ nóõñ)÷ð< —‘×#Ñ# D×$:Ñ$:Ô;Ø× Ñ Ö"ñA #ðD �I‰I×Ñ˜T×/Ñ/Ô0Ø�I‰I×Ñ˜TŸZ™ZÔ(Ø�I‰I×Ñ˜TŸ\™\Ô*Ø�I‰I×Ñ˜TŸ[™[Ô)Ø�	‰	×Ñ˜×/Ñ/Ô0Ø×%Ò%Ø×"Ò" d×&:Ò&:à×-Ñ-Ð.Ð.AÐBˆGØ�I‰I×Ñð3à3:°)ð <ðð ð ô ð ×6Ñ6×BÑBÔDØ×'Ò'Ø�I‰I×Ñ˜T×1Ñ1Ô2Ø×Ñ× Ñ Ô"Ø�
‰
×ÑÔØ�‰×ÑÔØ�‰×ÑÔØ×Ñ×$Ñ$Ô&Ø×Ñ×"Ñ"Õ$ùò{ I÷rñ ú÷I)?ñ )?ú÷fñ ú÷Jñ Jú÷.ñ .üó4/"÷#ñ úsw   ÁgÁ*gÆ&Hg,ÏgÏ*g,ÒBg9ÕhÖB0hÚB#h&Ü4h ÝAh&çg)ç$g,ç,g6ç9h	èh	èhè h&è&h0	c                ó’  — g }| j                  «       �r3g }| j                  d|g «       |D �]  }t        |t        «      r|j	                  t        |«      «       Œ/t        |t        «      rZt        j                  j                  j                  |j                  | j                  ¬«      }|j	                  t        |«      «       Œ™t        |t        j                  «      rQt        j                  j                  j                  || j                  ¬«      }|j	                  t        |«      «       �Œt        dt!        |«      › �«      ‚ |S )NrÍ   ©r#  z!Unsupported numel argument type: )rl  Úadd_numel_to_call_argsr•   r  rë  rð   rw   rU   ra  rZ  Úoptimization_hint_with_overrideÚ
inner_exprr#  r–   r—   rw  rM  )r%  r±   Ú
numel_argsr«   Úhints        r‘   Úkernel_benchmark_extra_argsz(TritonKernel.kernel_benchmark_extra_argsQ  s  € ØˆØ×ÑÕ!Ø+-ˆJØ×'Ñ'¨¨J¸Ô;Ø!ó V�Ü˜c¤3Ô'Ø—K‘K¤ C£Õ)Ü ¤_Ô5ÜŸ7™7×+Ñ+×KÑKØŸ™Ø&*×&8Ñ&8ð Ló �Dð —K‘K¤ D£	Õ*Ü ¤U§Z¡ZÔ0ÜŸ7™7×+Ñ+×KÑKØØ&*×&8Ñ&8ð Ló �Dð —K‘K¤ D£	Ö*ä$Ð'HÌÈcËÈÐ%TÓUÐUð!Vð" ˆr“   c                ó  — t        «       }| j                  j                  «       \  }}}}|j                  g d¢«       |j	                  «       5  t        j                  «       }g }t        ||«      D �]  \  }	}
dt        |«      › �}t        j                  j                  |	«      }|rÄt        j                  j                  j                  |j                  «       | j                  ¬«      }t        j                  j                  j                  |j!                  «       | j                  ¬«      }|j#                  |› d|› d|› d|j%                  «       › d|j'                  «       › d�
«       �n|	t        j                  j(                  v rÙt        j                  j(                  |	   }t        j                  j                  j                  |j+                  «       | j                  ¬«      }t        j                  j                  j                  |j-                  «       | j                  ¬«      }|j#                  |› d|› d|› d|j.                  › d|j0                  › d�
«       �nt3        |
t4        «      rft        j                  j                  j7                  |
j8                  | j                  ¬«      }d	|
j:                  v rd
}|j#                  |› d|› �«       n£t3        |
t<        «      r…t        j                  j?                  «       }t        j                  j                  j7                  |
j                  | j                  ¬«      }|j#                  |› d|› d|› d|
j0                  › d�«       ntA        d|	› �«      ‚|jC                  |«       �Œ |jE                  | jG                  «       «       |j#                  ddjI                  |«      › d�«       ddd«       |j                  g d¢«       t        j                  j?                  «       }|jJ                  }|j	                  «       5  |j#                  dt        j                  jL                  jO                  |«      › d�«       |j	                  «       5  |j#                  t        j                  jL                  jQ                  |«      «       tS        |«      }|j#                  |› d|› d�«       |j#                  tU        tV        jX                  «      › d|› d�«       ddd«       ddd«       |j                  g d¢«       |j	                  «       5  |j#                  dt        j                  jL                  jO                  |«      › d�«       |j	                  «       5  |j#                  t        j                  jL                  jQ                  |«      «       |j#                  dtU        tV        jX                  «      › d�«       ddd«       ddd«       |j                  g d¢«       |j	                  «       5  |j#                  d«       |j#                  d«       |j#                  d«       |j#                  dt        j                  j?                  «       jZ                  › d�«       |j#                  d|› �«       |j#                  d«       |j#                  d «       ddd«       |S # 1 sw Y   �ŒôxY w# 1 sw Y   �ŒÖxY w# 1 sw Y   �ŒÛxY w# 1 sw Y   �ŒxY w# 1 sw Y   �ŒxY w# 1 sw Y   |S xY w)!aÕ  
        Generates Python code for benchmarking this Triton kernel.
        - Creates example inputs (random tensors, constants, sizes).
        - Runs the kernel on the current GPU/stream.
        - Prints runtime (ms) and throughput (GB/s) using `num_gb`.
        Args:
            num_gb (float): The number of gigabytes to use for throughput calculation.
        Returns:
            IndentedBuffer: A buffer containing the generated Python benchmark code.
        )rÍ   rÍ   zdef get_args():Úarg_r®  z = rand_strided(r±  z
, device='z	', dtype=r²  rf  r   rO  z = torch.zeros(z*Don't find the buffer or const tensor for rE  rD  N)ú
r·  zdef call(args):zwith rê  z = get_raw_stream(z.run(*args, stream=)r·  r·  z def benchmark_all_configs(args):z.benchmark_all_configs(*args))r·  r·  zif __name__ == '__main__':z<from torch._inductor.runtime.benchmarking import benchmarkerrÍ   zargs = get_args()z7ms = benchmarker.benchmark(lambda: call(args), device='z
', rep=40)z	num_gb = zgb_per_s = num_gb / (ms / 1e3)z<print(f"{ms:.3f}ms    {num_gb:.3f}GB    {gb_per_s:.2f}GB/s")).r_   r±   Úpython_argdefsr“  ra  r¶  r  r·  rÌ  rU   ra  Útry_get_bufferrZ  Ú optimization_hints_with_overrideÚget_sizer#  Ú
get_striderV  Ú
get_devicerÜ  Ú	constantsrð  r€  Údevicer·   r•   re   r°  r�   rã   rg   r©  ÚKeyErrorrë  Úextendr´  r7  r!  Ú
device_opsÚdevice_guardÚ
set_devicer@   rð   rI   ÚKERNEL_NAMErM  )r%  Únum_gbr�  Ú_argdefsÚ	call_argsrK  rY  Úname_cntÚ	var_namesÚarg_nameÚarg_sigÚvar_namerâ  rð  r€  Úconst_tensorÚsymval_hintr¿  r  r  r!  Ústream_names                         r‘   Úcodegen_kernel_benchmarkz%TritonKernel.codegen_kernel_benchmarki  s:  € ô  Ó!ˆØ,0¯I©I×,DÑ,DÓ,FÑ)ˆ�)˜Y¨à×ÑÒ5Ô6Ø�]‰]‹_ñ :	@Ü —‘Ó(ˆHØˆIÜ%(¨°IÓ%>ó 5+Ñ!�˜'Ø!¤$ x£.Ð!1Ð2�Ü—g‘g×,Ñ,¨XÓ6�ÙÜŸ7™7×+Ñ+×LÑLØŸ™›Ø&*×&8Ñ&8ð Mó �Dô ŸW™W×-Ñ-×NÑNØŸ™Ó(Ø&*×&8Ñ&8ð Oó �Fð ×$Ñ$Ø#˜*Ð$4°T°F¸"¸V¸HÀJÈsÏ~É~ÓO_ÐN`Ð`iÐjm×jwÑjwÓjyÐizÐz{Ð|öð ¤§¡×!2Ñ!2Ñ2ä#$§7¡7×#4Ñ#4°XÑ#>�LÜŸ7™7×+Ñ+×LÑLØ$×)Ñ)Ó+Ø&*×&8Ñ&8ð Mó �Dô ŸW™W×-Ñ-×NÑNØ$×+Ñ+Ó-Ø&*×&8Ñ&8ð Oó �Fð ×$Ñ$Ø#˜*Ð$4°T°F¸"¸V¸HÀJÈ|×ObÑObÐNcÐclÐmy×mÑmð  mAð  ABð  Cöô   ¬Ô1Ü"#§'¡'×"2Ñ"2×"RÑ"RØŸ™Ø&*×&8Ñ&8ð #Só #�Kð %¨¯©Ñ4Ø&'˜Ø×$Ñ$¨ z°°[°MÐ%BÕCÜ ¬Ô6ÜŸW™W×@Ñ@ÓB�FÜŸG™G×,Ñ,×LÑLØŸ™°T×5GÑ5Gð Mó �Eð ×$Ñ$Ø#˜* O°E°7¸*ÀVÀHÈIÐV]×VcÑVcÐUdÐdeÐfõô #ØDÀXÀJÐOóð ð × Ñ  Ö*ðk5+ðl ×Ñ˜T×=Ñ=Ó?Ô@Ø×Ñ˜w t§y¡y°Ó';Ð&<¸AÐ>Ô?÷u:	@ðx 	×ÑÒ9Ô:ÜŸ™×<Ñ<Ó>ˆØ×$Ñ$ˆØ�]‰]‹_ñ 
	Ø×Ñ˜u¤Q§W¡W×%7Ñ%7×%DÑ%DÀUÓ%KÐ$LÈAÐNÔOØ—‘“ñ Ø× Ñ Ü—G‘G×&Ñ&×1Ñ1°%Ó8ôô 2°%Ó8�Ø× Ñ  K =Ð0BÀ5À'ÈÐ!KÔLØ× Ñ Üœ;×2Ñ2Ó3Ð4Ð4GÈÀ}ÐTUÐVô÷÷
	ð 	×ÑÒJÔKØ�]‰]‹_ñ 	Ø×Ñ˜u¤Q§W¡W×%7Ñ%7×%DÑ%DÀUÓ%KÐ$LÈAÐNÔOØ—‘“ñ Ø× Ñ Ü—G‘G×&Ñ&×1Ñ1°%Ó8ôð × Ñ Øœc¤+×"9Ñ"9Ó:Ð;Ð;XÐYô÷	÷	ð 	×ÑÒDÔEØ�]‰]‹_ñ 	Ø×ÑØNôð ×Ñ˜RÔ à×ÑÐ0Ô1Ø×ÑØIÌ!Ï'É'×JmÑJmÓJo×JtÑJtÐIuÐuð  Aôð ×Ñ˜y¨¨Ð1Ô2Ø×ÑÐ=Ô>Ø×ÑØNô÷	ð  ˆ÷Q:	@ñ :	@ú÷Bñ ú÷
	ñ 
	ú÷ ñ ú÷	ñ 	ú÷	ð  ˆúsf   ÁN[Ð$A[Ñ1B	[Ó:[Ô-A[5Õ:A%[(×[5ØB%\Û[Û[	Û[Û[%Û([2	Û-[5Û5[?Ü\c                ó˜   — t        j                  dj                  t        j                  j
                  j                  d«      «      «      S )Nzl
            from torch._dynamo.testing import rand_strided
            {}
            import torch
        Úget_raw_stream)ÚtextwrapÚdedentrÓ  rU   ra  rÂ  Úimport_get_raw_stream_asr$  s    r‘   Úimports_for_benchmark_kernelz)TritonKernel.imports_for_benchmark_kernelâ  s:   € Ü�‰ð÷ ‰F”1—7‘7×%Ñ%×>Ñ>Ð?OÓPÓQó
ð 	
r“   c                óˆ   — | j                   ry| j                  ry| j                  r| j                  sJ ‚y| j                  ryy)Nrù  r+  rò  r  Ú	pointwise)rù  r+  rò  rk  r$  s    r‘   Ú_get_heuristiczTritonKernel._get_heuristicë  sD   € Ø×ÒØ!Ø×'Ò'Ø*Ø×&Ò&Ø×(Ò(Ð(Ð(Ø)Ø×"Ò"ØØr“   c                óT  — t        «       }|j                  d«       	 dd l}|j                  d«       t	        «       x}r|j                  |«       |j                  d«       t        j                  j                  r|j                  d«       |j                  «       S # t        $ r Y Œtw xY w)NzP
            import triton
            import triton.language as tl
            r   zU
               import triton.language.extra.tlx as tlx  # noqa: F401
               a'  
            from torch._inductor.runtime import triton_helpers, triton_heuristics
            from torch._inductor.runtime.triton_helpers import libdevice, math as tl_math
            from torch._inductor.runtime.hints import AutotuneHint, ReductionHint, TileHint, DeviceProperties
            z¥
                import triton.profiler as proton
                import triton.profiler.language as pl
                pl.enable_semantic('triton')
                )
r_   r\  Útriton.language.extra.tlxÚImportErrorrÓ   rV  r$   rÒ   Úproton_profilingrI  )rÂ   ÚimportsrÒ   Ú	attr_descs       r‘   Úgen_common_triton_importsz&TritonKernel.gen_common_triton_imports÷  sª   € ô !Ó"ˆØ�‰ðô	
ð		Û,à�N‰Nðôô 3Ó4Ð4ˆ9Ð4Ø×Ñ˜iÔ(à�‰ðô	
ô �=‰=×)Ò)Ø�N‰Nðôð ×ÑÓ!Ð!øô+ ò 	Ùð	ús   �B Â	B'Â&B'c                óx   — t         j                   | j                  «       t         j                  j                  dœS )N)Úenable_fp_fusionÚ
launch_pdlÚdisable_ftz)r$   Úemulate_precision_castsrþ  rò  rå  r�  s    r‘   Útriton_meta_commonzTritonKernel.triton_meta_common   s5   € ô %+×$BÑ$BÐ BØ×1Ñ1Ó3Ü!×0Ñ0×<Ñ<ñ
ð 	
r“   c                óX  — i dt         j                  j                  j                  «       “dt        j
                  “dt        j                  “dt        j                  j                  “dt        j                  “dt        j                  “dt        j                  “dt        j                  “d	t        j                  “d
t        j                  “dt        j                  j                  “dt        j                  j                   “dt        j                  j"                  “dt        j$                  xs t        j&                  “dt        j&                  “dt        j(                  j*                  “dt        j                  j,                  “dt        j                  j.                  i¥}t        j0                  rt        j2                  «       |d<   t         j4                  j6                  �d|d<   t	        j8                  «       rd|d<   t        j:                  rLt        j:                  |d<   t        j<                  |d<   t        j>                  |d<   t        j@                  |d<   t        jB                  r9t        jB                  |d<   t        jD                  |d<   t        jF                  |d<   |S )NÚbackend_hashÚassert_indirect_indexingÚautotune_local_cacheÚautotune_pointwiseÚautotune_remote_cacheÚforce_disable_cachesÚdynamic_scale_rblockÚincremental_autotuneÚmax_autotuneÚmax_autotune_pointwiseÚmin_split_scan_rblockÚspill_thresholdÚstore_cubinrD  Úbatch_invariantrF  Ú&mix_order_reduction_allow_multi_stagesÚdynamic_disable_pipeliningÚ$are_deterministic_algorithms_enabledTÚis_hipr  Úprofile_bandwidthÚprofile_bandwidth_regexÚprofile_bandwidth_outputÚ/profile_bandwidth_with_do_bench_using_profilingÚcoordinate_descent_tuningÚ coordinate_descent_search_radiusÚ'coordinate_descent_check_all_directions)$r¿   r'   Ú_tritonÚtriton_hash_with_backendr$   rê  rë  rÒ   rì  rí  rî  rï  rð  rñ  rò  ró  rô  rõ  rD  rö  rE  rF  r÷  rø  Ú*write_are_deterministic_algorithms_enabledrù  r	  r
  r  rû  rü  rý  rþ  rÿ  r   r  )rÂ   Úinductor_metas     r‘   Úinductor_meta_commonz!TritonKernel.inductor_meta_common(  sv  € ð
ØœEŸK™K×/Ñ/×HÑHÓJð
à&¬×(GÑ(Gð
ð #¤F×$?Ñ$?ð
ð !¤&§-¡-×"BÑ"Bð	
ð
 $¤V×%AÑ%Að
ð #¤F×$?Ñ$?ð
ð #¤F×$?Ñ$?ð
ð #¤F×$?Ñ$?ð
ð œF×/Ñ/ð
ð %¤f×&CÑ&Cð
ð $¤V§]¡]×%HÑ%Hð
ð œvŸ}™}×<Ñ<ð
ð œ6Ÿ=™=×4Ñ4ð
ð œV×1Ñ1ÒK´V×5KÑ5Kð
ð œv×5Ñ5ð
ð  -¬f×.AÑ.A×.`Ñ.`ð!
ð" 5´f·m±m×6jÑ6jð#
ð$ )¬&¯-©-×*RÑ*Rñ%
ˆô* ×<Ò<ä×:Ñ:Ó<ð Ð@ÑAô �=‰=×ÑÐ(Ø&*ˆM˜(Ñ#Ü×ÑÔØ)-ˆM˜+Ñ&Ü×#Ò#Ü17×1IÑ1IˆMÐ-Ñ.Ü7=×7UÑ7UˆMÐ3Ñ4Ü8>×8WÑ8WˆMÐ4Ñ5ä×FÑFð ÐKÑLô ×+Ò+ä×0Ñ0ð Ð5Ñ6ô ×7Ñ7ð Ð<Ñ=ô ×>Ñ>ð ÐCÑDð Ðr“   c                óÆ  — | j                   | j                  | j                  | j                  | j                  t        | j                  «      dœ}| j                  r| j                  |d<   t        j                  st        j                  j                  r| j                  xs | j                  |d<   | j                  r| j                  |d<   | j                   r| j                   |d<   | j"                  �| j"                  |d<   | j$                  �| j$                  |d<   | j&                  r| j(                  |d<   | j+                  «       x}�||d	<   | j,                  rd
|d<   t        j.                  s t        j0                  st        j2                  r| j5                  «       dz  }|�||d<   t        j.                  st        j2                  r| j7                  «       }|�||d<   |S )z‹
        Used by both standalone codegen_kernel() and ComboKernel.combo_grid_meta()
        (which calls this on each sub_kernel).
        )re  rP  Únum_loadÚ	num_storeÚnum_reductionr(  ÚRSPLIT_SIZEÚ"has_loadstore_with_contiguous_rdimrú  Útiling_scoresÚ
min_xblockÚ
min_rblockrò  r4   TÚadd_persistent_rblockg    eÍÍAÚkernel_num_gbÚkernel_flop)re  rP  r  r	  r
  Úsetr(  r’  Úrsplit_sizer$   rD  rE  rF  r/  rN  rú  r  r  r  r+  rò  Ú$_get_native_matmul_persistent_rblockr  Úbenchmark_kernelrû  Úbenchmark_combo_kernelÚestimate_kernel_num_bytesÚestimate_flops)r%  rÖ  rÜ  rÆ  Úflopss        r‘   Úinductor_meta_per_kernelz%TritonKernel.inductor_meta_per_kernel[  s¸  € ð Ÿ™Ø $× 5Ñ 5ØŸ™ØŸ™Ø!×/Ñ/ä! $×"5Ñ"5Ó6ñ
ˆð ×#Ò#Ø!%×!1Ñ!1ˆC�ÑÜ×Ò¤6×#6Ñ#6×#UÒ#Uà×2Ñ2ò 7Ø×6Ñ6ð Ð4Ñ5ð ×#Ò#Ø)-×)AÑ)AˆCÐ%Ñ&Ø×ÒØ#'×#5Ñ#5ˆC�Ñ Ø�?‰?Ð&Ø $§¡ˆC�ÑØ�?‰?Ð&Ø $§¡ˆC�ÑØ×%Ò%Ø*.×*CÑ*CˆCÐ&Ñ'Ø×?Ñ?ÓAÐAˆFÐNØ5;ˆCÐ1Ñ2Ø×%Ò%Ø+/ˆCÐ'Ñ(ä×#Ò#Ü×'Ò'Ü×,Ò,à×3Ñ3Ó5¸Ñ;ˆFØÐ!Ø'-��OÑ$Ü×"Ò"¤f×&CÒ&CØ×'Ñ'Ó)ˆEØÐ Ø%*��MÑ"Øˆ
r“   c                óH  — | j                   j                  «       xr | j                   }| j                  }t	        | j
                  «      dk(  }|�rÒ|�rÏ| j                   j                  | j
                  «      }|j                  j                  j                  d   }|j                  }|�'d|v r#d|v r|d   t        |d   d«      z  }|t        k\  }n,| j                   j                  |«      t        j                  k(  }|j                   j                  j"                  }	|j                  j                  j"                  }
t$        j&                  j(                  j+                  |	«      t        t$        j&                  j(                  j+                  |
«      d«      z  }|dk\  r„|r‚t$        j&                  j(                  j-                  | j                   j.                  d«      rDt$        j&                  j(                  j1                  | j                   j.                  d«      r|d	k  ry
y)Nr#   r   r]  Úr0_rW   gÍÌÌÌÌÌô?i €  i   é
   TF)rm  r  rò  r  rš   r1  Úmemory_statsÚ
persistentÚmemoryrz  Úcount_per_threadr†   ÚINNER_REDUCTION_RATIO_THRESHOLDÚget_reduction_hintr5   ÚINNERÚloopedÚbytesrU   ra  rZ  Úoptimization_hintÚstatically_known_leqrT  Ústatically_known_gt)r%  Ú
looped_redr  Ú	two_d_redr  Ú	dim_statsÚmem_ops_per_threadÚr_coalesce_ratioÚcontiguous_redÚ
looped_memÚpersistent_memÚsaved_bytes_ratios               r‘   r  z"TritonKernel.add_persistent_rblockŒ  sÑ  € ð —]‘]×/Ñ/Ó1ÒS¸$×:SÑ:SÐ6Sˆ
Ø×*Ñ*ˆÜ˜Ÿ™Ó$¨Ñ)ˆ	Úš)ØŸ=™=×5Ñ5°d·k±kÓBˆLØ$×/Ñ/×6Ñ6×:Ñ:¸1Ñ=ˆIØ!*×!;Ñ!;Ðð Ð)Ø˜=Ñ(Ø˜]Ñ*ð $1°Ñ#7¼#¸mÈCÑ>PÐRSÓ:TÑ#TÐ Ø!1Ô5TÑ!T‘ð —M‘M×4Ñ4°]ÓCÜ$×*Ñ*ñ+ð ð
 &×,Ñ,×3Ñ3×9Ñ9ˆJØ)×4Ñ4×;Ñ;×AÑAˆNä !§¡× 0Ñ 0× BÑ BÀ:Ó NÔQTÜ—‘× Ñ ×2Ñ2°>ÓBØóRñ !Ðð " SÒ(Ù"ä—G‘G×$Ñ$×9Ñ9Ø—M‘M×1Ñ1°5ôô —G‘G×$Ñ$×8Ñ8Ø—M‘M×1Ñ1°4ôð '¨"Ò,àØr“   c                óÌ  ‡!‡"— t        «       }i }| j                  j                  «       D ]_  \  }}t        |«      r| j                  sŒt
        j                  j                  j                  |«      }t        t        |«      «      }|||<   Œa |€ž|j                  | j                  «       «       t
        j                  j                  «       j                  }|dk(  r|j                  d«       n|j                  d«       t        j                   r|j                  | j#                  «       «       | j$                  j'                  «       \  Š!}	Š"}	t)        ‰"«      D ]Ÿ  \  }
}t+        |t,        «      sŒt/        t0        j2                  |j4                  «      }|t
        j                  j                  j6                  v sŒbt-        |j8                  t
        j                  j                  j6                  |   «      ‰"|
<   Œ¡ t;        «       }| j<                  D �]  }|| j$                  j>                  v r(|jA                  | j$                  j>                  |   «       || j$                  jB                  v rj|t
        j                  jD                  vrN|| jD                  vr@|jA                  t/        tF        | j$                  jB                  |   «      jH                  «       || j$                  jJ                  v sŒß| j$                  jJ                  |   }t+        |tL        «      rJ ‚|jA                  |«       �Œ tO        ‰!‰"«      D ]O  \  }}t+        |tP        «      sŒ|jR                  tT        jV                  k(  sŒ5|jA                  |j8                  «       ŒQ tY        |«      }| j[                  «       D ]Z  }t-        |j\                  › d�|j^                  «      }‰"ja                  |«       ‰!ja                  tc        |j8                  «      «       Œ\ ˆ!ˆ"fd„}| jd                  D ]K  }|jf                  r| jh                  rŒ|jj                  €Œ) ||j\                  jm                  «       › d�«       ŒM | jn                  r |d«       | jp                  r |d	«        |d
«       ts        ‰"| jt                  ‰!¬«      }|tw        jx                  t
        j                  j                  «       «      i tz        j|                  j                  j~                  j€                  xr0 dtƒ        | j„                  «      v xs dtƒ        | j†                  «      v dœ| j‰                  «       ¥}| jn                  rd|d<   t
        j                  jŠ                  xs t
        j                  jŒ                  }| j�                  «       j�                  tƒ        t’        j”                  «      ||dœ| j—                  «       ¥| j™                  «       ¥}t›        ‰"«      D ]  }d|d   ‰"|   j8                  <   Œ || _N        || _O        | j¡                  | j„                  «       | j£                  «        | j¥                  | j„                  «       tz        j¦                  j¨                  �8| jª                  st        j~                  j¬                  st¯        ‰"d¬«      g|d<   nt¯        ‰"«      g|d<   | j°                  D ]$  }|j³                  d«       |j                  |«       Œ& | j´                  r2d| j·                  «       › d| j´                  j                  ›d|›d|›d�	}nŸ| j                  rF| j¸                  j»                  | j¼                  «      }d| j·                  «       › d|›d|› d|›d|›d�}nMt¿        |‰"«      }|�d|j8                  › d�nd}d| j·                  «       › d|›d |› d!|›d|›d"| jÀ                  › d�}|j                  |«       |xs tƒ        t’        jÂ                  «      }|j³                  d#|› d$d jÅ                  d%„ ‰!D «       «      › d&�«       |jÇ                  «       5  t        j~                  jÈ                  r|j³                  d'|› d(�«       | jË                  |«       | j$                  jÍ                  «       D ]  \  }} |j³                  |› d)| › �«       Œ |j                  | j„                  «       t        j~                  jÈ                  r|j³                  d*|› d(�«       ddd«       t        j                   r/|j                  | jÏ                  |jÑ                  d+«      «      «       |jÓ                  «       S # 1 sw Y   ŒXxY w),z©
        Convert the TritonKernel from Inductor SIMD IR to triton code, including inductor triton heuristics, imports,
        metadata, and benchmarking infra.
        NÚcpuz"triton_helpers.set_driver_to_cpu()z"triton_helpers.set_driver_to_gpu()ró  c                ó†   •— t        «       r‰j                  t        | «      «       ‰j                  t        | d¬«      «       y )NT)Úis_constexpr)rP   rë  r[   rY   )rË  ÚargdefsrK  s    €€r‘   Úadd_constexpr_argz6TritonKernel.codegen_kernel.<locals>.add_constexpr_arg  s/   ø€ ä-Ô/Ø× Ñ ¤¨hÓ!7Ô8Ø�N‰Nœ7 8¸$Ô?Õ@r“   rÚ   r  r  Ú
NUM_STAGES)Ú
size_dtyper8  ztl.dot)rK  r¿  r¾  Únative_matmulTÚlaunch_cooperative_grid)Ú	grid_typeÚkernel_nameÚmutated_arg_namesÚoptimize_memrW   r¾  r�   )Úpointer_range_overrideÚconfigsrÍ   z$
                @triton_heuristics.z(
                    config=zI,
                    filename=__file__,
                    triton_meta=z$,
                    inductor_meta=z;
                )
                @triton.jit
            z!(
                    size_hints=z%,
                    reduction_hint=ztile_hint=TileHint.rD  r±  zH
                    filename=__file__,
                    triton_meta=z*,
                    min_elem_per_thread=zdef r9  c              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr©   )Ú	full_namerH  s     r‘   r­   z.TritonKernel.codegen_kernel.<locals>.<genexpr>”  s   è ø€ Ò*J¸Q¨1¯;©;¯=Ñ*Jùr›  r7  zpl.enter_scope("r4  rO  zpl.exit_scope("r  )jr_   rl  rµ  rK   rk  rU   ra  rZ  r(  r9   r  r\  rá  r©  rM  r$   r  r×  r±   r¸  rR  r•   re   r
   r–   r  r�   Úinv_precomputed_replacementsrã   r   Ú	mutationsÚinput_buffersri  rÝ  Úremoved_buffersr`   Ú
inner_nameÚoutput_buffersrd   r·  rg   Ú	zero_moderh   ÚZERO_ON_CALLr8  r3  rf  ró  rë  rY   rx  r  rò  rï   r  r+  r’  ru   rø  r2   r‚  r¿   rä  rÒ   r<  rð   rl  r'  rç  Úis_inferenceÚis_backwardÚ_get_grid_typer¾   rI   ÚDESCRIPTIVE_NAMEr  r  rq   r)  r  rŠ  r¬  r#  r	  r
  rP  Úemit_pointer_range_32rp   r  rV  rù  rÚ  rm  r$  r  rs   rÏ  rÅ  r7  ra  rÞ  Úcodegen_static_numelsÚaliasesrÑ  rì   rI  )#r%  rã   r  Ú
size_hintsrf  ró  Ú
numel_hintÚ	size_hintÚdevice_typerY  rÄ  r«   r  Úmutated_argsÚmutationÚmutation_argÚargnamer÷   Úsizeargr9  Útriton_meta_signaturer)  rA  r  Úarg_numr>  Úheuristics_lineÚreduction_hintr³  Ú	tile_hintr?  ÚoldÚnewr8  rK  s#                                    @@r‘   Úcodegen_kernelzTritonKernel.codegen_kernelÀ  sP  ù€ ô Óˆàˆ
Ø!Ÿ[™[×.Ñ.Ó0ò 	+‰MˆF�EÜ" 6Ô*°4×3HÒ3HØäŸ™×)Ñ)×;Ñ;¸EÓBˆJÜ'¬¨J«Ó8ˆIØ!*ˆJ�vÒð	+ð ˆ<Ø�K‰K˜×6Ñ6Ó8Ô9ÜŸ'™'×=Ñ=Ó?×DÑDˆKØ˜eÒ#Ø—‘Ð@ÕAà—‘Ð@ÔAä×&Ò&Ø—‘˜D×=Ñ=Ó?Ô@à#'§9¡9×#;Ñ#;Ó#=Ñ ˆ��I˜qä 	Ó*ò 	‰FˆAˆsÜ˜#œwÕ'ô œeŸl™l¨C¯H©HÓ5�ØœQŸW™W×-Ñ-×JÑJÒJÜ#*ØŸ™¤!§'¡'×"2Ñ"2×"OÑ"OÐPVÑ"Wó$�I˜a’Lð	ô )3«ˆØŸ™ó 	/ˆHØ˜4Ÿ9™9×2Ñ2Ñ2Ø× Ñ  §¡×!8Ñ!8¸Ñ!BÔCà˜DŸI™I×5Ñ5Ñ5Ø¤A§G¡G×$;Ñ$;Ñ;Ø D×$8Ñ$8Ñ8à× Ñ Üœ¨¯©×)BÑ)BÀ8Ñ)LÓM×XÑXôð ˜4Ÿ9™9×3Ñ3Ò3Ø#Ÿy™y×7Ñ7¸ÑA�Ü% l´JÔ?Ð?Ð?Ø× Ñ  Ö.ð	/ô6   ¨Ó3ò 	/‰LˆG�Sä˜3¤Õ-Ø—M‘MÔ%6×%CÑ%CÓCà× Ñ  §¡Õ.ð	/ô ˜lÓ+ˆà×+Ñ+Ó-ò 	2ˆDÜ §¡ ¨UÐ3°T·Z±ZÓ@ˆGØ×Ñ˜WÔ%Ø�N‰Nœ7 7§<¡<Ó0Õ1ð	2õ	Að ×$Ñ$ò 	=ˆDØ× Ò  T×%>Ò%>àØ�‰Ð&Øá §¡×!2Ñ!2Ó!4Ð 5°UÐ;Õ<ð	=ð ×%Ò%Ù˜hÔ'à×#Ò#Ù˜mÔ,Ù˜lÔ+ä 1Ø $×"2Ñ"2¸Gô!
Ðð /Ü&×-Ñ-¬a¯g©g×.QÑ.QÓ.SÓTØä—‘×&Ñ&×-Ñ-×;Ñ;ò RØ¤ T§Y¡Y£Ð/ÒP°8¼sÀ4Ç<Á<Ó?PÐ3Pñ	'
ð ×%Ñ%Ó'ð	'
ˆð ×%Ò%ð 6:ˆKÐ1Ñ2ô
 —w‘w×+Ñ+ÒB¬q¯w©w×/BÑ/Bˆð ×,Ñ,Ó.×7Ñ7Üœ{×;Ñ;Ó<Ø!-Ø(ñ	
ð
 ×+Ñ+Ó-ð
ð ×'Ñ'Ó)ð
ˆô +¨9Ó5ò 	BˆGØ@AˆK˜Ñ$ Y¨wÑ%7×%<Ñ%<Ò=ð	Bð 'ˆÔØ*ˆÔà×Ñ˜dŸi™iÔ(Ø×ÑÔØ×Ñ˜Ÿ™Ô#ô �=‰=×ÑÐ(Ø×!Ò!¬¯©×)LÒ)Lä&/°	ÐRTÔ&UÐ%VˆK˜	Ò"ä&/°	Ó&:Ð%;ˆK˜	Ñ"à×+Ñ+ò 	 ˆFØ�N‰N˜2ÔØ�K‰K˜Õð	 ð ×Òð#$Ø$(×$7Ñ$7Ó$9Ð#:ð ;Ø ×-Ñ-×4Ñ4Ð7ð 8!à!, ð 0#Ø#0Ð"3ð 4ð‰Oð ×"Ò"Ø!Ÿ]™]×=Ñ=¸d×>PÑ>PÓQˆNð#$Ø$(×$7Ñ$7Ó$9Ð#:ð ; Ø *˜~ð .$Ø$2Ð#3ð 4!à!, ð 0#Ø#0Ð"3ð 4ð	‰Oô $ J°	Ó:ˆDØ>BÐ>NÐ-¨d¯i©i¨[¸Ñ:ÐTVˆIð#$Ø$(×$7Ñ$7Ó$9Ð#:ð ; Ø *˜~¨R°	¨{ð ;!à!, ð 0#Ø#0Ð"3ð 4)Ø)-×)AÑ)AÐ(Bð Cð	ˆOð 	�‰�OÔ$ØÒ:œc¤+×"9Ñ"9Ó:ˆØ�‰Ø�;�-˜q §¡Ñ*JÀ'Ô*JÓ!JÐ KÈ2ÐNô	
ð �[‰[‹]ñ 	BÜ�}‰}×-Ò-Ø—‘Ð!1°+°¸bÐAÔBØ×&Ñ& tÔ,Ø ŸI™I×-Ñ-Ó/ò 1‘��SØ—‘ #  c¨#¨Ð/Õ0ð1à�K‰K˜Ÿ	™	Ô"Ü�}‰}×-Ò-Ø—‘ °°¸RÐ@ÔA÷	Bô ×"Ò"Ø�K‰KØ×-Ñ-Ø!×%Ñ% oÓ6óôð �}‰}‹Ð÷#	Bð 	Bús   á Ceåe#c                ó¦  — t         j                  j                  j                  | «      } t	        | t
        j                  t        f«      rt        | «      }t        |«      }|S d}t         j                  j                  j                  | |«      sC|dkD  rt        d| › �«      ‚|dz  }t         j                  j                  j                  | |«      sŒC|S )NrW   i @  z!Failed to find static RBLOCK for r#   )rU   ra  rZ  Úsimplifyr•   r–   r˜   r  r9   r)  rw  )r„  r»  s     r‘   rô  z#TritonKernel._get_persistent_RBLOCK©  s°   € ä—‘×!Ñ!×*Ñ*¨6Ó2ˆÜ�fœuŸ}™}¬cÐ2Ô3Ü�f“+ˆCÜ! #Ó&ˆCð ˆ
ð ˆCÜ—g‘g×&Ñ&×;Ñ;¸FÀCÔHØ˜’?Ü$Ð'HÈÈÐ%QÓRÐRØ�q‘�ô —g‘g×&Ñ&×;Ñ;¸FÀCÕHð
 ˆJr“   c                ó  — | j                   r| j                  r| j                  ry | j                  D �cg c]2  }|j                  r$t        | j                  |j                  «      «      ‘Œ4 }}|rt        j                  |«      S d S c c}w r©   )
r5  rò  r+  rx  r  r4   rô  ró  rÛ  rˆ   )r%  r÷   Úrblockss      r‘   r  z1TritonKernel._get_native_matmul_persistent_rblockº  s   € à×%Ò%Ø×,Ò,Ø×)Ò)àð ×(Ñ(ö
àØ× Ò ô ,¨D×,GÑ,GÈÏ
É
Ó,SÕTð
ˆð 
ñ
 &-Œt�y‰y˜Ó!Ð6°$Ð6ùò
s   ´7Bc                óN   — 	 t         j                  | «       y# t        $ r Y yw xY w)NTF)r  rô  rw  )r„  s    r‘   Úhas_persistent_RBLOCKz"TritonKernel.has_persistent_RBLOCKÉ  s*   € ð	Ü×/Ñ/°Ô7ØøÜò 	Ùð	ús   ‚ ˜	$£$c                óª   — | j                  d«      r
d|d<   d|d<   t        j                  | j                  «      s|j	                  d«      rJ ‚d|d<   y y )Nr•  TÚoverride_persistent_reductionFÚoverride_cooperative_reduction)Úcontains_opr  rk  rT  rì   )Úkernel_featuresÚkernel_kwargss     r‘   Ú apply_feature_required_overridesz-TritonKernel.apply_feature_required_overridesÑ  sb   € ð ×&Ñ& vÔ.Ø=AˆMÐ9Ñ:Ø>CˆMÐ:Ñ;ä×1Ñ1°/×2QÑ2QÔRØ$×(Ñ(Ð)HÔIÐIÐIØ=BˆMÐ9Ò:ð Sr“   c                óö  — d
d„}| j                   D �]e  }|j                  r| j                  rdt        j                  j
                  j                  |j                  «      } ||«      r)|j                  |j                  › dt        |«      › �«       |j                  rª| j                  rž| j                  r1| j                  | j                  |j                  «      «      }d|› d�}n3| j                  |j                  «      }| j                   rt#        |d«      }|j                  |j                  j%                  «       › d|› �«       |j                  dk(  s�ŒG| j&                  s�ŒU|j                  d«       �Œh y	)aÑ  
        We get a small speedup from hard coding numels if they are static.

        This code stomps on the passed-in values by writing an constant to the top of the kernel.

        In a kernel like:
        def KERNEL_NAME(in_ptr0, in_ptr1, out_ptr2, xnumel, r0_numel, XBLOCK : tl.constexpr, R0_BLOCK : tl.constexpr):

        We would add
        xnumel = 4096
        r0_numel = 768

        After the signature, before the kernel code, if we decided to make these static. As its hardcoded, it becomes
        a better signal to triton on how to unroll and do some static indexing. So, it's not so much that downstream
        knows that its a static numel, as that you just plop a constant into the kernel.
        c                óB   — t        | t        j                  t        f«      S r©   )r•   r–   r˜   r  rœ   s    r‘   Úis_static_integerz=TritonKernel.codegen_static_numels.<locals>.is_static_integerñ  s   € Ü˜d¤U§]¡]´CÐ$8Ó9Ð9r“   znumel = z*triton_helpers.constexpr_next_power_of_2((z + RSPLIT - 1) // RSPLIT)rí  zBLOCK: tl.constexpr = r]  zXBLOCK: tl.constexpr = 1N)r�   rµ   r´   r£   )rx  r  rk  rU   ra  rZ  rg  ró  rV  rf  r  rò  r+  r  rì  rô  r5  r†   r  re  )r%  r  ru  r÷   Úsimplified_tree_numelró  r»  s          r‘   rS  z"TritonKernel.codegen_static_numelsß  s,  € ó$	:ð ×$Ñ$ó 	;ˆDØ×$Ò$¨×(=Ò(=Ü()¯©×(8Ñ(8×(AÑ(AÀ$Ç*Á*Ó(MÐ%Ù$Ð%:Ô;Ø—N‘N d§k¡k ]°(¼3Ð?TÓ;UÐ:VÐ#WÔXà× Ò  T×%>Ò%>Ø×-Ò-Ø ŸJ™J t×';Ñ';¸D¿J¹JÓ'GÓH�EØFÀuÀgÐMfÐg‘Cà×5Ñ5°d·j±jÓA�CØ×,Ò,ä! # r›l˜à—‘ $§+¡+×"3Ñ"3Ó"5Ð!6Ð6LÈSÈEÐRÔSà�{‰{˜cÔ! d§m¤mØ—‘Ð9Ö:ñ'	;r“   c                óJ  — t        | j                  D �cg c]  }t        |j                   «      ‘Œ c}«      }| j                  r|dk(  sJ ‚t
        j                  S | j                  r|dk(  sJ ‚t
        j                  S |dk(  rt
        j                  S |dk(  rIt        t        | j                  | j                  «      «      rt
        j                  S t
        j                  S |dk(  r,| j                  rt
        j                   S t
        j"                  S t%        d|› �«      ‚c c}w )NrW   r#   r   z"Unsupported number of dimensions: )r5  rx  r  r  r’  r/   ÚMixOrderReductionGridr+  ÚCooperativeReductionGridÚGrid1Dr…   r9  r’  ÚGrid2DWithYZOverflowÚGrid2Dr5  ÚBatchMatmulGrid3DÚGrid3Drw  )r%  r÷   r»  s      r‘   rP  zTritonKernel._get_grid_type	  sù   € Ü¸×8HÑ8HÖI°”˜×*Ñ*Ð*Õ+ÒIÓJˆØ×#Ò#Ø˜’6ˆM�6Ü$×:Ñ:Ð:Ø×'Ò'Ø˜’6ˆM�6Ü$×=Ñ=Ð=Ø�!ŠVÜ$×+Ñ+Ð+Ø�!ŠVÜ”3�t×2Ñ2°D×4DÑ4DÓEÔFÜ(×=Ñ=Ð=Ü$×+Ñ+Ð+Ø�!ŠVØ×$Ò$Ü(×:Ñ:Ð:Ü$×+Ñ+Ð+ÜÐ=¸a¸SÐAÓBÐBùò# Js   ”D c                ó„  — | j                   D ]±  }t        |j                  t        j                  t        j
                  f«      r|j                  }n*t        j                  j                  j                  ||«      }|j                  r| j                  sŒ‡|j                  |«       |j                  t        |«      «       Œ³ y r©   )rx  r•   ró  r–   r˜   r  rU   ra  Úwrapper_codeÚgenerate_numel_exprr  rk  rë  rM  )r%  rã   rÈ  Ú	arg_typesr÷   r�   s         r‘   r¯  z#TritonKernel.add_numel_to_call_args  sˆ   € à×$Ñ$ò 	-ˆDÜ˜$Ÿ*™*¤u§}¡}´e·l±lÐ&CÔDØ—z‘z‘ä—w‘w×+Ñ+×?Ñ?ÀÀdÓK�à×$Ò$¨×(=Ó(=Ø× Ñ  Ô&Ø× Ñ ¤ d£Õ,ñ	-r“   c                ó�  — t         j                  j                  }|j                  «        | j                  j                  «       \  }}}}| j                  |||«       | j                  j                  D ]  }|j                  |«       Œ |j                  ||d|| j                  | j                  ¬«       |r| j                  «        y y )NT)rÒ   r‚  r)  r  )rU   ra  r€  Úwrite_triton_header_oncer±   r¸  r¯  Úworkspace_argsÚgenerate_workspace_allocationÚgenerate_kernel_callr)  r  Údeallocate_workspaces)	r%  rã   r¥   Údeallocate_wsÚwrapperrY  rÈ  r‚  Úwss	            r‘   Úcall_kernelzTritonKernel.call_kernel)  s¼   € ô —'‘'×&Ñ&ˆØ×(Ñ(Ô*Ø%)§Y¡Y×%=Ñ%=Ó%?Ñ"ˆˆ9�a˜Ø×#Ñ# D¨)°YÔ?à—)‘)×*Ñ*ò 	6ˆBØ×1Ñ1°"Õ5ð	6ð 	×$Ñ$ØØØØØ×(Ñ(Ø×,Ñ,ð 	%ô 	
ñ Ø×&Ñ&Õ(ð r“   c                ó‚  — t         j                  j                  }| j                  j	                  «       \  }}}}t        ||«      D ]w  \  }}t        |t        «      sŒt         j                  j                  r|j                  d|› d|› d�«       ŒJd|› d�}|j                  |«       d|› d�}|j                  |«       Œy y )Nz:AOTI_TORCH_ERROR_CODE_CHECK(aoti_torch_check_inf_and_nan("z", z));zassert not z.isnan().any().item()z.isinf().any().item())
rU   ra  r€  r±   r¸  r·  r•   rf   Úcpp_wrapperrV  )r%  rŠ  rY  rÈ  Úarg_signaturesr«   Úarg_signaturerð  s           r‘   Úcodegen_nan_checkzTritonKernel.codegen_nan_check@  sÀ   € Ü—'‘'×&Ñ&ˆØ*.¯)©)×*BÑ*BÓ*DÑ'ˆˆ9�n aÜ"% i°Ó"@ò 
	,ÑˆC�Ü˜-¬Õ3Ü—7‘7×&Ò&Ø×%Ñ%ØTÐUXÐTYÐY\Ð]`Ð\aÐadÐeõð )¨¨Ð-BÐC�DØ×%Ñ% dÔ+Ø(¨¨Ð-BÐC�DØ×%Ñ% dÕ+ñ
	,r“   c                ó   — t        |i |¤ŽS r©   )rš  )r%  r±   r¢  s      r‘   r!  zTritonKernel.create_cse_varO  s   € Ü  $Ð1¨&Ñ1Ð1r“   c                óF  — |j                   › d| j                  | j                  |j                  «      «      › �}|j                  j
                  s| j                  r+|j                  dk(  r| j                  j                  |«       y | j                  j                  |«       y )NrO  r]  )rã   r  rì  r�   rí   rc  r’  rf  r‘  rV  rl  )r%  r?  rð  s      r‘   Úcodegen_iteration_ranges_entryz+TritonKernel.codegen_iteration_ranges_entryR  sy   € Ø—*‘*�˜S §¡¨D×,@Ñ,@ÀÇÁÓ,LÓ!MÐ NÐOˆð �:‰:×Ò $×":Ò":¸u¿|¹|ÈsÒ?RØ×Ñ×(Ñ(¨Õ.ð �I‰I×Ñ Õ%r“   c                ó†  — |j                   €J ‚| j                  |j                   «      }| j                  r$|j                   dk(  r| j                  «       dk(  rd}| j                  }|dk7  rd|› d�nd}| j
                  r| j                  r|j                  r|› d�}d| j                  |j                  «       «      › d|› |› �S )	Nr   r„  rÍ   ry  r  r²  z + rsplit_startztl.arange(0, )
rï   r8  r5  rî   rø  r+  rò  r  r  rû   )r%  r?  rð  rø  r  s        r‘   re  z)TritonKernel.iteration_ranges_ranges_code]  sÌ   € Ø×ÑÐ+Ð+Ð+Ø×%Ñ% e×&6Ñ&6Ó7ˆð ×!Ò!Ø× Ñ  AÒ%Ø×'Ñ'Ó)¨QÒ.àˆDØ×&Ñ&ˆØ*5¸Ò*C�4˜�} AÑ&Èˆà×&Ò&Ø×)Ò)Ø×"Ò"à�x˜Ð/ˆFØ˜tŸz™z¨%×*:Ñ*:Ó*<Ó=Ð>¸aÀ¸vÀfÀXÐNÐNr“   c                ó^   — | j                   }| j                  «       }dg|z  }d|› d|› d|› d�S )NrW   rÙ  r±  r²  )rø  rî   )r%  r?  r§  rø  rø   rð  s         r‘   Úiteration_ranges_scalar_codez)TritonKernel.iteration_ranges_scalar_coder  sC   € ð ×&Ñ&ˆØ×&Ñ&Ó(ˆØˆs�T‰zˆØ˜$˜˜r % ¨¨;¨-°qÐ9Ð9r“   c                ó”  — |j                   €J ‚d|j                   › d�}| j                  |«      r#d|› d|j                   dz   › d|j                   › d�}| j                  r,| j                  «       dk(  rd	dd
dœ}d||j                      › d�}|j                  j                  ||«      }| j                  dk7  r|› d| j                  › d�S |S )Nztl.program_id(r²  r9  z + tl.program_id(rW   z) * tl.num_programs(rý  r„  r#   r   )r   rW   r#   ry  r  )rX  r’  r5  rî   Ú	pid_cacherì   rø  )r%  r?  rº  Úreversed_pid_mapÚpids        r‘   Úiteration_ranges_get_pidz%TritonKernel.iteration_ranges_get_pidz  sê   € Ø�~‰~Ð)Ð)Ð)Ø˜uŸ~™~Ð.¨aÐ0ˆð ×&Ñ& uÔ-ð �c�UÐ+¨E¯N©N¸QÑ,>Ð+?Ð?SÐTY×TbÑTbÐScÐceÐfˆCð
 × Ò  T×%<Ñ%<Ó%>À!Ò%CØ#$¨¨qÑ1ÐØ"Ð#3°E·N±NÑ#CÐ"DÀAÐFˆCà�o‰o×!Ñ! # sÓ+ˆØ×Ñ˜zÒ)Ø�U˜$˜t×/Ñ/Ð0°Ð2Ð2Øˆ
r“   c                ó  — | j                   r| j                  ry|j                  dk(  xr[ |j                   xrL | j                   xr= t
        j                  j                  j                  |j                  t        «       «       S )NFrW   )r  r  rX  Úhas_zdimr+  rU   ra  rZ  r)  ró  r8   )r%  r?  s     r‘   r’  z#TritonKernel.needs_yz_grid_overflow‘  sw   € ð ×Ò D×$=Ò$=Øà�N‰N˜aÑò YØ—N‘NÐ"òYà×.Ñ.Ð.òYô —G‘G×$Ñ$×9Ñ9¸%¿+¹+Ä~ÓGWÓXÐXð		
r“   c                óˆ   — | j                   r | j                   |j                  «       › d�   S t        |j                  «          S )NrÚ   )rù  r  r6   )r%  rf  s     r‘   rø  zTritonKernel.max_block�  s;   € Ø×ÒØ×$Ñ$¨¯©«Ð'7°uÐ%=Ñ>Ð>Ü §¡£Ñ/Ð/r“   c                ó  — |j                  «       sy| j                  r5t        j                  j                  j                  |j                  d«      ry| j                  sy| j                  rW|j                  j                  «       › d�| j                  v r.| j                  |j                  j                  «       › d�   dk(  rZy| j                  sMt        j                  j                  j                  |j                  d«      r|j                  r| j                  sy|j                  rf| j                  rZ| j                  |j                  «      }t        j                  j!                  «       }t#        |«      }t%        |t&        «      r?||k  r:y|j                  dk(  r| j(                  rd}n| j+                  |j                  «      }|j                  r| j,                  r|| j/                  «       z  }t        j                  j                  j1                  |j                  |«      r[|j2                  dk7  xsJ |j4                  xs< t        j                  j                  j7                  |j                  t9        «       «      S y)NFrí  rÚ   rW   Tr]  )Úsupports_constant_maskr5  rU   ra  rZ  Ústatically_known_ltró  r  rù  rf  r  r  rb  r  rò  rô  r©  r3   r•   r  re  rø  r+  r  r”  rX  rž  r)  r8   )r%  r÷   rø  r¿  Ú	warp_sizes        r‘   r  zTritonKernel._has_constant_mask¢  sè  € Ø×*Ñ*Ô,Øà× Ò ô �w‰w×Ñ×3Ñ3°D·J±JÀÔCØà×!Ò!Øà×Ò D§K¡K×$5Ñ$5Ó$7Ð#8¸Ð!>À$×BSÑBSÑ!SØ× Ñ  D§K¡K×$5Ñ$5Ó$7Ð#8¸Ð!>Ñ?À1ÒDØØ×%Ò%Ü�w‰w×Ñ×7Ñ7¸¿
¹
ÀAÔFØ×)Ò)¨d×.GÒ.GØð ×Ò ×!:Ò!:Ø×3Ñ3°D·J±JÓ?ˆIô —W‘W×8Ñ8Ó:ˆFÜ% fÓ-ˆIÜ˜)¤SÔ)¨i¸)Ò.CØØ�[‰[˜CÒ D§M¢MØ‰IàŸ™ t§{¡{Ó3ˆIà×Ò ×!;Ò!;Ø! D§O¡OÓ$5Ñ5ˆIô �7‰7×Ñ×8Ñ8¸¿¹ÀYÔOà—‘ Ñ"ò WØ—=‘=òWä—7‘7×#Ñ#×8Ñ8¸¿¹Ä^ÓEUÓVðð r“   c                ód   — | j                   d   }|j                  dk(  sJ ‚| j                  |«      S )Nr   r]  )rx  rf  r  )r%  Úxtrees     r‘   r_  z TritonKernel._has_constant_xmaskà  s5   € Ø× Ñ  Ñ#ˆØ�|‰|˜sÒ"Ð"Ð"Ø×&Ñ& uÓ-Ð-r“   c                óª   — | j                   D ]3  }| j                  |«      sŒ|j                  |j                  «       «       Œ5 |j                  d«       y )NrÆ   )rx  r  r]  r  )r%  r  r÷   s      r‘   rŸ  zTritonKernel.filter_maskså  sJ   € Ø×$Ñ$ò 	4ˆDØ×&Ñ& tÕ,Ø×!Ñ! $§.¡.Ó"2Õ3ð	4ð 	×Ñ˜&Õ!r“   c                ó‚   — t        t        j                  «      d | j                   D �cg c]  }t        |   ‘Œ c}S c c}w r©   )rt  rÕ   r	  rj  r   )r%  r  s     r‘   Úget_reduction_prefixesz#TritonKernel.get_reduction_prefixesì  sB   € ô œ]×:Ñ:Ó;Ð<U¸d×>UÑ>UÐVö
àô �tÓò
ð 	
ùò 
s   ©<c                ó¸  — | j                   D �cg c]  }|j                  sŒ|‘Œ }}dj                  t        d„ |D «       «      «      }|j	                  d| j                  |«      › �«       | j                   D �cg c]#  }|j                  rt        j                  |«      ‘Œ% }}t        |«      }|j	                  d| j                  |«      › �«       yc c}w c c}w )z^
        Generates code that flattens ND reduction numels, block sizes, etc. into 1D.
        rv  c              3  ó:   K  — | ]  }|j                   › d �–— Œ y­w)ró  N)rf  r4  s     r‘   r­   z8TritonKernel.codegen_reduction_numels.<locals>.<genexpr>ù  s   è ø€ Ò"U¸T d§k¡k ]°%Ô#8Ñ"Uùs   ‚z	rnumel = zRBLOCK: tl.constexpr = N)	rx  r  r7  r8  r\  r  rÕ   rñ   rM   )r%  rñ  r÷   Úreduction_treesr„  Ú	rn_blocksrÜ  s          r‘   r*  z%TritonKernel.codegen_reduction_numelsó  sÉ   € ð
 -1×,<Ñ,<ÖR DÀ×@QÓ@Qš4ÐRˆÐRØ—‘œFÑ"UÀ_Ô"UÓUÓVˆØ�‰˜	 $§*¡*¨VÓ"4Ð!5Ð6Ô7ð
 ×(Ñ(ö
àØ× Ò ô ×(Ñ(¨Õ.ð
ˆ	ð 
ô
 ˜yÓ)ˆØ�‰Ð/°·
±
¸6Ó0BÐ/CÐDÕEùò Sùò

s   �C¡CÁ9(Cc                ó|   — | j                  «       }|D �cg c]  }t        j                  |› |› �fi |¤Ž‘Œ c}S c c}w )zK
        Helper to initialize symbols like rn_numel, rn_base, etc.
        )r¨  r–   r  )r%  r  r¢  Úrn_prefixesrf  s        r‘   rf  z#TritonKernel._get_reduction_symbols  s=   € ð ×1Ñ1Ó3ˆØJUÖVÀ”—‘ ˜x¨ xÐ0Ñ;°FÓ;ÒVÐVùÒVs   •!9c                óê   — | j                  «       }| j                  ddd¬«      }t        t        |«      dz
  «      D �cg c]  }t	        ||dz   d «      ‘Œ c}t        j                  d«      gz   S c c}w )z¸
        Compute coefficients to convert ND reduction indices to linear indices.
        For example:
          rindex = r0_index * r1_numel * ... * rn_numel + ... + rn_index.
        ró  TrÛ   rW   N)r¨  rf  rv  rš   rM   r–   r˜   )r%  r®  Ú	rn_numelsr˜  s       r‘   Ú_get_reduction_index_coeffsz(TritonKernel._get_reduction_index_coeffs  s{   € ð ×1Ñ1Ó3ˆØ×/Ñ/°ÀÐPTÐ/ÓUˆ	ä;@ÄÀ[ÓAQÐTUÑAUÓ;Vö
Ø47ŒM˜) C¨!¡G IÐ.Õ/ò
ä�]‰]˜1ÓÐñð 	ùò 
s   ¾A0c                ó:   — | j                  «       }t        ||«      S )zK
        Compute linear reduction indices from N dimensional ones.
        )r±  rL   )r%  Ú
multi_indsÚcoeffss      r‘   rg  z'TritonKernel._flatten_reduction_indices  s   € ð ×1Ñ1Ó3ˆÜ˜ Ó,Ð,r“   c                ó$  — | j                  ddd¬«      }| j                  ddd¬«      }| j                  |«      }|j                  d| j                  |«      › �«       | j                  |«      }|j                  d| j                  |«      › �«       y)zX
        Generates code that converts ND reduction indices into linear indices.
        rÖ   Tr×   r!  z
roffset = z	rindex = N)rf  rg  r\  r¹  )r%  rñ  Ú
rn_offsetsÚrn_indsrˆ  Úrindexs         r‘   rh  z&TritonKernel.codegen_reduction_indices   sš   € ð
 ×0Ñ0Ø˜d°ð 1ó 
ˆ
ð ×-Ñ-¨g¸tÐQUÐ-ÓVˆð ×1Ñ1°*Ó=ˆØ�‰˜
 4×#4Ñ#4°WÓ#=Ð">Ð?Ô@Ø×0Ñ0°Ó9ˆØ�‰˜	 $×"3Ñ"3°FÓ";Ð!<Ð=Õ>r“   c           	     óf  — |j                  «       �r| j                  r| j                  r|j                  rJ d«       ‚|j	                  «       D ]3  \  }}}|rdnd}|j                  |› |› d| j                  |«      › �«       Œ5 |j                  |j                  › d| j                  |j                  «       «      › d| j                  |«      › �«       |j                  |j                  «       › d|j                  › d| j                  |j                  «      › �«       y |j                  }|j                  r%|j                  |j                  › d|› d|› d�«       nâ|j                  €D|j                  |j                  › d| j                  |«      › �«       |j                  |› d	�«       n’|j                  �|› d| j                  |«      › �}n| j!                  ||› d
�«      }| j"                  s|j%                  «       › d�nd}	|j'                  |› d| j)                  |«      › d|	› �|j                  › d|› �g«       | j+                  |«      r!|j                  | j-                  |«      «       y |dk(  r| j"                  s3|j                  |j                  «       › d|j                  › d|› d�«       y y )Nz=derived reduction roots do not support cooperative reductionsz: tl.constexprrÍ   rO  rc  rŽ  z	offset + r5  z
offset = 0rÖ   rÚ   r  z	offset = rv  r]  ró  )Úhas_custom_codegen_headerr+  rò  r  Únamed_constantsrV  r¹  rã   rþ   re  r  ró  rf  rc  rX  rï   r—  r’  r  r“  rœ  r  r@  )
r%  r?  r  r}  r�   Ú	constexprÚ
annotationr]  rð  rû   s
             r‘   rd  z,TritonKernel.iteration_ranges_codegen_header0  s¦  € ð
 ×*Ñ*Õ,à×*Ò*Ø×-Ò-Ø×&Ò&ðOð Oó	Oð ð
 ).×(=Ñ(=Ó(?ò QÑ$��T˜9Ù1:Ñ-À�
Ø—‘ #  z l°#°d×6GÑ6GÈÓ6MÐ5NÐOÕPðQð �N‰NØ—:‘:�,˜c $×"3Ñ"3°E×4FÑ4FÓ4HÓ"IÐ!JÈ#Ø×4Ñ4°UÓ;Ð<ð>ôð �N‰NØ—?‘?Ó$Ð% S¨¯©¨°C¸×8IÑ8IÈ%Ï+É+Ó8VÐ7WÐXôð à�L‰LˆØ�=Š=Ø�N‰N˜eŸj™j˜\¨¨Q¨C¨y¸¸¸4Ð@ÕAØ�^‰^Ð#à�N‰N˜eŸj™j˜\¨¨T×-NÑ-NÈuÓ-UÐ,VÐWÔXØ�N‰N˜a˜S 
Ð+Õ,à×ÑÐ+Ø˜˜I d×&GÑ&GÈÓ&NÐ%OÐP‘à×8Ñ8¸À1À#ÀVÀÓM�ð ,0×+CÒ+C�1—7‘7“9�+˜UÑ#Èð ð �O‰Oà�c˜ 4×#@Ñ#@ÀÓ#GÐ"HÈÈJÈ<ÐXØ—z‘z�l # d VÐ,ðôð ×"Ñ" 5Ô)Ø�N‰N˜4×4Ñ4°UÓ;Õ<Ø�s’(˜t×7Ò7à�N‰N˜eŸo™oÓ/Ð0°°E·J±J°<¸sÀ1À#ÀUÐKÕLð  8r“   )r   TNNFF)r1  údict[str, sympy.Expr]rù  zFixedTritonConfig | Noner#  ú
int | Noner  r£   r  r£   r´   rÆ   )r´   r  )rÄ  r  r´   rð   )r´   rv  r<  )r?  rl   r´   rð   r;  r0  )r!  rµ   rs  zstr | tuple[str] | NonerK  zTMACompatibilityChecker | None)rÍ   )rã   rð   rô   rð   rL  z)BlockPtrOptions | TensorDescriptorOptionsr´   ztuple[str, str])r�   rµ   rð  rµ   rh  r£   r  r£   )r  rð   r´   r}   )r  zstr | TritonCSEVariabler´   r}   )rä   r}   r  z#OrderedSet[str | TritonCSEVariable]r´   r}   )r  r_   )rã   rð   ro  rq  )rã   rð   r!  rµ   r©   ©
rã   rð   r!  rµ   r§  r]   rV  rT   r´   rÆ   r„  )rc  úCSEVariable | None©NN)r¸  r]   ri  z.tuple[str, sympy.Expr, sympy.Expr, sympy.Expr]rj  r]   rk  r¤  r(  r£   rl  ztuple[str, sympy.Expr] | Nonerm  rÁ  r´   r]   )r´   ztuple[str, BlockShapeType])r§  r]   r·   r¤  r´   r]   )
r·   r¤  rË  r¤  rŽ   rS   r§  ú%CSEVariable | tuple[CSEVariable, ...]r´   rÃ  )r·   r¤  rÄ  )rã   rð   r!  rµ   r§  r]   )r§  r]   rä   rµ  r·   r¤  r´   r]   )r§  r]   rŽ   rð   r+  r  r·   r¤  rä   r1  r´   r]   )r§  r]   rÀ  rµ  rF  rµ  rI  rµ  r·   r¤  r/  r1  r´   r]   )r§  r]   rä   rµ  r´   rð   )r¸  útuple[CSEVariable, ...]rJ  útuple[torch.dtype, ...]r´   rð   )rJ  rÅ  rï  zUCallable[[tuple[CSEVariable, ...], tuple[CSEVariable, ...]], tuple[CSEVariable, ...]]r¸  rÄ  r´   rÄ  )
rJ  rÅ  r¸  rÄ  r…  r£   r†  r£   r´   rÄ  )rÆ  zfloat | Noner´   r_   )r´   rq  )r´   r¿  )rp  r~   rq  rq  r´   rÆ   )r´   z type[triton_heuristics.GridExpr]r.  )rã   rð   r¥   zIRNode | Noner‰  r£   )r´   rš  )r?  rk   )r?  rl   r§  r	   r´   rð   )r?  rl   r´   r£   )rf  rð   r´   r  )r÷   rl   r´   r£   )r  r  r´   rÆ   )rñ  r_   r´   rÆ   )r  rð   r´   zlist[sympy.Symbol]rÆ  )r³  r`  r´   rµ   )r?  rl   r  r_   r´   rÆ   )zr¾   rÇ   rÈ   rÉ   r%  r@  rÊ   rë  r  r·  rß  r4  r×  r  rÌ  r  r  r�  rî   r8  r6  r<  r@  r|  rK  r=  rN  rP  rS  r,  r.  r-  rl  rn  rp  rr  rL  rØ  rã  ræ  rß  rò  rî  rö  rø  rû  r  r  rþ  r  r  r#  rp  rW  r[  r_  rT  rf  ru  r{  r}  r�  r  r  rË  rµ  rÑ  rÌ  r  rÐ  r&  r)  r-  r2  r(  rM  r|  r•  rŠ  r¬  r´  rÑ  r×  rÚ  rË   r   rá  rç  r  r  rA  Úcached_propertyr  re  rô  r  rk  rr  rS  rP  r¯  rŒ  r‘  r!  r”  re  r—  rœ  r’  rø  r  r_  rŸ  rB   r¨  r*  rf  r±  rg  rh  rd  r¥  r¦  s   @r‘   r  r    s  ø… ñð &€IØ%Ó%Ø).€EÐ&Ó.Ø€OØ$;Ð!Ø3BÐÐ0ÓBàð "Ð#@ó ð HLÐ7¸ÓKð
 ØØ15Ø$(Ø %Ø%*ð59à%ð59ð
 /ð59ð "ð59ð ð59ð #ð59ð 
õ59ónRó'ó
ó8ó
ð ò:ó ð:ð6 ò
ó ð
ó
"ó
ò#òJò*:ò0ó
ò

ð ò"ó ð"ð /3ØØØØDHØ!ñ`
àð`
ð ,ð	`
ð $Bó`
ðN ðf'àðf'ð ðf'ð <ð	f'ð 
óf'óP1NòfUòXðMàðMð ðMð ð	Mð
 óMò4óó1ð
àðð 7ðð 
ó	ð" *€HØ8€Jàñ
ó ð
ð :?ô-ò<1ó  ð"
Øð
Ø:Hó
óKð\ SWð^Øð^Ø *ð^Ø3>ð^ØFOð^à	ó^ó@Iòó
ð& 15Ø-1ð9àð9ð Cð9ð &ð	9ð
 $ð9ð ð9ð .ð9ð +ð9ð 
ó9óv.ó
9ð
Ø(ð
Ø1<ð
à	ó
ð(s	àðs	ð ðs	ð &ð	s	ð
 5ðs	ð 
/ós	ðj&ØDOó&ó"
ò0F
òP#ò0&ò!ð
à	óðB>àð>ð ð>ð ó	>ð@
àð
ð 0ð
ð ð	
ð
 
ó
ð
àð
ð ð
ð ð	
ð
 ð
ð ð
ð 
ó
ð"
àð
ð >ð
ð :ð	
ð
 6ð
ð ð
ð !ð
ð 
ó
ð4 ðHØðHà/ðHð 
òHó ðHð>SØ1ð>SØ;Rð>Sà	ó>Sð@"à'ð"ð
ð"ð (ð"ð 
!ó"ðBD"à'ðD"ð (ðD"ð ð	D"ð
 ðD"ð 
!óD"óL$òq%ófó0wòr
ò
ð Ùˆtƒ_ò%"ó ó ð%"ðN ñ
ó ð
ð ñ0ó ð0ód/ðb ×Ñò1ó ð1ôfgðR ñó ðó 7ð ñó ðð ðCØ+ðCØ<JðCà	òCó ðCò(;óTCò(
-ð LPð)Øð)Ø,ð)ØDHó)ó.,ó2ó	&óOð*:Ø(ð:Ø14ð:à	ó:óó.

ó0ó
<ó|.ó
"ð ò
ó ð
óFó$Wð ò
ó ð
ó-ó?ð 1Mà"ð1Mð ð1Mð 
÷	1Mr“   r  c                  óf   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 dˆ fd„Zdd„Z	 d	 	 	 	 	 	 	 	 	 d	ˆ fd„Zd
d„Zˆ xZS )ÚFusedUserDefinedTritonKernelz‚
    When fusing a user-defined triton kernel with epilogues, we use this class to generate the modified triton kernel source
    c           	     ó^  •— t         ‰| �  ||ddd d d¬«       || _        t        | j                  j                  j
                  t        j                  «      sJ ‚| j                  j                  j
                  | _        | j                  j                  «       sJ ‚t        | j                  j                  j                  «      dk(  sJ ‚t        j                  | j                  j                  j                  d   j                  «      | _        | j                   j#                  dd«      | _        y )Nr   TF)rm  rÏ  r  rù  r#  r  rW   r·  rÍ   )rœ  r�  Úscheduler_noder•   Úkernel_noder¥   r%   ÚUserDefinedTritonKernelÚir_nodeÚcan_fuse_epiloguerš   Úkernel_storesrO  ÚastÚunparseÚstore_value_nodeÚoriginal_stored_exprrT  )r%  r1  rm  rÊ  rŸ  s       €r‘   r�  z%FusedUserDefinedTritonKernel.__init__i  s  ø€ ô 	‰ÑØØØ !ØØØØ!ð 	ô 	
ð -ˆÔÜØ×Ñ×+Ñ+×0Ñ0´"×2LÑ2Lô
ð 	
ð 
ð 48×3FÑ3F×3RÑ3R×3WÑ3WˆŒØ�|‰|×-Ñ-Ô/Ð/Ð/ô �4—<‘<×-Ñ-×4Ñ4Ó5¸Ò:Ð:Ð:Ü$'§K¡KØ�L‰L×&Ñ&×-Ñ-¨aÑ0×AÑAó%
ˆÔ!ð %)×$=Ñ$=×$EÑ$EÀdÈBÓ$OˆÕ!r“   c                óú  — t        | j                  j                  «      dk(  sJ ‚|| j                  j                  d   j                  «       k(  rŸ| j                  }| j                  |«      }t        j                  j                  |«      }|j                  r|j                  }nt        j                  |j                  «      }| j                  j                  | j                  |||¬«      }|S t!        d|› d�«      ‚)NrW   r   r"  z!Epilogue attempted to load from 'zE'. Inductor indexing variables are not defined in user kernel scope. )rš   rÍ  Úmutable_argsÚget_namerÓ  rL  rU   ra  rÜ  r"  rÕ   rù   r!  rá   r&  rô  rs  )r%  rã   r!  Úloaded_exprrL  r·   rä   r  s           r‘   rW  z!FusedUserDefinedTritonKernel.load†  sæ   € ä�4—<‘<×,Ñ,Ó-°Ò2Ð2Ð2Ø�4—<‘<×,Ñ,¨QÑ/×8Ñ8Ó:Ò:ð ×3Ñ3ˆKØ—}‘} UÓ+ˆHÜ—G‘G×%Ñ% dÓ+ˆEØ×$Ò$Ø ×-Ñ-‘ä%×5Ñ5°h·n±nÓE�ØŸ™×*Ñ*Ø—
‘
˜K¨u¸Eð +ó ˆJð Ðô !Ø3°D°6ð :Uð Uóð r“   c                ó4  •— t        | j                  j                  j                  t        j
                  «      sJ ‚|| j                  j                  j                  j                  «       k(  rš| j                  j                  j                  j                  }t        |t        j                  «      sJ ‚|j                  }| j                  j                  | j                  |› dt        |«      › d�||j                  ¬«      | _        y t         ‰| �E  ||||«       y )Nr  r²  r"  )r•   rÊ  Úfused_epiloguer¥   r%   ÚComputedBufferrÖ  ÚlayoutÚLayoutr·   rá   r&  r'  r‚  rä   Únew_store_cse_varrœ  r[  )r%  rã   r!  r§  rV  rÛ  rá  rŸ  s          €r‘   r[  z"FusedUserDefinedTritonKernel.storež  sä   ø€ ô ˜$×-Ñ-×<Ñ<×AÑAÄ2×CTÑCTÔUÐUÐUØ�4×&Ñ&×5Ñ5×:Ñ:×CÑCÓEÒEð ×(Ñ(×7Ñ7×<Ñ<×CÑCˆFÜ˜f¤b§i¡iÔ0Ð0Ð0Ø Ÿ,™,ˆKØ%)§X¡X×%6Ñ%6Ø—‘Ø�'˜Ô/°Ó<Ð=¸QÐ?Ø!Ø—k‘kð	 &7ó &ˆDÕ"ô ‰G‰M˜$  u¨dÕ3r“   c                ó$  — | 5  | j                  | j                  j                  j                  «       «      }| j                  j                  j	                  |«       d d d «       t        j                  | j                  j                  «      }ddl	m
}m}  ||«      }t        |j                  «      dk(  sJ ‚t        j                  | j                   j"                  «      }	 	 	 	 	 	 dd„} ||j                  d   j$                  dd|«       t        j&                  |«      }|j)                  «       }	 ||«      }|j                  d   j$                  j*                  dz
  }
d|j                  d   j$                  j,                  z  }| j.                  j1                  «       D �cg c]  }||z   ‘Œ	 }}| j2                  j1                  «       D �cg c]  }||z   ‘Œ	 }}|	d |
 |z   |z   |	|
d  z   }dj5                  |«      S # 1 sw Y   �Œ¡xY wc c}w c c}w )	Nr   )Úidentify_triton_storesÚidentify_triton_stores_from_astrW   c                ó¢   — t        | j                  «      |kD  r|| j                  |<   | j                  D ]  }|j                  |k(  sŒ||_        Œ y r©   )rš   r±   Úkeywordsr«   r§  )Ú	call_noderË  Úpositional_indexÚnew_argÚkeywords        r‘   Ú_replace_argz:FusedUserDefinedTritonKernel.codegen.<locals>._replace_argÆ  sO   € ô �9—>‘>Ó"Ð%5Ò5Ø3:�	—‘Ð/Ñ0ð %×-Ñ-ò ,�Ø—;‘; (Ó*Ø$+�G•Mñ,r“   r§  rL  r·  )rã  zast.CallrË  rð   rä  r  )Úsplit_and_set_rangesrÊ  rÙ  Ú
get_rangesÚcodegenr¹  ÚdeepcopyrÍ  Ú
kernel_astÚ*torch._higher_order_ops.triton_kernel_wraprß  rà  rš   rO  rÐ  ÚNamerÝ  rã   Ú
store_noderÑ  Ú
splitlinesÚlinenoÚ
col_offsetrô  Úget_lines_refr'  r7  )r%  r¼  Únew_astrß  rà  rÏ  Únew_store_value_noderç  Úsrc_with_store_replacedÚ	src_linesÚstore_line_indexÚindentationsr"  Ú
load_linesÚcompute_linesÚnew_src_liness                   r‘   rê  z$FusedUserDefinedTritonKernel.codegen²  s  € Øñ 	CØ×2Ñ2Ø×#Ñ#×2Ñ2×=Ñ=Ó?óˆJð ×Ñ×.Ñ.×6Ñ6°zÔB÷		Cô —-‘- §¡× 7Ñ 7Ó8ˆ÷	
ñ 8¸Ó@ˆÜ�=×'Ñ'Ó(¨AÒ-Ð-Ð-ä"Ÿx™x¨×(>Ñ(>×(CÑ(CÓDÐð	,Øð	,àð	,ð "ó	,ñ 	Ø× Ñ  Ñ#×.Ñ.°¸Ð<Pô	
ô #&§+¡+¨gÓ"6Ðð ,×6Ñ6Ó8ˆ	ñ /Ð/FÓGˆà(×/Ñ/°Ñ2×=Ñ=×DÑDÀqÑHÐà˜]×1Ñ1°!Ñ4×?Ñ?×JÑJÑJˆà04·
±
×0HÑ0HÓ0JÖK¨1�l QÓ&ÐKˆ
ÐKØ37·<±<×3MÑ3MÓ3OÖP¨a˜¨Ó)ÐPˆÐPð Ð'Ð'Ð(Øñàñð Ð(Ð)Ð*ñ+ð 	ð �y‰y˜Ó'Ð'÷w	Cñ 	Cüòd LùÚPs   ƒAG;Æ!HÇHÇ;H)r1  r¾  rm  r~   rÊ  r;   r´   rÆ   )rã   rð   r!  rµ   r´   rš  r©   rÀ  r<  )	r¾   rÇ   rÈ   rÉ   r�  rW  r[  rê  r¥  r¦  s   @r‘   rÈ  rÈ  d  sv   ø„ ñðPà%ðPð %ðPð =ð	Pð
 
õPó:ð2 SWð4Øð4Ø *ð4Ø3>ð4ØFOð4à	õ4÷(<(r“   rÈ  c            
      ól  ‡ — e Zd ZU dZeZded<    eej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                   g«      Zdˆ fd„Zedd„«       Zdd„Zd„ Zd„ Zddd	„Z	 d	 	 	 dd
„Z	 	 	 	 	 	 	 	 dd„Z	 	 	 	 	 	 	 	 dd„Zd„ Zˆ xZS )ÚTritonSchedulingz5Scheduling backend for Triton kernel code generation.z	type[Any]Úkernel_typec                ó¨   •— t         ‰| �  |«       |�t        |d«      sy |j                  D ]$  }t	        |t
        t        f«      sŒt        |_        Œ& y )Nr^  )	rœ  r�  rÐ   r^  r•   r>   r<   Údebug_triton_codeÚdebug_device_str)r%  r  r¥   rŸ  s      €r‘   r�  zTritonScheduling.__init__  sM   ø€ Ü‰Ñ˜Ô#ØÐ¤G¨I°wÔ$?ØØ—O‘Oò 	:ˆDÜ˜$¤Ô0BÐ CÕDÜ(9�Õ%ñ	:r“   c                óÐ   — t         j                  j                  st         j                  j                  r't	        g | j
                  ¢t        j                  ‘«      S | j
                  S r©   )r$   rÒ   Úcooperative_reductionsÚforce_cooperative_reductionsr   Úbackend_featuresrZ   ÚREDUCE_TO_SINGLE_ELEMENT)rÂ   r¿  s     r‘   Úget_backend_featuresz%TritonScheduling.get_backend_features
  sR   € ô �M‰M×0Ò0Ü�}‰}×9Ò9äØP�#×&Ñ&ÐP¬×(OÑ(OÐPóð ð ×#Ñ#Ð#r“   c                óÒ  ‡
— t         j                  j                  }t        ||«      \  }}|r|j	                  |«       t
        j                  rtddlm}m	Š
 t        ˆ
fd„|D «       «      sX|D �cg c]  }t        ||«      r|j                  «       ‘Œ  }}|j	                  |j                  › ddj                  |«      › �«       |rt        ||«      }	|j!                  ||	«       y y c c}w )Nr   )r:   ÚForeachKernelSchedulerNodec              3  ó6   •K  — | ]  }t        |‰«      –— Œ y ­wr©   )r•   )rª   r»  r
	  s     €r‘   r­   z3TritonScheduling.codegen_comment.<locals>.<genexpr>!  s   øè ø€ ò Ø>?”
˜1Ð8×9ñùs   ƒz Fused node name list: r±  )rU   ra  r€  rG   Úmake_commentr$   Údebug_fusionÚtorch._inductor.schedulerr:   r
	  r…   r•   rÖ  Úcommentr7  r-   Úwrite_provenance_debug_handle)r%  Únode_scheduler?  rŠ  ÚoriginsÚ_detailed_originsr:   r»  Ú
node_namesÚdebug_handler
	  s             @r‘   Úcodegen_commentz TritonScheduling.codegen_comment  sé   ø€ Ü—'‘'×&Ñ&ˆÜ%8¸ÈÓ%PÑ"ˆÐ"ÙØ× Ñ  Ô)ä×Ò÷ô
 ó ØCPôô ð +öàÜ! !Ð%6Ô7ð —J‘J•Lð�
ð ð
 ×$Ñ$Ø—‘Ð'Ð'>¸t¿y¹yÈÓ?TÐ>UÐVôñ ÜBØØóˆLð ×1Ñ1°+¸|ÕLð ùòs   Á.#C$c	                óä  — |j                  ||||||«      ryt        «       }	t        j                  «       rt        j	                  ||«       |	j                  d|›d�«       |	j                  |d¬«       t        j                  j                  «       }
|	j                  d|
j                  › d�«       d|› �} |||«      \  }}|d	|z   d	z   |z   z  }|j                  ||	j                  «       |«       y)
zDEmit kernel to wrapper, with support for external template handlers.Nzasync_compile.triton(z, '''Tr  z''', device_str='z')z# kernel path: r·  )Úemit_kernel_overrider_   Úasync_compileÚuse_process_poolrÒ   rV  r\  rU   ra  r©  rM  Údefine_kernelrI  )r%  rŠ  rà   Úsrc_coder?  Ú	subs_namer	  Úkernel_pathrG   Úcompile_wrapperr  Úmetadata_commentr	  Údetailed_originss                 r‘   Ú_emit_kernel_to_wrapperz(TritonScheduling._emit_kernel_to_wrapper6  s   € ð ×&Ñ&ØØØØØØô
ð ä(Ó*ˆä×)Ñ)Ô+ô × Ñ  ¨HÔ5à×!Ñ!Ð$9¸)¸ÀeÐ"LÔMà×Ñ˜x¨tÐÔ4ÜŸ™×<Ñ<Ó>ˆØ×!Ñ!Ð$5°n×6IÑ6IÐ5JÈ"Ð"MÔNà,¨[¨MÐ:ÐÙ$7¸ÀwÓ$OÑ!ˆÐ!Ø˜D 7™N¨TÑ1Ð4DÑDÑDÐØ×Ñ˜k¨?×+CÑ+CÓ+EÐGWÕXr“   c           
     ó  — t         j                  j                  }||j                  v r|j                  |   }|S t        j
                  j                  r$t        |t        j
                  j                  «      nd}|r t         j                  j                  ||«      }t        |«      d d }dj                  d|||j                  «       g«      }t        j                  j                  rt        j                  j                  › d|› �}||j                  |<   t        j
                  j                  r|nd}|j!                  t#        t$        j&                  «      |«      }|j!                  t#        t$        j(                  «      |«      }|j!                  dd«      }t+        t-        |j/                  «       «      d«      \  }	}
}| j1                  |||||||t2        «       t5        j6                  d	«      rt5        j8                  |||«       |S )
NrÍ   r   rY  rÒ   Útriton_z#pragma CMTú#ÚpyÚkernel_metadata)rU   ra  r€  Úsrc_to_kernelr$   rÒ   Údescriptive_namesrF   rR  Úcustomize_fused_kernel_namerV   r7  Únext_kernel_suffixÚaot_inductorÚmodel_name_for_generated_filesÚunique_kernel_namesrT  rð   rI   rQ  rÅ  r*   r)   rQ  r"	  rG   r&   Úis_metric_table_enabledÚlog_kernel_metadata)r%  r	  r	  rà   rŠ  r?  Ú
fused_nameÚkernel_categoryr	  Ú	_basenamerY  r	  s               r‘   r	  zTritonScheduling.define_kernel`  sË  € Ü—'‘'×&Ñ&ˆØ�w×,Ñ,Ñ,Ø!×/Ñ/°Ñ9ˆKðf Ðô_ —=‘=×2Ò2ô & m´V·]±]×5TÑ5TÔUàð ñ
 ÜŸY™Y×BÑBÀ:ÈxÓX�
Ü@ÀÓJÈ2ÈAÐNˆOØŸ(™(Ø˜?¨J¸×8RÑ8RÓ8TÐUóˆKô ×"Ñ"×AÒAô "(×!4Ñ!4×!SÑ!SÐ TÐTUÐVaÐUbÐc�ð /:ˆG×!Ñ! (Ñ+Ü'-§}¡}×'HÒ'H™ÈiˆIð
  ×'Ñ'¬¬K×,HÑ,HÓ(IÈ;ÓWˆHØ×'Ñ'¬¬K×,CÑ,CÓ(DÀiÓPˆHð  ×'Ñ'¨°sÓ;ˆHä(0´¸8¿>¹>Ó;KÓ1LÈdÓ(SÑ%ˆI�q˜+à×(Ñ(ØØØØØØØÜ#ô	ô ×.Ñ.Ð/@ÔAÜ×+Ñ+¨K¸ÀhÔOàÐr“   c                óš   — | j                  |d¬«      }t        j                  |«      }| j                  ||t	        d„ |D «       «      ¬«      S )zƒ
        Benchmark fused list of nodes and return the execution time
        in milliseconds on randomly generated inputs.
        T)r  c              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr©   ©rÖ  ©rª   r»  s     r‘   r­   z9TritonScheduling.benchmark_fused_nodes.<locals>.<genexpr>   s   è ø€ Ò:WÈA¸1¿:¹:¿<Ñ:Wùr›  )r	  )Úgenerate_kernel_code_from_nodesr+   rW  Úbenchmark_codegened_moduler   )r%  r^  Ún_spills_thresholdr	  rû  s        r‘   Úbenchmark_fused_nodesz&TritonScheduling.benchmark_fused_nodes˜  sV   € ð
 ×7Ñ7¸ÐPTÐ7ÓUˆÜ×Ñ˜xÓ(ˆØ×.Ñ.ØÐ#´
Ñ:WÐQVÔ:WÓ0Wð /ó 
ð 	
r“   c           	     ó8  ‡‡
‡‡‡‡— t        t        j                  j                  «      }t	        «       5  |j                  t        j                  j                  «       «      5  dŠˆfd„Šˆˆfd„}ˆfd„}|�|nt        dg«      }t        j                  d|‰j                  «        |«       Š‰� ‰‰j                  fcddd«       cddd«       S ‰j                  «       Š
‰j                  Š‰j                  Š	  ‰ ‰j                  ‰
Ž d   «       ‰j(                  }t+        |«      d
k(  sJ ‚|d   j,                  |kD  rt'        d	«      Šnyt        j                  j                  «       }	t/        j0                  ˆ
ˆˆfd„|	¬«      Št+        ‰j2                  «      dkD  r'‰t/        j0                  ˆ
ˆfd„t5        |	«      ¬«      z
  Št        j                  d|‰«        |«        ‰‰j                  fcddd«       cddd«       S # t        $ rn}t         j"                  j$                  r‚ t        j                  d||«       t'        d	«      Š |«        ‰‰j                  fcY d}~cddd«       cddd«       S d}~ww xY w# 1 sw Y   nxY wddd«       y# 1 sw Y   yxY w)z$Benchmark an already compiled moduleNc                 ó~   •— ‰ j                   €J ‚t        j                  j                  ‰ j                   «      d   dz   S ©Nr   z.kernel_perf©Ú__file__ÚosÚpathÚsplitext©rû  s   €r‘   Úcache_file_pathzDTritonScheduling.benchmark_codegened_module.<locals>.cache_file_path®  s6   ø€ Ø—|‘|Ð/Ð/Ð/Ü—w‘w×'Ñ'¨¯©Ó5°aÑ8¸>ÑIÐIr“   c                 ó>   •—  ‰«       } t        | t        ‰«      «       y r©   ©r,   rð   )rB	  rE	  Úmss    €€r‘   Ústore_cachez@TritonScheduling.benchmark_codegened_module.<locals>.store_cache²  s   ø€ Ù&Ó(�Ü˜T¤3 r£7Õ+r“   c                 óÆ   •—  ‰«       } t         j                  j                  | «      r.t        | «      5 }t	        |j                  «       «      cd d d «       S y # 1 sw Y   y xY wr©   )rA	  rB	  ÚexistsÚopenr<  Úread©rB	  ÚfdrE	  s     €r‘   Ú
load_cachez?TritonScheduling.benchmark_codegened_module.<locals>.load_cache¶  sM   ø€ Ù&Ó(�Ü—7‘7—>‘> $Ô'Ü˜d›ð 0 rÜ$ R§W¡W£YÓ/÷0ñ 0à÷0àús   ³AÁA r  ú%kernel src code for %s written to: %sr   z*Exception (%s) in compiling fused nodes %sr—  rW   c                 ó4   •—  ‰ ‰j                   ‰ Ž d   «      S rŒ  ©Ú
clone_args©r±   ÚcallÚwrapped_jit_functions   €€€r‘   rˆ  z=TritonScheduling.benchmark_codegened_module.<locals>.<lambda>ç  ó    ø€ ™DÐ!@Ð!5×!@Ñ!@À$Ð!GÈÑ!JÓK€ r“   ©r¿  c                 ó"   •—  ‰j                   ‰ Ž S r©   rS	  ©r±   rW	  s   €€r‘   rˆ  z=TritonScheduling.benchmark_codegened_module.<locals>.<lambda>ð  s   ø€ Ð ?Ð 4× ?Ñ ?ÀÐ F€ r“   z+The fused kernel for %s took %.3f ms to run)r   rU   ra  rX  r   r¿  r©  r   r  rê  r@	  Úget_argsrV	  r$	  rT	  Ú	Exceptionr$   rÒ   Ú.disallow_failing_autotune_kernels_TESTING_ONLYr<  Ú	launchersrš   Ún_spillsr0   Ú	benchmarkr@  rð   )r%  rû  r:	  r	  Údevice_interfacerI	  rP	  r2  r_	  r¿  r±   rE	  rV	  rH	  rW	  s    `        @@@@@r‘   r9	  z+TritonScheduling.benchmark_codegened_module£  sf  ý€ ô 4´A·G±G×4GÑ4GÓHÐäÓ ñR	$à×#Ñ#¤A§G¡G×$GÑ$GÓ$IÓJñR	$ð ˆBôJõ,ôð )Ð4‘
¼*ÀiÀ[Ó:Qð ô �I‰IØ7ØØ—‘ôñ
 “ˆBØˆ~Ø˜3Ÿ<™<Ð'÷?R	$÷ R	$ò R	$ðB —<‘<“>ˆDØ—8‘8ˆDØ#&§;¡;Ð ð(ÙÐ4Ð)×4Ñ4°dÐ;¸AÑ>Ô?ð -×6Ñ6ˆIÜ�y“> QÒ&Ð&Ð&ð ˜‰|×$Ñ$Ð'9Ò9ä˜5“\‘äŸ™×<Ñ<Ó>�ô !×*Ñ*ÝKØ!ô�ô Ð+×=Ñ=Ó>ÀÒBØœk×3Ñ3ÜFÜ" 6›{ôñ �Bô
 �I‰IØ=ØØôñ
 ŒMØ�s—|‘|Ð#÷eR	$÷ R	$ò R	$øôN ò 
(Ü—=‘=×OÒOØÜ—	‘	Ø@ØØôô
 ˜5“\�Ù”Ø˜3Ÿ<™<Ð'Ô'÷cR	$÷ R	$ò R	$ûðN
(ú÷OR	$ð R	$ú÷ R	$÷ R	$ñ R	$úsh   ´.JÁ"AI;Â<	JÃ(I;Ã8HÄCI;Ç.	JÈ	I8È
AI3ÉI8ÉI;É 	JÉ3I8É8I;É;J	Ê JÊJc                óD  — |j                  d«      }|xr  t        d„ |j                  «       D «       «      }| j                  }|rddlm} |}|rd|d<   |j                  ||«       t        j                  j                  ||||«      } ||i |¤Ž}| j                  |||«      S )Nr|  c              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr©   )Úis_split_scan)rª   r¥   s     r‘   r­   z9TritonScheduling.create_kernel_choices.<locals>.<genexpr>  s   è ø€ ò (
Ø%)ˆD×Ñ× ñ(
ùr›  rW   )ÚTritonSplitScanKernelFrn  )ro  r…   Úscheduler_nodesrÿ  Útriton_split_scanrf	  rr  rU   rR  Útriton_kernel_kwargsÚadd_multi_kernel_choices)	r%  rp  Úkernel_argsrq  Úis_scanre	  rÿ  rf	  rà   s	            r‘   Úcreate_kernel_choicesz&TritonScheduling.create_kernel_choicesü  s´   € ð "×-Ñ-¨fÓ5ˆØò 
¤Cñ (
Ø-<×-LÑ-LÓ-Nô(
ó %
ˆð +/×*:Ñ*:ˆÙÝ@à/ˆKáà>CˆMÐ:Ñ;à×4Ñ4°_ÀmÔTäŸ	™	×6Ñ6Ø˜¨+°}ó
ˆñ ˜kÐ;¨]Ñ;ˆØ×,Ñ,¨V°[À-ÓPÐPr“   c           	     óÄ  — |g}t         j                  j                  s|S |j                  xr |j	                  d«       }|j
                  xr |j	                  d«       }|r%|j                   | j                  |i |¤ddi¤Ž«       |r›|j                  j                  }t        j                  j                  j                  |d«      r[|j                   | j                  |i |¤ddi¤Žx}«       |r2|j                  r&|j                   | j                  |i |¤dddœ¤Ž«       t        |«      dkD  r.|dd  D ]  }	|j                  |	_        Œ |j!                  d„ ¬«       |S )	Nrm  rn  Fi   )rn  rm  rW   c                ó   — | j                   S r©   )rò  )r  s    r‘   rˆ  z;TritonScheduling.add_multi_kernel_choices.<locals>.<lambda>J  s   €  q×'=Ñ'=€ r“   rx  )r$   rÒ   Úmulti_kernelrò  rì   r+  rë  rÿ  rm  rT  rU   ra  rZ  r)  rš   Úmust_keep_buffersr•  )
r%  rà   rk	  rq  ÚkernelsÚoptional_persistentÚoptional_cooperativer„  rm  Úkernel2s
             r‘   rj	  z)TritonScheduling.add_multi_kernel_choices  s•  € ð (. hˆÜ�}‰}×)Ò)ØˆNà$×9Ñ9ò 
À-×BSÑBSØ+óC
ð ?
Ðð  &×;Ñ;ò  
ÀM×DUÑDUØ,óE
ð A
Ðñ Ø�N‰NØ �× Ñ Ø ðà#ñð 38òôñ  Ø—_‘_×4Ñ4ˆFä�w‰w×Ñ×4Ñ4°V¸UÔCØ—‘Ø-˜T×-Ñ-Ø$ðà'ñð 8=òð �Eôñ '¨5×+EÒ+EØ—N‘NØ(˜×(Ñ(Ø(ðà+ðð <AØ:?ó	ôô ˆw‹<˜!ÒØ" 1 2˜;ò E�à,2×,DÑ,D�Õ)ðEð �L‰LÑ=ˆLÔ>Øˆr“   c                óô  ‡‡‡‡‡‡‡ — ˆfd„Šˆfd„}ˆˆˆfd„}dg }}d}t         j                  j                  }t        |«      t         j                  _        t         j                  j                  }	t        |	«      t         j                  _        t
        j                  dkD  }
t
        j                  dkD  }t
        j                  }| j                  |d|
|d|¬«      }|D �]^  \  }}}|D �cg c]  }|j                  «       ‘Œ }}|D ��cg c]  }|D ]  }|j                  «       ‘Œ Œ }}}t        |«      dk(  r'||d      \  }}||z  }|dz  }|j                  |«       Œ€|€J ‚|j                  t        t         j"                  «      d
«      }t%        j&                  |«      Št(        j+                  d|‰j,                  «        |«       \  ŠŠ‰�'|‰z  }|‰z  }|j                  ‰j,                  «       �Œ‰j/                  «       Š‰j0                  Š‰j2                  Š  ‰ ‰ j4                  ‰Ž d   «       ‰ j6                  }t        |«      dk(  sJ ‚|d   j8                  dkD  rt;        d«      xŠŠnUt         j                  j=                  «       }t?        j@                  ˆˆˆ fd„|¬«      Št?        j@                  ˆˆ fd„|¬«      Št(        j+                  dt        d„ |D «       «      ‰‰«        |«        |‰z  }|‰z  }|j                  ‰j,                  «       d	xŠxŠŠ tB        jD                  jG                  «        �Œa |t         j                  _        |	t         j                  _        |||fS c c}w c c}}w )a[  
        Benchmark combo kernel partitions and return total execution time.

        Generates kernel code for each partition and benchmarks them.
        Single-node partitions use benchmark_fused_nodes(), while multi-node
        partitions use the combo kernel benchmarking path.

        Returns (total_ms, total_clone_ms, file_list).
        c                 ó~   •— ‰ j                   €J ‚t        j                  j                  ‰ j                   «      d   dz   S r>	  r?	  rD	  s   €r‘   rE	  z@TritonScheduling.benchmark_combo_kernel.<locals>.cache_file_path[  s6   ø€ Ø—<‘<Ð+Ð+Ð+Ü—7‘7×#Ñ# C§L¡LÓ1°!Ñ4°~ÑEÐEr“   c                 óð   •—  ‰«       } t         j                  j                  | «      rCt        | «      5 }t	        d„ |j                  «       j                  «       D «       «      cd d d «       S y# 1 sw Y   yxY w)Nc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr©   )r<  )rª   r2  s     r‘   r­   zNTritonScheduling.benchmark_combo_kernel.<locals>.load_cache.<locals>.<genexpr>c  s   è ø€ Ò E¨a¤ q§Ñ Eùr´  rÂ  )rA	  rB	  rK	  rL	  r²   rM	  rP  rN	  s     €r‘   rP	  z;TritonScheduling.benchmark_combo_kernel.<locals>.load_cache_  s^   ø€ Ù"Ó$ˆDÜ�w‰w�~‰~˜dÔ#Ü˜$“Zð F 2Ü Ñ E°2·7±7³9·?±?Ó3DÔ EÓE÷Fñ Fà÷Fàús   ³.A,Á,A5c                 ó\   •—  ‰«       } t        | t        ‰«      dz   t        ‰«      z   «       y )NrL  rG	  )rB	  rE	  rH	  Úms_clones    €€€r‘   rI	  z<TritonScheduling.benchmark_combo_kernel.<locals>.store_cachef  s&   ø€ Ù"Ó$ˆDÜ˜œs 2›w¨™}¬s°8«}Ñ<Õ=r“   r   g        T)Úsubkernel_nodesÚcustom_part_algorithmÚenable_autotuneÚmixed_sizesÚonly_gen_src_coder  rW   Nr$	  rQ	  r—  c                 ó4   •—  ‰ ‰j                   ‰ Ž d   «      S rŒ  rS	  rU	  s   €€€r‘   rˆ  z9TritonScheduling.benchmark_combo_kernel.<locals>.<lambda>«  rX	  r“   rY	  c                 ó(   •—  ‰j                   ‰ Ž d   S rŒ  rS	  r[	  s   €€r‘   rˆ  z9TritonScheduling.benchmark_combo_kernel.<locals>.<lambda>¯  s   ø€ Ð;Ð0×;Ñ;¸TÐBÀ1ÑE€ r“   zDThe fused kernel for %s took %.3f ms to run, %.3f ms to clone inputsc              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr©   r6	  r7	  s     r‘   r­   z:TritonScheduling.benchmark_combo_kernel.<locals>.<genexpr>µ  s   è ø€ Ò<¨A˜1Ÿ:™:Ÿ<Ñ<ùr›  )$rU   ra  rI  r   Úinplaced_to_remover$   Úcombo_kernels_autotuneÚcombo_kernel_allow_mixed_sizesÚ!combo_kernel_per_subkernel_blocksÚgenerate_combo_kernel_codeÚ	get_nodesrÖ  rš   rë  rT  rð   rI   rÅ  r+   rW  r  rê  r@	  r\	  rV	  r$	  rT	  r_	  r`	  r<  r©  r0   ra	  r¿   ÚacceleratorÚempty_cache)!r%  Ú	node_listÚnode_benchmark_resultsrP	  rI	  Útotal_msÚ	file_listÚtotal_clone_msÚremoved_buffers_origÚinplaced_to_remove_origr~	  r	  r  Úkernel_code_listr	  rà   Ú
node_groupr¥   Úfused_node_listsr^  r»  ÚnamesÚnode_msrB	  r_	  r¿  r±   rE	  rV	  rû  rH	  r{	  rW	  s!                             @@@@@@@r‘   r  z'TritonScheduling.benchmark_combo_kernelM  sE  þ€ ô	Fô	 ö	>ð   �)ˆØ #ˆÜ Ÿw™w×6Ñ6ÐÜ",Ð-AÓ"BŒ�‰ÔÜ"#§'¡'×"<Ñ"<ÐÜ%/Ð0GÓ%HŒ�‰Ô"Ü ×7Ñ7¸!Ñ;ˆÜ×;Ñ;¸aÑ?ˆÜ%×GÑGÐØ×:Ñ:Ø%Ø"&Ø+Ø#Ø"Ø!5ð ;ó 
Ðð -=ó A	,Ñ(ˆH�f˜jØ=GÖH°T §¡Õ 0ÐHÐÐHØ/?×O eÈÒOÀA�Q—Z‘Z•\ÐO�\ÐOˆEÑOä�:‹ !Ò#à 6°zÀ!±}Ñ E‘�˜à˜GÑ#�Ø !Ñ#�Ø× Ñ  Ô&ØàÐ'Ð'Ð'Ø×'Ñ'¬¬K×,CÑ,CÓ(DÀiÓPˆHÜ×"Ñ" 8Ó,ˆCä�I‰IØ7ØØ—‘ôñ
 &›<‰LˆB�Øˆ~Ø˜B‘�Ø (Ñ*�Ø× Ñ  §¡Ô.Ùà—<‘<“>ˆDØ—8‘8ˆDØ#&§;¡;Ð ñ Ð0Ð%×0Ñ0°$Ð7¸Ñ:Ô;à,×6Ñ6ˆIÜ�y“> QÒ&Ð&Ð&Ø˜‰|×$Ñ$ qÒ(ä % e£Ð,�‘XäŸ™×<Ñ<Ó>�ô !×*Ñ*ÝKØ!ô�ô '×0Ñ0ÜEØ!ô�ô
 �I‰IØVÜÑ<°Ô<Ó<ØØô	ñ ŒMØ˜‰NˆHØ˜hÑ&ˆNØ×Ñ˜SŸ\™\Ô*Ø15Ð5ˆDÐ5�4Ð.Ü×Ñ×)Ñ)Ö+ðCA	,ðD #7Œ�‰ÔØ%<Œ�‰Ô"Ø˜¨Ð2Ð2ùòG  IùÛOs   Ã*M/ÄM4)r  zScheduler | Noner´   rÆ   )r¿  ztorch.devicer©   )rƒ   )r´   útuple[float, str])rƒ   N)r	  zOrderedSet[str] | Noner´   r˜	  )rp  r~   rk	  ú	list[Any]rq  rq  r´   úlist[TritonKernel])rà   r  rk	  r™	  rq  rq  r´   rš	  )r¾   rÇ   rÈ   rÉ   r  rÿ  rÊ   r   rZ   ÚFOREACHÚ	BUCKETIZEÚINPLACE_BUFFERSÚMASKED_SCATTER_WITH_INDEXÚSCANÚSORTÚTRITON_TEMPLATESÚTUPLE_REDUCTIONr	  r�  rË   r	  r	  r"	  r	  r;	  r9	  rm	  rj	  r  r¥  r¦  s   @r‘   rþ  rþ  ñ  s  ø… Ù?à)€K�Ó)Ù!à×"Ñ"Ø×$Ñ$Ø×*Ñ*Ø×4Ñ4Ø×ÑØ×ÑØ×+Ñ+Ø×*Ñ*ð		
óÐõ:ð ò$ó ð$óMòB(YòT6ôp	
ð OSðW$Ø5KðW$à	óW$ðrQà+ðQð ðQð &ð	Qð
 
óQð83àð3ð ð3ð &ð	3ð
 
ó3öjt3r“   rþ  c                ó  — g }| j                  «       }|�t        |t        j                  «      sJ ‚|r0|j                  €$|j                  | j                  «       › d�«       |S ddlm} ddl	m
} | j                  «       }|€J ‚| j                  j                  |«      }t        |t        ||f«      sJ dt        |«      › �«       ‚t         j"                  j%                  |«      5  t&        j(                  }|j+                  | j-                  «       «      j/                  «       }|t&        _        d d d «       |j                  | j                  «       › d�«       |j                  t1        j2                  d«      «       |S # 1 sw Y   ŒRxY w)Nz" Unfinalized multi template bufferr   )ÚCUDACombinedScheduling)ÚXPUCombinedSchedulingz]Scheduling backend should be SIMD or CUDACombined when generating debug Triton strings, got: z Triton code:z    )Úget_template_noder•   r%   ÚMultiTemplateBufferÚmake_kernel_renderrë  rÖ  Ú0torch._inductor.codegen.cuda_combined_schedulingr¤	  Ú3torch._inductor.codegen.xpu.xpu_combined_schedulingr¥	  r½  r  Úget_backendro   rM  rU   ra  Úset_current_devicer&   Úgenerated_kernel_countr8	  r‰	  rQ  rÔ  ra  )	r¥   ÚlinesÚmulti_templater¤	  r¥	  r¿  ÚbackendÚold_generated_kernel_countÚtriton_codes	            r‘   r	  r	  Ä  st  € Ø€EØ×+Ñ+Ó-€NØÐ!¤Z°Ä×@VÑ@VÔ%WÐWÐWÙ˜.×;Ñ;ÐCØ�‰˜Ÿ™›Ð(Ð(JÐKÔLð< €Lõ9	
õ	
ð —‘Ó"ˆØÐ!Ð!Ð!Ø—.‘.×,Ñ,¨VÓ4ˆÜØ”nÐ&<Ð>SÐTô
ð 	
ð lÔlpÐqxÓlyÐkzÐ{ó	
ð 
ô �W‰W×'Ñ'¨Ó/ñ 	Hô *1×)GÑ)GÐ&Ø!×AÑAØ—‘Ó óç‰e‹gð ð .HŒGÔ*÷	Hð 	�‰˜Ÿ™›Ð(¨Ð6Ô7Ø�‰”X—_‘_ [°&Ó9Ô:Ø€L÷	Hð 	Hús   Ã#A	E=Å=F)r�   r—  )r�   rµ   r·   r¤  r´   rµ   r<  )rä   rµ  r´   rv  )rä   rµ  r´   rð   r´  r0  )r·   r¤  r´   r¤  )r·   r¤  r´   r£   )rô   zCSEVariable | Anyr´   r£   )r«   r	   r´   r/  )r«   r	   r´   r£   )r´   rz   rÔ  )rÃ   r£   r´   zCallable[[_T], _T])r¥   r:   r´   rv  )çÚ
__future__r   rÐ  r¾  rQ  r¹  r™  rA  r¶  ÚloggingrÛ  r´  rA	  rÔ  Úabcr   Úcollections.abcr   r   r   r   Útypingr	   r
   r   r   r–   Úsympy.printing.precedencer   r¿   Útorch._loggingÚtorch.utils._pytreer'   Ú_pytreerÅ  Útorch._dynamo.device_interfacer   Útorch._dynamo.utilsr   r   Útorch._prims_commonr   r   Útorch.utils._ordered_setr   Útorch.utils._sympy.functionsr   r   r   r   r   r   Útorch.utils._tritonr   r   r   Úutils._sympy.symbolr   r   r    r!   Úutils._sympy.value_rangesr"   rÍ   r$   r%   r&   r	  r(   Ú	codecacher)   r*   r+   r,   rê  r-   Úops_handlerr.   Úruntimer/   Úruntime.benchmarkingr0   Úruntime.hintsr1   r2   r3   r4   r5   r6   r7   Úruntime.runtime_utilsr8   r9   r  r:   r;   r<   r=   r>   Úshape_propagationr?   Ústream_utilsr@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   ÚvirtualizedrR   r  rS   rT   rU   Úwrapper_benchmarkrV   Úblock_analysisrX   ÚcommonrY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   Úsimdri   rj   rk   rl   rm   rn   ro   Útriton_utilsrp   rq   rr   rs   rt   ru   rv   rŠ  rw   Útypesrx   r¨  rz   Ú%torch.fx.experimental.symbolic_shapesr{   r|   r}   Úsimd_kernel_featuresr~   r   Ú	getLoggerr¾   r  Ú_loggingÚgetArtifactLoggerÚperf_hint_logÚschedule_logÚ
fusion_logr#  r’   rž   r¸   rº   rÓ   rÕ   r¸  r  r?  rÌ  r×  r¦  ræ  r¥  rò  rA  rë  r  r‚  rˆ  rŠ  rŒ  rŽ  r“  r˜  rš  r©  rÄ  rÆ  rÅ   r¬  r
  Ú_initialize_pointwise_overridesr%  rt  r@  rº  rÓ  rð   r²   rÚ  rß  r  rÈ  rþ  r	  r�   r“   r‘   ú<module>rÜ	     sL  ðå "ã 
Û Û Û Û Û Û Û Û Û Û 	Û Ý ß 8Ñ 8Ý ß 4Ó 4ã Ý 0ã Û ß $Ð $Ý Cß <ß ?Ý /÷÷ ÷ñ ÷ YÓ XÝ 4ß )Ó )Ý (ß FÓ FÝ ;Ý (Ý 'Ý .÷÷ ñ ÷ D÷õ õ 6Ý .÷÷ ÷ ÷ õ ÷& CÓ BÝ BÝ /÷÷ ÷ ÷ ó ÷$÷ ñ ÷÷ ñ õ %ñ Ý åLÝ>åÝ&Ý8á	�‹€Bà€g×Ò˜Ó!€Ø—’×0Ò0°¸<ÓH€Ø�~Š~×/Ò/°¸*ÓE€Ø�^Š^×-Ò-¨h¸ÓA€
Ù“€ð
 #$Ð ò,ó	ð&'Ø
ð&'Ø(ð&'àó&'÷R6ñ 6ñ  ˆ4ƒòó ð÷$h
ñ h
ðV ×Ò÷$
ð $
ó ð$
ðN ×Ò÷[$ð [$ó ð[$ð|
 ×Òô?Ð4ó ?ó ð?ð8 ×Òô=Ð,ó =ó ð=ó@ó6ð+Øð+à/ð+ð 0ð+ð 	ó	+ôBpQ�Mô pQñf 	‹×Ò€ó3ó
ó&ó8ó
;óPóóô2˜ô 2ó8(ô(ôVW&�kô W&ðx  × Ò ˜×3Ò3°TÔ :Ø × Ò ˜×2Ò2°DÔ 9Ø × /Ò /°Ô 9ôI"˜Oô I"÷X$+ñ $+ðN ×Ò÷N
ð N
ó ðN
÷b!ñ !ðH ×Ò÷#ð #ó ð#ô
�Ð% s¨U°3¸°8©_Ñ'<Ð<Ñ=ô 
ð ×Ò÷oð oó ðoôd	V=M�:Ð/Ñ0ô V=MôrzJ( <ô J(ôZP3�~ô P3ôf#r“   