Ë
    P/æj[ù  ã                  óv	  — U 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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 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% d dl&m'Z'm(Z( d dlm)Z) d dl*Z*d dl+Z+dd	gZ, ejZ                  d«      d
„ «       Z.d dl/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9m:Z: d dl;m<Z<m=Z=m>Z>m?Z?m@Z@ d dlAmBZBmCZC d dlDmEZEmFZF ddlGmHZH ddlImJZK ej                  dk(  ZL e
jš                  eN«      ZO e#d«      ZPee*j¢                  e*j¢                  f   ZRe$e+j¦                  eTf   ZUdZVdZWdZXeXeXdz
  z  d k(  reXdk\  sJ d«       ‚d„ ZYd§d„ZZ G d„ d e*j¶                  «      Z\d¨d©d!„Z] ejZ                  d«      dªd"„«       Z^d«d#„Z_d$„ Z`d%„ Zad¬d&„Zb	 	 	 	 	 	 d­d'„ZJd(„ Zc	 	 	 	 d®d)„Zd	 	 	 	 d¯d*„Zed°d+„Zf	 d±	 d²d,„Zgd-„ Zhd³d´d.„Zi	 dµ	 	 	 	 	 	 	 d¶d/„Zj	 d·	 d´d0„Zkd¸d1„Zld¹d2„Zmdºd3„Znd4„ Zod5„ Zp e(d6«      Zq e#d7d8¬9«      Zr G d:„ d;e eeqerf   «      Zsd»d<„Ztd=„ Zud>„ Zvd?„ Zw	 d±	 	 	 d¼d@„ZxdA„ Zyd½dB„ZzdC„ Z{d¾dD„Z|dE„ Z}d¿dF„Z~dÀdG„ZdÁdH„Z€dÂdI„Z�dJ„ Z‚dK„ ZƒdÃdL„Z„g Z…dMe†dN<   dÄdO„Z‡dP„ Zˆe�j                  dÅdQ„«       ZŠdÆdR„Z‹ ejZ                  d«      dS„ «       ZŒ G dT„ dUe«      Z� G dV„ dW«      ZŽ G dX„ dYeŽ«      Z�e�j                  dZ„ «       Z� G d[„ d\«      Z‘ ejZ                  d«      dªd]„«       Z’dªd^„Z“dÇd_„Z”dÈd`„Z•dÈda„Z–dbdbdcœdd„Z—de„ Z˜ ejZ                  d«      df„ «       Z™ ejZ                  d«      dg„ «       Zšdh„ Z›di„ ZœdÉdj„Z�dk„ Zž G dl„ dm«      ZŸdn„ Z do„ Z¡dp„ Z¢dq„ Z£dr„ Z¤ds„ Z¥e�j                  dt„ «       Z¦d±du„Z§dv„ Z¨dw„ Z©dx„ Zªdy„ Z«dz„ Z¬dÊd{„Z­e�j                  d|„ «       Z®d}„ Z¯ ejZ                  d«      d~„ «       Z° ejZ                  d«      d„ «       Z±d€„ Z²d�„ Z³d‚„ Z´dªdƒ„Zµd„„ Z¶dËd…„Z·d†„ Z¸ G d‡„ dˆe�jr                  «      Zºd‰„ Z»d±dŠ„Z¼d‹„ Z½dŒ„ Z¾d�„ Z¿dŽ„ ZÀd�„ ZÁ	 d±d�„ZÂ	 d±d‘„ZÃdÌd’„ZÄdÍd“„ZÅe�jŒ                   G d”„ d•«      «       ZÇe�j                  d–„ «       ZÈdÎd—„ZÉd´d˜„ZÊd´d™„ZËdš„ ZÌ	 	 dÏd›„ZÍdœ„ ZÎdÐd�„ZÏdÑdž„ZÐdŸ„ ZÑd „ ZÒdÒd¡„ZÓ	 	 	 	 	 	 dÓd¢„ZÔdÔd£„ZÕ	 	 	 	 	 	 dÕd¤„ZÖ	 	 	 	 dÖd¥„Z×d¦„ ZØy)×é    )ÚannotationsN)Údatetime)ÚStringIO)ÚAnyÚCallableÚDictÚGenericÚIterableÚListÚ
NamedTupleÚOptionalÚProtocolÚSequenceÚSetÚTypeVarÚUnionÚ
ValuesView)ÚConcatenateÚ	ParamSpec)ÚmockÚcudaÚxpuc                 óØ   — t         D � cg c]#  } t        t        | «      j                  «       sŒ"| ‘Œ% }} t	        |«      dk  sJ ‚t	        |«      dk(  rd}|S |j                  «       }|S c c} w )Né   r   r   )Ú	GPU_TYPESÚgetattrÚtorchÚis_availableÚlenÚpop)ÚxÚ
avail_gpusÚgpu_types      úX/root/repos/pocs/video-evals/.venv/lib/python3.12/site-packages/torch/_inductor/utils.pyÚget_gpu_typer%   6   sg   € ä&ÖK˜¬'´%¸Ó*;×*HÑ*HÕ*J’!ÐK€JÐKÜˆz‹?˜aÒÐÐÜ˜Z›¨AÒ-ˆv€HØ€Oð 4>·>±>Ó3C€HØ€Oùò Ls
   ‰#A'­A')Úget_interface_for_device)Údetect_fake_mode)Ú
DeviceType)Ú	EventList)ÚGraphTransformObserver)Ú	ShapeProp)ÚCeilDivÚCleanDivÚFloorDivÚIdentityÚModularIndexing)Úmake_symbolÚSymT)Úbound_sympyÚValueRangesr   )Úconfig)ÚceildivÚwin32Ú_Té   é@   é   zmust be power of 2c                ó*   — | t         z   dz
  t          z  S )z/Round up to the nearest multiple of ALIGN_BYTESr   )ÚALIGN_BYTES)Únbytess    r$   Ú_alignr?   b   s   € à”[Ñ  1Ñ$¬¨Ñ4Ð4ó    c                ó  — t        | t        j                  t        j                  f«      r#t	        t        t        | j                  «      «      S t        | t        «      xs! t        j                  | t        «      t        k(  S )z:v can be statically proven to be a multiple of ALIGN_BYTES)Ú
isinstanceÚsympyÚAddÚMaxÚallÚmapÚ_is_alignedÚargsÚalignÚgcdr=   )Úvs    r$   rH   rH   g   sQ   € ä�!”e—i‘i¤§¡Ð+Ô,Ü”3”{ A§F¡FÓ+Ó,Ð,Ü�aœÓÒK¤5§9¡9¨Q´Ó#<ÄÑ#KÐKr@   c                  ó(   — e Zd ZdZdZdZed„ «       Zy)rJ   z<Symbolically round up to the nearest multiple of ALIGN_BYTES©r   Tc                ó†   — t        |t        t        j                  f«      rt	        t        |«      «      S t        |«      r|S y ©N)rB   ÚintrC   ÚIntegerr?   rH   )ÚclsÚvalues     r$   Úevalz
align.evalt   s6   € ä�eœc¤5§=¡=Ð1Ô2Üœ#˜e›*Ó%Ð%Ü�uÔØˆLð r@   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚnargsÚ
is_integerÚclassmethodrU   © r@   r$   rJ   rJ   n   s!   „ ÙFà€EØ€Jàñó ñr@   rJ   c                ó  —  | «        t         j                  j                  «        t        j                  t	        d«      t         j                  d¬«      }t         j                  j                  d¬«      }t         j                  j                  d¬«      }|j                  «        t        d«      D ]  }|j                  «         | «        Œ |j                  «        t         j                  j                  «        |j                  |«      dz  }t        dt	        ||z  «      «      }t        dt	        ||z  «      «      }	t        |«      D ]	  } | «        Œ t         j                  j                  t         j                  j                  j                  g¬«      5 }
t        |	«      D ]  }|j                  «         | «        Œ t         j                  j                  «        d	d	d	«       t        j!                  d
«       t        j!                  
j#                  «       j%                  dd¬«      «       t'        |
j)                  «       D �cg c]0  }|j*                  t,        j                  k(  r|j.                  dk7  r|‘Œ2 c}«      }t1        |«      |	z  dk7  rt3        dt1        |«      |	«      ‚t1        |«      |	z  }t'        t5        |«      D ��cg c]  \  }}||z  dk7  r|‘Œ c}}«      }|j7                  «        |j#                  «       }t        j!                  d«       t        j!                  |j%                  d¬«      «       t9        d„ |D «       «      dz  |	z  }t        j!                  d|«       |S # 1 sw Y   �Œ”xY wc c}w c c}}w )aR  
    Returns benchmark results by examining torch profiler events.
    This could be more accurate as it doesn't count CPU side overhead.
    However, this also requires manually excluding irrelevant event, e.g.
    vectorized_elementwise_kernel which is used to fill L2 cache,
    various CUDA events, etc, so could also be fragile.
    g    €„ŽAr   )ÚdtypeÚdeviceT)Úenable_timingé   r   )Ú
activitiesNz
raw eventsÚself_device_time_totaléÿÿÿÿ)Úsort_byÚ	row_limitzContext Syncr   zYFailed to divide all profiling events into #repeat groups. #CUDA events: %d, #repeats: %szprofiling time breakdown)rg   c              3  ó4   K  — | ]  }|j                   –— Œ y ­wrP   )Údevice_time_total)Ú.0Úevents     r$   ú	<genexpr>z+do_bench_using_profiling.<locals>.<genexpr>É   s   è ø€ ÒA¨%ˆe×%Õ%ÑAùs   ‚g     @�@zprofiling results: %s ms)r   r   ÚsynchronizeÚemptyrQ   ÚEventÚrecordÚrangeÚzero_Úelapsed_timeÚmaxÚprofilerÚprofileÚProfilerActivityÚCUDAÚlogÚdebugÚkey_averagesÚtabler)   ÚeventsÚdevice_typer(   Únamer   ÚRuntimeErrorÚ	enumerateÚ_build_treeÚsum)ÚfnÚwarmupÚrepÚcacheÚstart_eventÚ	end_eventÚ_Úestimate_msÚn_warmupÚn_repeatÚpÚirk   Úfiltered_eventsÚnum_event_per_groupÚactual_eventsÚress                    r$   Údo_bench_using_profilingr”   |   sø  € ñ „DÜ	‡J�J×ÑÔÜ�K‰Kœ˜J›¬u¯y©yÀÔH€Eô —*‘*×"Ñ"°Ð"Ó6€KÜ—
‘
× Ñ ¨tÐ Ó4€IØ×ÑÔÜ�1‹Xò ˆØ�‰ŒÙ
�ðð ×ÑÔÜ	‡J�J×ÑÔØ×*Ñ*¨9Ó5¸Ñ9€Kô �1”c˜& ;Ñ.Ó/Ó0€HÜ�1”c˜# Ñ+Ó,Ó-€Hô �8‹_ò ˆÙ
�ðô 
�‰×	Ñ	ä�N‰N×+Ñ+×0Ñ0ð
ð 
 ó 
ð !ð 
ä�x“ò 	ˆAà�K‰KŒMá�Dð		ô 	�
‰
×ÑÔ ÷!ô ‡I�IˆlÔÜ‡I�Iˆa�n‰nÓ×$Ñ$Ð-EÐQSÐ$ÓTÔUäð Ÿ™›ö	
àØ× Ñ ¤J§O¡OÒ3¸¿
¹
ÀnÒ8Tò ò	
ó€Oô ˆ?Ó˜hÑ&¨!Ò+Üð-ä�Ó Øó	
ð 	
ô ˜oÓ.°Ñ9ÐÜô & oÓ6÷	
á��5ØÐ&Ñ&¨!Ò+ò ó	
ó€Mð ×ÑÔØ!×.Ñ.Ó0€Mä‡I�IÐ(Ô)Ü‡I�Iˆm×!Ñ!¨BÐ!Ó/Ô0ä
ÑA°=ÔAÓ
AÀFÑ
JÈXÑ
U€CÜ‡I�IÐ(¨#Ô.Ø€J÷_!ñ !üò$	
ùó	
s   ÆAM0É5M=Ë
N
Í0M:c                 ó  — 	 ddl m}  t        j                  j	                  dd«       | d uxr% t        t        t        j                  dd «      d«      S # t        $ r Y yt        $ r}dt        |«      v sJ ‚Y d }~yd }~ww xY w)	Nr   )Ú	roi_alignztorchvision::nmsÚMetaÚtorchvisionr–   Fztorchvision::nms does not exist)Útorchvision.opsr–   r   Ú_CÚ%_dispatch_has_kernel_for_dispatch_keyÚhasattrr   ÚopsÚImportErrorr€   Ústr)r–   Úes     r$   Úhas_torchvision_roi_alignr¡   Î   s|   € ðÝ-ä�‰×6Ñ6Ð7IÈ6ÔRØ Ð$ò 
¬Ü”E—I‘I˜}¨dÓ3°[ó*
ð 	
øô ò ÙÜò Ø0´C¸³FÑ:Ð:Ð:Üûðús   ‚AA Á	A?ÁA?Á&A:Á:A?c                ób  — | €t        j                  d«      j                  S t        | t        «      rt        j                  | «      } | j
                  dvrZ| j                  €Nt        | j
                  «      }t        j                  | j
                  |j                  j                  «       ¬«      S | S )Ng        )ÚcpuÚmeta)Úindex)
r   Útensorr`   rB   rŸ   Útyper¥   r&   ÚWorkerÚcurrent_device©r`   Údevice_interfaces     r$   Údecode_devicer¬   Þ   s‚   € Ø€~Ü�|‰|˜CÓ ×'Ñ'Ð'Ü�&œ#ÔÜ—‘˜fÓ%ˆØ‡{�{˜/Ñ)¨f¯l©lÐ.BÜ3°F·K±KÓ@ÐÜ�|‰|˜FŸK™KÐ/?×/FÑ/F×/UÑ/UÓ/WÔXÐXØ€Mr@   c                ór   — t        j                  t        j                  | t	        j
                  d«      «      S ©Nr   )Ú	functoolsÚreduceÚoperatorÚmulrC   rR   )Úits    r$   Úsympy_productr´   é   s$   € Ü×ÑœHŸL™L¨"¬e¯m©m¸AÓ.>Ó?Ð?r@   c           	     ó’   — t        | «      t        |«      k(  sJ ‚t        j                  t        d„ t	        | |«      D «       «      «      S )Nc              3  ó,   K  — | ]  \  }}||z  –— Œ y ­wrP   r]   )rj   ÚaÚbs      r$   rl   zsympy_dot.<locals>.<genexpr>ï   s   è ø€ Ò>¡d a¨˜A �EÑ>ùs   ‚)r   rC   Úexpandrƒ   Úzip)Úseq1Úseq2s     r$   Ú	sympy_dotr½   í   s8   € Üˆt‹9œ˜D›	Ò!Ð!Ð!Ü�<‰<œÑ>¬c°$¸«oÔ>Ó>Ó?Ð?r@   c                ó\   — | D �ci c]  }t        |«      |“Œ c}j                  «       S c c}w rP   )ÚidÚvalues)r³   r!   s     r$   ÚuniquerÁ   ò   s'   € Ø Ö!˜ŒBˆq‹E�1‰HÒ!×(Ñ(Ó*Ð*ùÒ!s   …)c           
     ón  — t        | t        j                  «      st        |t        j                  «      r2t        t        j                  | «      t        j                  |«      «      S t        | t
        «      rt        |t
        «      s$J | › dt        | «      › d|› dt        |«      › �«       ‚t        | |«      S )Nz: ú, )rB   rC   ÚExprr,   ÚsympifyrQ   r§   Úruntime_ceildiv)ÚnumerÚdenoms     r$   r6   r6   ö   s–   € ô �%œŸ™Ô$¬
°5¼%¿*¹*Ô(EÜ”u—}‘} UÓ+¬U¯]©]¸5Ó-AÓBÐBô �eœSÔ!¤jØŒsô'ð 9à
ˆ�”4˜“;�-˜r % ¨¬4°«;¨-Ð8ó9ð ô ˜5 %Ó(Ð(r@   c                ó0  — | €yt        | «      j                  d«      d   }i dd“dd“dd	“d
d“dd“dd“dd	“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	        | t         «      r| S d'||   › �S )(Nz*i8ú.re   ÚboolÚi1Ú
float8e4nvÚfp8e4nvÚfloat8e5Úfp8e5Úfloat8e4b15Úfp8e4b15Úfloat8e4b15x4Ú
fp8e4b15x4Úfloat8_e4m3fnÚfloat8_e5m2Úfloat16Úfp16Úbfloat16Úbf16Úfloat32Úfp32Úfloat64Úfp64Úint8Úi8Úint16Úi16Úint32Úi32Úint64Úi64Úuint8Úu8Úuint16Úu16Úu32Úu64)Úuint32Úuint64Ú*)rŸ   ÚsplitÚlistrÀ   rB   )ÚkeyÚ	dtype_strÚtysrL   s       r$   Ú_type_ofrõ     sD  € ð
 €{ØÜ�C“—‘˜sÓ# BÑ'€IðØ�ðà�iðð 	�Gðð 	�zð	ð
 	˜ðð 	˜ðð 	�wðð 	�6ðð 	�Fðð 	�6ðð 	�6ðð 	�ðð 	�ðð 	�ðð 	�ðð  	�ð!ð" 	�%ð#ð$ Øò'€Cô, �#—*‘*“,Óò ˆØˆˆAŠðä˜S¤#Ô&ˆ3Ð@¨a°°I±Ð/?Ð,@Ð@r@   c                óR   — | D �cg c]  }t        j                  |«      ‘Œ c}S c c}w )z­
    Gets the shape and stride of a tensor. For non-symbolic tensors, this is
    trivial. But for symbolic tensors, we need to map from SymIntNode into
    sympy.Expr.
    )rC   rÅ   )Úlstr�   s     r$   Úconvert_shape_to_inductorrø   '  s!   € ð '*Ö* ŒE�M‰M˜!ÕÒ*Ð*ùÒ*s   …$c                ó  — ddl m} | D �cg c]j  }t        |t        «      r|nUt        |t        j
                  «      rt        |«      n0|j                  j                  j                  j                  |d¬«      ‘Œl c}S c c}w )zz
    Takes a list of shapes from Inductor and converts them into symints (or just
    ints if all shapes are static).
    r   ©ÚVN)Úhint)
Úvirtualizedrû   rB   rQ   rC   rR   ÚgraphÚsizevarsÚ	shape_envÚcreate_symintnode)r÷   rû   r�   s      r$   Úconvert_shape_to_symintr  2  sy   € õ ð öð ô	 �aœÔñ 	
ô �aœŸ™Ô'ô �ŒVà�W‰W×Ñ×'Ñ'×9Ñ9¸!À$Ð9ÓGñ		Hòð ùò s   ‹A/A=c                óš   — t        | t        j                  j                  «      sJ ‚t	        d„ | j
                  j                  D «       «      S )z-
    Does this op overload have aliasing
    c              3  ó8   K  — | ]  }|j                   d u–— Œ y ­wrP   )Ú
alias_info©rj   r·   s     r$   rl   zis_view.<locals>.<genexpr>J  s   è ø€ ÒF¨Aˆq�|‰| 4Ô'ÑFùs   ‚)rB   r   Ú_opsÚ
OpOverloadÚanyÚ_schemaÚ	arguments)Úops    r$   Úis_viewr  E  s9   € ô �bœ%Ÿ*™*×/Ñ/Ô0Ð0Ð0ÜÑF°·±×1EÑ1EÔFÓFÐFr@   c                óì  ‡— | j                   dk(  syt        | j                  t        j                  j
                  «      s| j                  t        j                  u sy| j                  t        j                  u st        | j                  «      rt        ˆfd„| j                  D «       «      S t        j                  j                  | j                  j                  v xs ‰duxr  ‰| j                  «      S )z™
    Do all uses of this op have torch.Tag.pointwise or return True for optional `is_pointwise_fn`

    Uses in views ops will follow the views uses
    Úcall_functionFc              3  ó6   •K  — | ]  }t        |‰«      –— Œ y ­wrP   )Úis_pointwise_use)rj   ÚuÚis_pointwise_fns     €r$   rl   z#is_pointwise_use.<locals>.<genexpr>_  s   øè ø€ ÒK¸AÔ# A ×7ÑKùs   ƒN)r  rB   Útargetr   r  r  r±   Úgetitemr  rF   ÚusersÚTagÚ	pointwiseÚtags)Úuser  s    `r$   r  r  M  s®   ø€ ð �6‰6�_Ò$Øô 	�3—:‘:œuŸz™z×4Ñ4Ô5¸¿¹Äx×GWÑGWÑ9Wàà
‡z�z”X×%Ñ%Ñ%¬°·±Ô)<ÜÓKÀÇÁÔKÓKÐKä�9‰9×Ñ #§*¡*§/¡/Ð1ò Ø˜tÐ#ÒC©¸¿
¹
Ó(Cðr@   c                óº  — t         j                  j                  «       }g }g }t        |«      D ]e  \  }}t	        |t         j
                  «      r5|j                  |j                  d|› �«      «       |j                  |«       ŒU|j                  |«       Œg t        d„ |j                  «       D «       «      sJ ‚|j                  | t        |«      |«      }t        | j                  j                  «      dk(  r2t        | j                  j                  d   j                   «      dk(  r|f}|j#                  |«       t         j                  j%                  i |«      }	|	|fS )NÚargc              3  óR   K  — | ]  }t        |t        j                  «       –— Œ! y ­wrP   )rB   r   ÚTensor©rj   r!   s     r$   rl   z$gen_gm_and_inputs.<locals>.<genexpr>p  s   è ø€ ÒH°1”:˜a¤§¡Ó.Ô.ÑHùs   ‚%'r   r   r  )r   ÚfxÚGraphr�   rB   r  ÚappendÚplaceholderrF   rÀ   r  Útupler   r
  ÚreturnsrŸ   r§   ÚoutputÚGraphModule)
r  rI   ÚkwargsÚgÚg_argsÚa_argsÚnr  ÚnodeÚgms
             r$   Úgen_gm_and_inputsr/  f  s  € Ü�‰�‰Ó€AØ€FØ€FÜ˜D“/ò ‰ˆˆ3Ü�cœ5Ÿ<™<Ô(Ø�M‰M˜!Ÿ-™-¨#¨a¨S¨	Ó2Ô3Ø�M‰M˜#Õà�M‰M˜#Õðô ÑH¸¿¹»ÔHÔHÐHÐHØ�?‰?˜6¤5¨£=°&Ó9€DäˆF�N‰N×"Ñ"Ó# qÒ(Ü�—‘×&Ñ& qÑ)×.Ñ.Ó/°8Ò;àˆwˆØ‡H�HˆT„Nä	�‰×	Ñ	˜b !Ó	$€BØˆvˆ:Ðr@   c                óh   — | dk(  ry t        | «      }|j                  «       r|j                  «        y y ©Nr£   )r&   r   rm   rª   s     r$   rm   rm   }  s4   € Ø�‚ØÜ/°Ó7ÐØ×$Ñ$Ô&Ø×$Ñ$Õ&ð 'r@   c                óä   — t        |«       t        j                  d«       t        j                  «       }t        |«      D ]  } | |Ž }t        |«       Œ t        j                  «       }€J ‚||z
  S )Ni9  )rm   r   Úmanual_seedÚtimeÚperf_counterrq   )ÚmodelÚexample_inputsÚtimesr`   Út0rŠ   ÚresultÚt1s           r$   Útimedr<  …  sr   € ô �ÔÜ	×Ñ�dÔÜ	×	Ñ	Ó	€BÜ�5‹\ò ˆÙ˜Ð'ˆÜ�FÕðô 
×	Ñ	Ó	€BàÐÐÐØ�‰7€Nr@   c                óÐ   — t        j                  t        |«      D �cg c]  }t        | |||«      ‘Œ c}«      }t        j                  |«      |z  }t        ||z  d›«       |S c c}w )Nz.6f)r   r¦   rq   r<  ÚmedianÚprint)	r„   rI   r8  ÚrepeatÚbaseliner`   rŠ   ÚtimingsÚtooks	            r$   Úprint_performancerD  ”  s[   € ô �l‰lÄEÈ&ÃMÖR¸qœE " d¨E°6Õ:ÒRÓS€GÜ�<‰<˜Ó  5Ñ(€DÜ	ˆT�H‰_˜SÐ!Ô#Ø€Kùò Ss   �A#c                óH   ‡—  t        | |«      «       Št        | |ˆfd„«       y)zKReplace obj.method() with a new method that returns a precomputed constant.c                 ó   •— ‰ S rP   r]   )r:  s   €r$   ú<lambda>z#precompute_method.<locals>.<lambda>   s   ø€  € r@   N)r   Úsetattr)ÚobjÚmethodr:  s     @r$   Úprecompute_methodrK  �  s    ø€ à!ŒW�S˜&Ó!Ó#€FÜˆC�›Õ(r@   c                ó*   — |D ]  }t        | |«       Œ y)zFReplace methods with new methods that returns a precomputed constants.N)rK  )rI  ÚmethodsrJ  s      r$   Úprecompute_methodsrN  £  s   € àò 'ˆÜ˜#˜vÕ&ñ'r@   c                ó<   — t        | |kD  «      t        | |k  «      z
  S rP   )rQ   )r·   r¸   s     r$   ÚcmprP  ©  s   € Üˆq�1‰u‹:œ˜A ™E›
Ñ"Ð"r@   c                óR   — t        | «      dk(  r t        | «      | d   g«      |z  S | S )Nr   r   )r   r§   )r!   Úsizes     r$   Úpad_listlikerS  ­  s-   € Ü
ˆ1ƒv�‚{ØŒt�A‹w˜˜!™�v‹ Ñ%Ð%àˆr@   c                óB   — t        | «      dk(  rg S d„ }t        | |¬«      S )Nr   c                óF   — t        | t        «      r| S | j                  «       S rP   )rB   rŸ   Úget_name)Úelems    r$   Ú	sort_funcztuple_sorted.<locals>.sort_func¹  s   € Ü�dœCÔ ØˆKð —=‘=“?Ð"r@   ©rò   )r   Úsorted)r!   rX  s     r$   Útuple_sortedr[  µ  s&   € Ü
ˆ1ƒv�‚{Øˆ	ò#ô �!˜Ô#Ð#r@   ÚPÚRVT)Ú	covariantc                  ó&   — e Zd Zedd„«       Zdd„Zy)ÚCachedMethodc                 ó   — y rP   r]   ©Úselfs    r$   Úclear_cachezCachedMethod.clear_cacheÉ  s   € àr@   c                 ó   — y rP   r]   ©rc  rI   r(  s      r$   Ú__call__zCachedMethod.__call__Í  s   € Ør@   N©ÚreturnÚNone)rI   zP.argsr(  zP.kwargsri  r]  )rV   rW   rX   Ústaticmethodrd  rg  r]   r@   r$   r`  r`  È  s   „ Øòó ðôr@   r`  c                ó~   ‡ ‡— d‰ j                   › d�Št        j                  ‰ «      ˆ ˆfd„«       }ˆfd„}||_        |S )NÚ__Ú_cachec                óZ   •— t        | ‰«      st        | ‰ ‰| «      «       t        | ‰«      S rP   )rœ   rH  r   )rc  r„   rò   s    €€r$   Úwrapperzcache_on_self.<locals>.wrapperÕ  s*   ø€ ä�t˜SÔ!Ü�D˜#™r $›xÔ(Ü�t˜SÓ!Ð!r@   c                ó8   •— t        | ‰«      rt        | ‰«       y y rP   )rœ   Údelattr)rc  rò   s    €r$   rd  z"cache_on_self.<locals>.clear_cacheÛ  s   ø€ Ü�4˜ÔÜ�D˜#Õð r@   )rV   r¯   Úwrapsrd  )r„   rp  rd  rò   s   `  @r$   Úcache_on_selfrt  Ò  sD   ù€ Øˆr�{‰{ˆm˜6Ð
"€Cä‡_�_�RÓô"ó ð"ô
ð &€GÔØ€Nr@   c           
     ó^  — ddl m} t        | t        «      rgt	        j
                  t        j                  | D �cg c]0  }t        |d«      r"|j                  r|j                  j                  ‘Œ2 c}t        «       «      S t        | |j                  «      r| j                  S t        «       S c c}w )Nr   ©Úirr-  )Ú rw  rB   rñ   r¯   r°   r±   Úor_rœ   r-  ÚoriginsÚsetÚExternKernel)Únode_schedulerw  r-  s      r$   Úaggregate_originsr~  ã  sŠ   € Ýä�-¤Ô&Ü×ÑÜ�L‰Lð *öàÜ˜4 Ô(¨T¯YªYð —	‘	×!Ó!òô
 ‹Eó
ð 	
ô 
�M 2§?¡?Ô	3Ø×$Ñ$Ð$ä‹uˆùòs   ¹5B*
c                óä  — t        | «      }|dk(  rq|D �cg c]Q  }|j                  dk(  r@d|j                  v r2|j                  d   �#|j                  d   j                  j                  ‘ŒS }}t        t        |«      «      }nÏ|dk(  r•g }|D ]y  }|j                  dk(  sŒd|j                  v sŒ"|j                  d   d   }t        |d   t        «      r|j                  |d   «       Œ\|j                  |d   j                  «       Œ{ t        t        |«      «      }n5|dk(  r*|D �cg c]  }|j                  dk(  sŒ|j                  ‘Œ  }}nt        ‚|}dj                  d	g|z   «      S c c}w c c}w )
NÚoriginal_atenr  r   Úsource_fn_stackre   r   Úinductor_noderŠ   Úfused)r~  r  r¤   Ú_overloadpacketrV   rZ  r{  rB   rŸ   r"  r   ÚNotImplementedErrorÚjoin)r}  Údescriptive_namesÚall_originsÚoriginÚsourcesÚ	source_fns         r$   Úget_fused_kernel_namerŒ  ö  si  € Ü# MÓ2€KØ˜OÒ+ð &ö
àØ�y‰y˜OÒ+Ø 6§;¡;Ñ.Ø—‘˜OÑ,Ð8ð	 �K‰K˜Ñ(×8Ñ8×AÓAð
ˆð 
ô œ˜W›Ó&‰Ø	˜gÒ	%àˆØ!ò 	:ˆFØ�y‰y˜OÓ+Ð0AÀVÇ[Á[Ò0PØ"ŸK™KÐ(9Ñ:¸2Ñ>�	Ü˜i¨™l¬CÔ0Ø—N‘N 9¨Q¡<Õ0à—N‘N 9¨Q¡<×#8Ñ#8Õ9ð	:ô œ˜W›Ó&‰Ø	˜oÒ	-à&1ö
Ø"°V·Y±YÀ/Ó5QˆF�K‹Kð
ˆñ 
ô "Ð!Ø€GØ�8‰8�W�I Ñ'Ó(Ð(ùò5
ùò(
s   •AE(Ä%E-Ä:E-c                ó’  ‡— t        | «      }|D �cg c]  }|j                  dk(  sŒ|‘Œ }}t        j                  t        «      }t        j                  t        «      }d Št        |«      r‚|D �ch c]  }|j                  ’Œ }}t        |«      dk(  r[|d   j                  Št        ‰d«      s+i }	t        ‰j                  «      D ]
  \  }
}|
|	|<   Œ |	‰_
        |j                  ˆfd„¬«       |D ]¡  }d|j                  v rO|j                  d   �@t        |j                  d   j                  «      }||   j                  |j                   «       d|j                  v sŒo|j                  d   d   d   }||   j                  |j                   «       Œ£ ‰�d	nd
}|j"                  › d|› ddj%                  |j'                  «       «      › ddj%                  |j'                  «       «      › d�}|j"                  › d�g}t)        |j+                  «       «      D ]@  \  }}|j                  |j"                  › d|› ddj%                  t)        |«      «      › �«       ŒB ‰�S|j                  |j"                  › d�«       |D ]0  }|j                  |j"                  › d|j-                  «       › �«       Œ2 |dj%                  |«      fS c c}w c c}w )Nr  r   r   Ú)_inductor_kernel_metadata_node_to_idx_mapc                ó"   •— ‰j                   |    S rP   )rŽ  )r,  Úsingle_graphs    €r$   rG  z%get_kernel_metadata.<locals>.<lambda>-  s   ø€ ˜l×TÑTÐUVÑW€ r@   rY  r€  Ú	from_nodezTopologically SortedÚUnsortedú z Source Nodes: [rÃ   z], Original ATen: [ú]z" Source node to ATen node mapping:z   z => z Graph fragment:ú
)r~  r  ÚcollectionsÚdefaultdictrñ   r   rþ   rœ   r�   ÚnodesrŽ  Úsortr¤   rŸ   r„  r"  r   Úcommentr†  ÚkeysrZ  ÚitemsÚformat_node)r}  rp  rˆ  r‰  Úinductor_nodesÚfrom_node_dictÚoriginal_aten_dictr,  Úunique_graphsÚnode_to_idx_mapÚidxr-  rò   Úsort_strÚmetadataÚdetailed_metadataÚoriginal_noder˜  r�  s                     @r$   Úget_kernel_metadatar¨    sÍ  ø€ Ü# MÓ2€KØ+6ÖW ¸&¿)¹)ÀÓ:V’fÐW€NÐWä ×,Ñ,¬TÓ2€NÜ$×0Ñ0´Ó6Ðð
 €LÜ
ˆ>ÔØ*8Ö9 Q˜Ÿ›Ð9ˆÐ9Üˆ}Ó Ò"Ø)¨!Ñ,×2Ñ2ˆLä˜<Ð)TÔUØ"$�Ü'¨×(:Ñ(:Ó;ò -‘F�C˜Ø),�O AÒ&ð-àIX�ÔFØ×ÑÛWð  ô ð ò 2ˆØ˜dŸi™iÑ'¨D¯I©I°oÑ,FÐ,RÜ�d—i‘i Ñ0×@Ñ@ÓAˆCØ˜sÑ#×*Ñ*¨4¯9©9Ô5Ø˜$Ÿ)™)Ò#Ø—)‘)˜KÑ(¨Ñ+¨AÑ.ˆCØ˜3Ñ×&Ñ& t§y¡yÕ1ð2ð *6Ð)AÑ%Àz€Hà�?‰?Ð
˜1˜X˜JÐ&6°t·y±yÀ×ATÑATÓAVÓ7WÐ6Xð YØŸ9™9Ð%7×%<Ñ%<Ó%>Ó?Ð@Àð	Cð ð $ŸO™OÐ,Ð,NÐOÐPÐÜ & ~×';Ñ';Ó'=Ó >ò 
Ñˆ�uØ× Ñ Ø�‰Ð˜s = /°°d·i±iÄÀuÃÓ6NÐ5OÐPõ	
ð
ð ÐØ× Ñ  G§O¡OÐ#4Ð4DÐ!EÔFØò 	OˆAð ×$Ñ$¨¯©Ð'8¸¸A¿M¹M»OÐ;LÐ%MÕNð	Oð
 �T—Y‘YÐ0Ó1Ð1Ð1ùòg Xùò :s   ‘J?¦J?Á/Kc                óâ   — t        | «      } t        | «      }| rV| j                  «       }|j                  D ]4  }|r	 ||«      rŒ||vsŒ|j	                  |«       | j                  |«       Œ6 | rŒV|S )zJReturns the set of nodes whose values depend on those within initial_queue)rñ   r{  r    r  Úaddr"  )Úinitial_queueÚskip_filterÚdominated_setr-  Úusers        r$   Údominated_nodesr¯  O  sz   € ô ˜Ó'€MÜ˜Ó&€Má
Ø× Ñ Ó"ˆØ—J‘Jò 	+ˆDÙ™{¨4Ô0ØØ˜=Ò(Ø×!Ñ! $Ô'Ø×$Ñ$ TÕ*ð	+ò ð Ðr@   c                ó  ‡‡— dd l }ddlmŠ ˆˆfd„Š|j                  «       D �cg c]  } ‰|«      sŒ|j                  ‘Œ }}| D �cg c]  } ‰|«      sŒ|j                  ‘Œ }}t         |j                  g |¢|¢­Ž «      S c c}w c c}w )Nr   r   rv  c                ó   •— t        | ‰j                  «      r ‰| j                  «      S t        | ‰j                  «      r ‰| j                  «      S t        | ‰j                  «      xr t        | ‰j
                  «      S rP   )rB   Ú	TensorBoxÚdataÚ
StorageBoxÚIRNodeÚ	Pointwise)r,  rw  Úis_unrealized_nodes    €€r$   r·  z*gather_origins.<locals>.is_unrealized_nodeg  s^   ø€ Ü�a˜Ÿ™Ô&Ù% a§f¡fÓ-Ð-Ü�a˜Ÿ™Ô'Ù% a§f¡fÓ-Ð-Ü˜!˜RŸY™YÓ'ÒG¬J°q¸"¿,¹,Ó,GÐGr@   )Ú	itertoolsrx  rw  rÀ   rz  r{  Úchain)	rI   r(  r¸  ÚvalÚkwarg_originsr  Úarg_originsrw  r·  s	          @@r$   Úgather_originsr½  b  s}   ù€ ÛåõHð -3¯M©M«OÖW SÑ?QÐRUÕ?V�S—[“[ÐW€MÐWØ*.ÖJ 3Ñ2DÀSÕ2I�3—;“;ÐJ€KÐJÜˆˆy�‰Ð< Ð<¨mÒ<Ó=Ð=ùò XùÚJs   ¥B³BÁBÁBc                ó6  — t        | t        j                  «      r| j                  S t        | t        j                  «      r)dj                  t        t        | j                  «      «      S t        | t        j                  «      r)dj                  t        t        | j                  «      «      S t        | t        t        t        t        f«      rC| j                  j                  › ddj                  t        t        | j                  «      «      › d�S t!        | «      S )zµ
    Normal sympy str is very slow, this is a lot faster.  The result are
    somewhat worse, as it doesn't do as much simplification.  So don't
    use this for final codegen.
    z + z * ú(rÃ   ú))rB   rC   ÚSymbolr   rD   r†  rG   Ú	sympy_strrI   ÚMulr0   r-   r.   r/   ÚfuncrV   rŸ   )Úexprs    r$   rÂ  rÂ  s  s¼   € ô �$œŸ™Ô%Ø�y‰yÐÜ�$œŸ	™	Ô"Ø�z‰zœ#œi¨¯©Ó3Ó4Ð4Ü�$œŸ	™	Ô"Ø�z‰zœ#œi¨¯©Ó3Ó4Ð4ä�$œ¬(´H¼hÐGÔHØ—)‘)×$Ñ$Ð% Q t§y¡y´´YÀÇ	Á	Ó1JÓ'KÐ&LÈAÐNÐNÜˆt‹9Ðr@   c                ó¼   — ddl m} t        j                  r3t	        |j
                  dd «      x}r|j                  dk7  rt        | «      S t        j                  «       S )Nr   rú   Úcurrent_nodeÚ
index_expr)
rý   rû   r5   Úcompute_all_boundsr   Úinterpreterr  r3   r4   Úunknown)r¥   rû   Úfx_nodes      r$   Úget_bounds_index_exprrÍ  …  sN   € Ýô 	×!Ò!Ü §¡¨~¸tÓDÐDˆWÐDØ�N‰N˜lÒ*ä˜5Ó!Ð!ä×"Ñ"Ó$Ð$r@   c                óJ   — | t         j                  k7  sJ ‚t        | |dd¬«      S )ú9
    Used to generate an integer-nonnegative symbol.
    T©ÚintegerÚnonnegative)r2   ÚSIZEr1   )Úprefixr£  s     r$   Úsympy_index_symbol_with_prefixrÕ  “  s)   € ð ”T—Y‘YÒÐÐô �v˜s¨D¸dÔCÐCr@   c                óN   — | xs t         j                  xr t         j                  S rP   )r5   Údebug_index_assertsÚassert_indirect_indexing)Úchecks    r$   Úgenerate_assertrÚ  Ÿ  s   € ØÒ/”V×/Ñ/ÒT´V×5TÑ5TÐTr@   c                óF   — | d   dk7  sJ ‚t        j                  | dd¬«      S )rÏ  r   ÚsTrÐ  )rC   rÁ  ©r   s    r$   Úsympy_index_symbolrÞ  £  s)   € ð �‰7�cŠ>Ðˆ>ô �<‰<˜ d¸Ô=Ð=r@   c                ó®   — d„ }t        j                  | «      j                  |j                  «       D ��ci c]  \  }}| |||«      “Œ c}}«      S c c}}w )z²
    When the passed replacement symbol v is a string, it is converted to a symbol with name v that
    have the same replaced expression integer and nonnegative properties.
    c                ó¶   — t        | t        j                  «      sJ ‚t        |t        «      r,t        j                  || j
                  | j                  ¬«      S |S )NrÐ  )rB   rC   rÄ   rŸ   rÁ  r[   Úis_nonnegative)ÚreplacedÚreplacements     r$   Ú	to_symbolzsympy_subs.<locals>.to_symbolµ  sN   € Ü˜(¤E§J¡JÔ/Ð/Ð/Ü�k¤3Ô'Ü—<‘<ØØ ×+Ñ+Ø$×3Ñ3ôð ð Ðr@   )rC   rÅ   Úxreplacerœ  )rÅ  Úreplacementsrä  ÚkrL   s        r$   Ú
sympy_subsrè  ¯  sN   € ò	ô �=‰=˜Ó×'Ñ'Ø(4×(:Ñ(:Ó(<×=¡  1ˆ‰I�a˜‹OÑ	Ó=óð ùÛ=s   µA
c                óö   — t        | t        j                  «      xs^ t        | t        j                  «      xrB t	        d„ t        j                  | j                  «       | j                  «       «      D «       «      S )Nc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrP   ©Úis_symbolicr  s     r$   rl   zis_symbolic.<locals>.<genexpr>É  s   è ø€ ÒN 1”˜A—ÑNùó   ‚)	rB   r   ÚSymIntr  r	  r¸  r¹  rR  Ústride)r·   s    r$   rì  rì  Æ  sS   € Ü�aœŸ™Ó&ò Ü�1”e—l‘lÓ#ò 	OÜÑN¬	¯©¸¿¹»À!Ç(Á(Ã*Ó(MÔNÓNðr@   c                 ó&   — t        d„ | D «       «      S )Nc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrP   rë  r  s     r$   rl   z"any_is_symbolic.<locals>.<genexpr>Î  s   è ø€ Ò, !Œ{˜1�~Ñ,ùrí  ©r	  )rI   s    r$   Úany_is_symbolicró  Í  s   € ÜÑ, tÔ,Ó,Ð,r@   c                ó&  — ddl m} h d£}t        j                  «       r|j	                  h d£«       | j
                  j                  D ]G  }t        |j                  «      |v r|c S |j                  j                  d«      x}€Œ< ||«      sŒE|c S  y )Nr   )Úfree_unbacked_symbols>	   úaten._assert_scalarúaten._local_scalar_denseúaten.multinomial.defaultúfbgemm.dense_to_jagged.defaultú%fbgemm.jagged_to_padded_dense.defaultú,aten._fused_moving_avg_obs_fq_helper.defaultú7aten._fused_moving_avg_obs_fq_helper_functional.defaultÚrun_with_rng_stateÚrun_and_save_rng_state>   úaten.scatter.srcúaten.scatter_add_úaten.scatter.reduceúaten.index_put.defaultúaten.index_put_.defaultúaten.scatter_reduce.twoúaten.scatter_add.defaultúaten.scatter_reduce_.twoúaten.scatter.value_reduceúaten.scatter_reduce.two_outúaten._unsafe_index_put.defaultú0aten._unsafe_masked_index_put_accumulate.defaultrº  )Ú%torch.fx.experimental.symbolic_shapesrõ  r   Ú$are_deterministic_algorithms_enabledÚupdaterþ   r˜  rŸ   r  r¤   Úget)r.  rõ  Úforbidden_setr-  rº  s        r$   Ú%get_first_incompatible_cudagraph_noder  Ñ  s†   € ÝKò€Mô ×1Ñ1Ô3Ø×Ñòô	
ð  —‘—‘ò ˆÜˆt�{‰{Ó˜}Ñ,ØŠKØ—9‘9—=‘= Ó'Ð'ˆCÑ4Ñ9NÈsÕ9SØŠKð	ð
 r@   c                ó   — t        | «      d uS rP   )r  )r.  s    r$   Úhas_incompatible_cudagraph_opsr  ü  s   € Ü0°Ó4¸DÐ@Ð@r@   c                óŠ   — t        t        t        | j                  j                  «      «      «      }|j
                  dk(  sJ ‚|S )z$Get the output node from an FX graphr&  )ÚnextÚiterÚreversedrþ   r˜  r  )r.  Ú	last_nodes     r$   Úoutput_noder     s6   € ä”Tœ( 2§8¡8§>¡>Ó2Ó3Ó4€IØ�<‰<˜8Ò#Ð#Ð#ØÐr@   z	List[Any]Ú_registered_cachesc                óŽ   — t        | d«      rt        | j                  «      st        | › d�«      ‚t        j                  | «       | S )zq
    Use this decorator to register any caches that should be cache_clear'd
    with fresh_inductor_cache().
    Úcache_clearz# does not have a cache_clear method)rœ   Úcallabler  ÚAttributeErrorr  r"  ©rI  s    r$   Úclear_on_fresh_inductor_cacher  
  s?   € ô
 �3˜Ô&¬h°s·±Ô.GÜ ˜uÐ$GÐHÓIÐIä×Ñ˜cÔ"Ø€Jr@   c                 ó:   — t         D ]  } | j                  «        Œ y)z&
    Clear all registered caches.
    N)r  r  r  s    r$   Úclear_inductor_cachesr!    s   € ô "ò ˆØ�‰Õñr@   c              #  ó
  K  — t        «        t        j                  |¬«      }	 t        j                  j                  t        j                  d|i«      5  t        j                  d|«       t        j                  j                  |d«      }t        j                  j                  t        j                  d|i«      5  d–— t        | t
        «      r¨t        | «      dk(  sJ d«       ‚t        j                  j                  |«      rtt        j                  |«      }| j!                  |D �ci c]D  }d	|vr>|t        j                  j#                  t        j                  j                  ||«      «      “ŒF c}«       ddd«       ddd«       |rt%        j&                  |«       t        «        yc c}w # 1 sw Y   Œ8xY w# 1 sw Y   Œ<xY w# t(        $ r! t*        s	 t        j-                  d
|«       ‚ Y ŒQw xY w# t        «        w xY w­w)zÆ
    Contextmanager that provides a clean tmp cachedir for inductor.

    Optionally, pass a dict as 'cache_entries' to get a list of filenames and sizes
    generated with this cache instance.
    )ÚdirÚTORCHINDUCTOR_CACHE_DIRzUsing inductor cache dir %sÚtritonÚTRITON_CACHE_DIRNr   z!expected empty cache_entries dictz.lockz(on error, temporary cache dir kept at %s)r!  ÚtempfileÚmkdtempr   ÚpatchÚdictÚosÚenvironry   rz   Úpathr†  rB   r   ÚexistsÚlistdirr  ÚgetsizeÚshutilÚrmtreeÚ	ExceptionÚ_IS_WINDOWSÚwarning)Úcache_entriesr#  ÚdeleteÚinductor_cache_dirÚtriton_cache_dirÚfilesÚfs          r$   Úfresh_inductor_cacher<    s£  è ø€ ô Ôä!×)Ñ)¨cÔ2Ðð Ü�Z‰Z�_‰_Ü�J‰JÐ2Ð4FÐGó
ñ 	ô �I‰IÐ3Ð5GÔHÜ!Ÿw™wŸ|™|Ð,>ÀÓIÐÜ—‘—‘¤§¡Ð.@ÐBRÐ-SÓTñ ÛÜ˜m¬TÔ2Ü˜}Ó-°Ò2ÐWÐ4WÓWÐ2Ü—w‘w—~‘~Ð&6Ô7Ü "§
¡
Ð+;Ó <˜Ø%×,Ñ,ð */öà$%Ø#*°!Ñ#3ð !"¤2§7¡7§?¡?´2·7±7·<±<Ð@PÐRSÓ3TÓ#UÑ Uòô÷÷	ñ$ Ü�M‰MÐ,Ô-ô 	Õùò#÷ð ú÷	ð 	ûô( ò Ýðô �K‰KÐBÐDVÔWØñ ðûô 	Õüsy   ‚!H¤0G ÁA'F;Â;A-F/Ä(A	F*Å1F/Å8F;Æ G ÆHÆ*F/Æ/F8	Æ4F;Æ;GÇ G Ç'G1Ç.G4 Ç0G1Ç1G4 Ç4H È Hc           	     ó‚   — | j                   }t        t        | «      «      }t        t	        t        ||d¬«      «      «      S )NT)rò   Úreverse)Ú__getitem__rq   r   rñ   r  rZ  )ÚseqÚgetterÚa_rs      r$   ÚargsortrC  J  s1   € à�_‰_€FÜ
”�C“‹/€CÜ”œ ¨¸Ô>Ó?Ó@Ð@r@   c                óL   — t        j                  d| ¬«      j                  «       S )Nr]   ©r_   )r   rn   Úelement_sizerE  s    r$   Úget_dtype_sizerG  Q  s   € ä�;‰;�r Ô'×4Ñ4Ó6Ð6r@   c                  ó   — e Zd ZU ded<   y)ÚLineContextr   ÚcontextN)rV   rW   rX   Ú__annotations__r]   r@   r$   rI  rI  V  s   … Ø„Lr@   rI  c                  óˆ   — e Zd ZdZdd„Zdd„Zdd„Zdd„Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zdd„Zdd„Zdd„Zdd„Zdd„Zd„ Zd„ Zy)ÚIndentedBufferé   c                ó    — g | _         || _        y rP   )Ú_linesÚ_indent)rc  Úinitial_indents     r$   Ú__init__zIndentedBuffer.__init__]  s   € ØˆŒØ%ˆ�r@   c                óŠ  — t        «       }d}g }| j                  D ]•  }t        |t        «      r
 |«       }|€/Œt        |t        «      r|j                  ||j                  f«       ŒKt        |t        «      sJ ‚|j                  |«       |j                  d«       |d|j                  d«      z   z  }Œ— |j                  «       |fS )Nr   r•  )r   rP  rB   ÚDeferredLineBaserI  r"  rJ  rŸ   ÚwriteÚcountÚgetvalue)rc  ÚbufrŽ   ÚlinemapÚlines        r$   Úgetvaluewithlinemapz"IndentedBuffer.getvaluewithlinemapa  s³   € Ü‹jˆØˆØˆØ—K‘Kò 	&ˆDÜ˜$Ô 0Ô1Ù“v�Ø�<ØÜ˜D¤+Ô.Ø—‘  4§<¡<Ð0Ô1ØÜ˜d¤CÔ(Ð(Ð(Ø�I‰I�dŒOØ�I‰I�dŒOØ��T—Z‘Z Ó%Ñ%Ñ%‰Að	&ð �|‰|‹~˜wÐ&Ð&r@   c                ó,   — | j                  «       \  }}|S rP   )r\  )rc  rL   rŠ   s      r$   rX  zIndentedBuffer.getvalues  s   € Ø×'Ñ'Ó)‰ˆˆ1Øˆr@   c                ób  — t        «       }| j                  D ]‡  }t        |t        «      r
 |«       }|€Œt        |t        «      rŒ.t        |t
        «      sJ ‚|j                  d«      r|j                  |d d «       Œf|j                  |«       |j                  d«       Œ‰ |j                  «       S )Nú\re   r•  )	r   rP  rB   rU  rI  rŸ   ÚendswithrV  rX  )rc  rY  r[  s      r$   ÚgetrawvaluezIndentedBuffer.getrawvaluew  s•   € Ü‹jˆØ—K‘Kò 	 ˆDÜ˜$Ô 0Ô1Ù“v�Ø�<ØÜ˜D¤+Ô.ØÜ˜d¤CÔ(Ð(Ð(à�}‰}˜TÔ"Ø—	‘	˜$˜s ˜)Õ$à—	‘	˜$”Ø—	‘	˜$•ð	 ð �|‰|‹~Ðr@   c                ó8   — | j                   j                  «        y rP   )rP  Úclearrb  s    r$   rc  zIndentedBuffer.clear‰  s   € Ø�‰×ÑÕr@   c                ó,   — t        | j                  «      S rP   )rË   rP  rb  s    r$   Ú__bool__zIndentedBuffer.__bool__Œ  s   € Ü�D—K‘KÓ Ð r@   c                ó:   — d| j                   | j                  z  z  S )Nr“  )rQ  Útabwidthrb  s    r$   rÔ  zIndentedBuffer.prefix�  s   € Ø�d—l‘l T§]¡]Ñ2Ñ3Ð3r@   c                ó&   — | j                  d«       y )Nr•  ©Ú	writelinerb  s    r$   ÚnewlinezIndentedBuffer.newline’  s   € Ø�‰�tÕr@   c                ó   — t        |t        «      r| j                  j                  |«       y t        |t        «      r9| j                  j                  |j                  | j                  «       «      «       y |j                  «       r.| j                  j                  | j                  «       › |› �«       y | j                  j                  d«       y ©Nrx  )rB   rI  rP  r"  rU  Úwith_prefixrÔ  Ústrip©rc  r[  s     r$   rj  zIndentedBuffer.writeline•  sˆ   € Ü�dœKÔ(Ø�K‰K×Ñ˜tÕ$Ü˜Ô.Ô/Ø�K‰K×Ñ˜t×/Ñ/°·±³Ó>Õ?Ø�Z‰ZŒ\Ø�K‰K×Ñ $§+¡+£- °°Ð7Õ8à�K‰K×Ñ˜rÕ"r@   c                ó4   — |D ]  }| j                  |«       Œ y rP   ri  )rc  Úlinesr[  s      r$   Ú
writelineszIndentedBuffer.writelinesŸ  s   € Øò 	!ˆDØ�N‰N˜4Õ ñ	!r@   c                óF   ‡ ‡— t         j                  ˆˆ fd„«       } |«       S )Nc               3  ó    •K  — ‰xj                   ‰ z  c_         	 d –— ‰xj                   ‰ z  c_         y # ‰xj                   ‰ z  c_         w xY w­wrP   ©rQ  )Úoffsetrc  s   €€r$   Úctxz"IndentedBuffer.indent.<locals>.ctx¤  s9   øè ø€ à�LŠL˜FÑ"�Lð'Ûà—’ Ñ&–ø�—’ Ñ&–üs   ƒAš4 žA´AÁA)Ú
contextlibÚcontextmanager)rc  rw  rx  s   `` r$   ÚindentzIndentedBuffer.indent£  s$   ù€ Ü	×	"Ñ	"ô	'ó 
#ð	'ñ ‹uˆr@   c                ó.   — | xj                   |z  c_         y rP   rv  ©rc  rw  s     r$   Ú	do_indentzIndentedBuffer.do_indent®  ó   € Ø�Š˜ÑŽr@   c                ó.   — | xj                   |z  c_         y rP   rv  r}  s     r$   Údo_unindentzIndentedBuffer.do_unindent±  r  r@   c           	     ó’  — t        |t        «      rÖt        d«      }|j                  D ]E  }t        |t        «      rŒ|sŒt        |t        |«      t        |j                  «       «      z
  «      }ŒG t        j                  |«      rd}|j                  D ]P  }t        |t        «      r| j                  j                  |«       Œ/t        j                  | |t        |«      d  «       ŒR y t        j                  |«      }|r|j                  «       }|sy |j                  «       }|j!                  d«      D ]  }| j                  |«       Œ y )NÚinfr   r•  )rB   rM  ÚfloatrP  rI  Úminr   ÚlstripÚmathÚisinfr"  rj  rQ   ÚtextwrapÚdedentÚrstriprð   )rc  Ú
other_codero  rŠ  r[  s        r$   ÚsplicezIndentedBuffer.splice´  s  € Ü�j¤.Ô1Ü˜5“\ˆFØ"×)Ñ)ò I�Ü! $¬Õ4ºÜ  ¬¨T«´S¸¿¹»Ó5GÑ)GÓH‘FðIô �z‰z˜&Ô!Ø�Ø"×)Ñ)ò H�Ü˜d¤KÔ0Ø—K‘K×&Ñ& tÕ,ä"×,Ñ,¨T°4¼¸F»¸Ð3FÕGñ	Hô "Ÿ™¨Ó4ˆJÙØ'×.Ñ.Ó0�
ÙØØ#×*Ñ*Ó,ˆJØ"×(Ñ(¨Ó.ò %�Ø—‘˜tÕ$ñ%r@   c                ó†   — t        | j                  ¬«      }| j                  D �cg c]
  } ||«      ‘Œ c}|_        |S c c}w ©N)rR  )rM  rQ  rP  )rc  rÄ  r“   r[  s       r$   rG   zIndentedBuffer.mapË  s4   € Ü¨D¯L©LÔ9ˆØ-1¯[©[Ö9 T‘d˜4•jÒ9ˆŒ
Øˆ
ùò :s   ¥>c                ó@   — t        | «      › d| j                  «       › d�S )Nr¿  rÀ  )r§   rX  rb  s    r$   Ú__repr__zIndentedBuffer.__repr__Ð  s    € Ü�t“*�˜Q˜tŸ}™}›Ð/¨qÐ1Ð1r@   c                óÔ   — | j                   |j                   k(  sJ ‚t        | j                   ¬«      }|j                  | j                  «       |j                  |j                  «       |S r�  )rQ  rM  rs  rP  )rc  Úotherr“   s      r$   Ú__add__zIndentedBuffer.__add__Ó  sK   € Ø�|‰|˜uŸ}™}Ò,Ð,Ð,Ü¨D¯L©LÔ9ˆØ�‰�t—{‘{Ô#Ø�‰�u—|‘|Ô$Øˆ
r@   N)r   )ri  z)tuple[str, list[tuple[int, LineContext]]])ri  rŸ   rN   ©F)rÄ  zCallable[[Any], Any]ri  rM  )rV   rW   rX   rg  rS  r\  rX  ra  rc  re  rÔ  rk  rj  rs  r{  r~  r�  r�  rG   r‘  r”  r]   r@   r$   rM  rM  Z  s\   „ Ø€Hó&ó'ó$óò$ò!ò4òò#ò!ó	óóó%ó.ò
2ór@   rM  c                  ó&   ‡ — e Zd Zdˆ fd„Zd„ Zˆ xZS )ÚFakeIndentedBufferc                ó"   •— t         ‰| �  «        y rP   )ÚsuperrS  )rc  Ú	__class__s    €r$   rS  zFakeIndentedBuffer.__init__Ü  s   ø€ Ü‰ÑÕr@   c                óV   — |dk(  rt         j                  | |«      S t        d|› d�«      ‚)Nrš  zTried to call self.zÊ on FakeIndentedBuffer. This bufferis currently used on TritonTemplateKernel to prevent actualwrites to the body without explicitly specifying the body with`TritonTemplateKernel.set_subgraph_body(name)`)ÚobjectÚ__getattribute__r€   )rc  r   s     r$   r�  z#FakeIndentedBuffer.__getattribute__ß  s;   € Ø�;ÒÜ×*Ñ*¨4°Ó6Ð6ÜØ! $ ð (=ð =ó
ð 	
r@   rh  )rV   rW   rX   rS  r�  Ú__classcell__)rš  s   @r$   r—  r—  Û  s   ø„ õö
r@   r—  c              #  óx   K  — 	 d –— | t         _        |t         _        y # | t         _        |t         _        w xY w­wrP   )ÚsysÚstdoutÚstderr)Úinitial_stdoutÚinitial_stderrs     r$   Úrestore_stdout_stderrr¥  ê  s-   è ø€ ð$Ûà#ŒŒ
Ø#Œ�
øð $ŒŒ
Ø#Œ�
üs   ‚:„ ˆ:Ÿ7·:c                  óD   — e Zd ZdZd„ Zdd„Zdd„Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zy
)rU  z.A line that can be 'unwritten' at a later timec                ó6   — |j                  «       sd}|| _        y rm  )ro  r[  rp  s     r$   rS  zDeferredLineBase.__init__ö  s   € Ø�z‰zŒ|ØˆDØˆ�	r@   c                ó   — t         ‚)zJReturns either self.line or None to indicate the line has been 'unwritten'©r…  rb  s    r$   rg  zDeferredLineBase.__call__û  ó   € ä!Ð!r@   c                ó   — t         ‚)z3Returns a new deferred line with the same conditionr©  rp  s     r$   Ú	_new_linezDeferredLineBase._new_lineÿ  rª  r@   c                ó@   — | j                  |› | j                  › �«      S rP   ©r¬  r[  )rc  rÔ  s     r$   rn  zDeferredLineBase.with_prefix  s   € Ø�~‰~  ¨¯©¨Ð4Ó5Ð5r@   c                óT   — | j                  | j                  j                  «       «      S rP   )r¬  r[  r†  rb  s    r$   r†  zDeferredLineBase.lstrip  s   € Ø�~‰~˜dŸi™i×.Ñ.Ó0Ó1Ð1r@   c                ó>   — | j                  | j                  |   «      S rP   r®  )rc  r¥   s     r$   r?  zDeferredLineBase.__getitem__	  s   € Ø�~‰~˜dŸi™i¨Ñ.Ó/Ð/r@   c                ó,   — t        | j                  «      S rP   )rË   r[  rb  s    r$   re  zDeferredLineBase.__bool__  s   € Ü�D—I‘I‹Ðr@   c                ó,   — t        | j                  «      S rP   )r   r[  rb  s    r$   Ú__len__zDeferredLineBase.__len__  s   € Ü�4—9‘9‹~Ðr@   N)ri  zOptional[str])r[  rŸ   ri  rU  )rV   rW   rX   rY   rS  rg  r¬  rn  r†  r?  re  r³  r]   r@   r$   rU  rU  ó  s-   „ Ù8òó
"ó"ò6ò2ò0òór@   rU  c                óš   — d}t         j                  j                  | «      j                  }||k  rt        j                  d||dœ¬«       yy)NéD   z,Not enough SMs to use max_autotune_gemm mode)Úmin_smsÚ	avail_sms)ÚextraFT)r   r   Úget_device_propertiesÚmulti_processor_country   r5  )r¥   r¶  r·  s      r$   Ú
is_big_gpur»    sM   € à€GÜ—
‘
×0Ñ0°Ó7×MÑM€IØ�7ÒÜ�‰Ø:Ø%°IÑ>ð 	ô 	
ð Ør@   c                 óF   — t         j                  xs t         j                  S rP   )r5   Úmax_autotuneÚmax_autotune_gemmr]   r@   r$   Úuse_max_autotuner¿     s   € Ü×ÑÒ:¤&×":Ñ":Ð:r@   c                ó¶   — t        «       xrN | j                  j                  dk(  xr3 | j                  |v xr# t	        | j                  j
                  xs d«      S )Nr   r   )r¿  r`   r§   r_   r»  r¥   )ÚlayoutÚallowed_layout_dtypess     r$   Ú_use_template_for_cudarÃ  $  sT   € äÓò 	1Ø�M‰M×Ñ &Ñ(ò	1à�L‰LÐ1Ð1ò	1ô �v—}‘}×*Ñ*Ò/¨aÓ0ð	r@   c                ó¾   — | j                  «       t        j                  j                  «       j                  d«      D �cg c]  }|j	                  «       ‘Œ c}v S c c}w ©Nú,)Úupperr5   Úmax_autotune_gemm_backendsrð   ro  ©Úbackendr!   s     r$   Ú_use_autotune_backendrË  -  óM   € Ø�=‰=‹?Ü!×<Ñ<×BÑBÓD×JÑJÈ3ÓOöØˆ�‰�	òð ð ùò ó   ¿Ac                ó¾   — | j                  «       t        j                  j                  «       j                  d«      D �cg c]  }|j	                  «       ‘Œ c}v S c c}w rÅ  )rÇ  r5   Úmax_autotune_conv_backendsrð   ro  rÉ  s     r$   Ú_use_conv_autotune_backendrÐ  3  rÌ  rÍ  F)Úenable_int32Úenable_float8c               óÂ  — ddl m}m} t        j                  t        j
                  t        j                  g}|r>t        j                  t        j
                  t        j                  t        j                  g}|r/|j                  t        j                  t        j                  g«       t        | |«      xr* t        d«      xr  || j                  |j                  «      S )Nr   )ÚBackendFeatureÚhas_backend_featureÚTRITON)Úcodegen.commonrÔ  rÕ  r   r×   rÙ   rÛ   rã   ÚextendrÕ   rÖ   rÃ  rË  r`   ÚTRITON_TEMPLATES)rÁ  rÑ  rÒ  rÔ  rÕ  Úlayout_dtypess         r$   Úuse_triton_templaterÛ  9  s—   € ßCä—]‘]¤E§N¡N´E·M±MÐB€MÙÜŸ™¬¯©¼¿¹ÄuÇ{Á{ÐSˆÙØ×Ñœe×1Ñ1´5×3DÑ3DÐEÔFä˜v }Ó5ò 	PÜ! (Ó+ò	Pá §¡¨~×/NÑ/NÓOðr@   c                óà  — ddl m} |j                  j                  j	                  ||z  |z  d¬«      }|dk  s|t
        j                  j                  k  ryddlm	} t        j                  j                  ryt        j                  t        j                  t        j                  t        j                   g}t#        | |«      xr t%        d«      }|r |«       st&        j)                  d	«       y|S )
Nr   rú   re   ©Úfallbackr   F)Útry_import_cutlassÚCUTLASSzˆFailed to import CUTLASS lib. Please check whether _inductor.config.cuda.cutlass_dir is set correctly. Skipping CUTLASS backend for now.)rý   rû   rþ   rÿ   Ú	size_hintr5   r   Úcutlass_backend_min_gemm_sizeÚcodegen.cuda.cutlass_utilsrß  r   ÚversionÚhipr×   rÙ   rÛ   rã   rÃ  rË  ry   r5  )	rÁ  Úmr,  rç  rû   Ú	gemm_sizerß  rÚ  r“   s	            r$   Úuse_cutlass_templaterè  H  s¼   € Ýà—‘× Ñ ×*Ñ*¨1¨q©5°1©9¸rÐ*ÓB€IØ�A‚~˜¤V§[¡[×%NÑ%NÒNØÝ>ô ‡}�}×ÒØä—]‘]¤E§N¡N´E·M±MÄ5Ç;Á;ÐO€MÜ
  ¨Ó
7ò Ô<QØó=€Cñ Ù!Ô#Ü�K‰Kð4ôð
 Ø€Jr@   c                óT   — t         j                  j                  | «      j                  S rP   )r   r   r¹  ÚgcnArchName©r`   s    r$   Ú_rocm_native_device_arch_namerì  d  s   € ä�:‰:×+Ñ+¨FÓ3×?Ñ?Ð?r@   c                 óÈ   — 	 dd l } ddlm}m} ddlm} t        j                  j                  | j                  «      }||||fS # t        $ r d„ }d„ } G d„ d«      }d }Y Œ#w xY w)Nr   )Úgen_ops_libraryÚgen_ops_preselected)ÚCKGemmOperationc                 ó   — g S rP   r]   r]   r@   r$   rî  z*try_import_ck_lib.<locals>.gen_ops_libraryx  ó   € ØˆIr@   c                 ó   — g S rP   r]   r]   r@   r$   rï  z.try_import_ck_lib.<locals>.gen_ops_preselected{  rò  r@   c                  ó   — e Zd Zy)ú*try_import_ck_lib.<locals>.CKGemmOperationN)rV   rW   rX   r]   r@   r$   rð  rõ  ~  s   „ Ør@   rð  )Úck4inductorÚ(ck4inductor.universal_gemm.gen_instancesrî  rï  Úck4inductor.universal_gemm.oprð  r+  r-  ÚdirnameÚ__file__rž   )rö  rî  rï  rð  Úpackage_dirnames        r$   Útry_import_ck_librü  i  sl   € ðÛ÷	
õ	
ô Ÿ'™'Ÿ/™/¨+×*>Ñ*>Ó?ˆð ˜OÐ-@À/ÐQÐQøô ò ò	ò	÷	ñ 	ð Šðús   ‚;A ÁA!Á A!c                óÜ  — t        «       syt        d«      syt        j                  j                  sy| j
                  j                  dk(  syt        | j
                  «      }t        j                  j                  D �ci c]  }|j                  d«      d   |“Œ c}xs |j                  d«      d   |i}|j                  «       t        j                  j                  z  D �cg c]  }||   ‘Œ	 }}|sy| j                  t        j                  t        j                   fvryddlm} |j&                  j(                  j+                  ||z  z  d¬	«      }|dk  ryt-        «       \  }	}
}
}
|	st.        j1                  d
«       yt        j                  j2                  st.        j1                  d«       y|	t        j                  j2                  k7  rt.        j1                  d«       yyc c}w c c}w )NFÚCKr   ú:r   r   rú   re   rÝ  z,Please pip install Composable Kernel packagez,Please set TORCHINDUCTOR_CK_DIR env variablezInvalid path to CK libraryT)r¿  rË  r   rä  rå  r`   r§   rì  r5   ÚrocmÚarchrð   r›  Úck_supported_archr_   r×   rÙ   rý   rû   rþ   rÿ   rá  rü  ry   r5  Úck_dir)rÁ  ræ  r,  rç  Únative_archÚrequested_archsÚrequested_supported_archsrû   rç  Úck_package_dirnamerŠ   s              r$   Úuse_ck_templater  …  s¢  € äÔØä  Ô&Øä�=‰=×ÒØà�=‰=×Ñ Ò'Øô 0°·±Ó>€KÜ39·;±;×3CÑ3CÖD¨a�q—w‘w˜s“| A‘¨Ñ)ÒDò Ø×Ñ˜#Ó˜qÑ! ;ðI€Oð
 !×%Ñ%Ó'¬&¯+©+×*GÑ*GÑGö!àð 	˜Óð!Ðð !ñ %Øà‡|�|œEŸM™M¬5¯>©>Ð:Ñ:Øõ à—‘× Ñ ×*Ñ*¨1¨q©5°1©9¸rÐ*ÓB€IØ�A‚~Øô #4Ó"5ÑÐ˜˜1˜aáÜ�‰ÐBÔCØä�;‰;×ÒÜ�‰ÐBÔCØàœVŸ[™[×/Ñ/Ò/Ü�‰Ð0Ô1ØàùòG Eùò!s   Á>G$Ã"G)c                óL   — t        «       xr | j                  j                  dk(  S r1  )r¿  r`   r§   )rÁ  s    r$   Ú_use_template_for_cpur
  »  s   € ÜÓÒ= &§-¡-×"4Ñ"4¸Ñ"=Ð=r@   c                ó.  — ddl m} ddlm} ddlm} ddlm} t        | «      rt        d«      syt        j                  j                  sy|j                  «       t        j                  k(  }t        j                   t        j"                  t        j$                  t        j                  g}	 ||||r| j&                  nd |¬«      \  }
}}} }}t)        ||f«      ryt+        ||j,                  «      r|j/                  «       } ||j                  «       «      \  }} |d	|
|||j                  «       |j                  «       |t1        «       ¬
«      }d„ }| j&                  |	v xr8 |d uxr2  ||«      xr( t+        ||j2                  «      xr |j5                  «       S )Nr   rv  )Úcreate_micro_gemm)Ú*get_gemm_template_output_and_compute_dtype)Úmm_argsÚCPPF)Ú	out_dtypeÚmat2_transposedÚ
micro_gemm)Úinput_dtypeÚinput2_dtypeÚoutput_dtypeÚnum_threadsc                óN   — | j                  «        | j                  «       d   dk(  S )Nre   r   )Úfreeze_layoutÚ
get_stride©r!   s    r$   Úis_last_dim_stride1z9use_cpp_packed_gemm_template.<locals>.is_last_dim_stride1æ  s"   € Ø	�‰ÔØ�|‰|‹~˜bÑ! QÑ&Ð&r@   )rx  rw  Úcodegen.cpp_micro_gemmr  Úcodegen.cpp_utilsr  Úkernel.mm_commonr  r
  rË  r5   ÚcppÚweight_prepackÚ	get_dtyper   rç   rÛ   rÙ   Úhalfr_   Úhas_free_symbolsrB   ÚBaseViewÚunwrap_viewÚparallel_num_threadsr´  Úis_module_buffer)rÁ  Úmat1Úmat2r  rw  r  r  r  Ú	int8_gemmrÚ  ræ  r,  rç  r  rŠ   r  r  s                    r$   Úuse_cpp_packed_gemm_templater+  ¿  s^  € ÝÝ9ÝMÝ)ä  Ô(Ô0EÀeÔ0LØä�:‰:×$Ò$Øà—‘Ó ¤E§K¡KÑ/€IÜ—]‘]¤E§N¡N´E·J±JÄÇÁÐL€MÙ")ØØÙ"+�&—,’,°Ø'ô	#Ñ€A€qˆ!ˆV�T˜4ô ˜˜A˜ÔØÜ�$˜Ÿ™Ô$Ø×ÑÓ!ˆá@ÀÇÁÓAQÓR�O€L�!Ù"ØØ	Ø	Ø	Ø—N‘NÓ$Ø—^‘^Ó%Ø!Ü(Ó*ô	€Jò'ð
 	�‰˜Ð%ò 	$Ø˜dÐ"ò	$á Ó%ò	$ô �t˜RŸ]™]Ó+ò	$ð ×!Ñ!Ó#ðr@   c                 ó2   — t        «        xs t        d«      S )NÚATEN)r¿  rË  r]   r@   r$   Úuse_aten_gemm_kernelsr.  ó  s   € ÜÓ!Ð!ÒBÔ%:¸6Ó%BÐBr@   c                  óP   — e Zd ZU  ej                  d«      Zded<   dd„Zd„ Zd„ Z	y)	ÚDebugDirManagerr   rŸ   Úprev_debug_namec                ó@   — t        t        j                  «      | _        y rP   )r  r0  Úcounterr¿   rb  s    r$   rS  zDebugDirManager.__init__û  s   € Ü”×.Ñ.Ó/ˆ�r@   c                óè   — t         j                  j                  j                  | _        | j                  › d| j
                  › �| _        | j                  t         j                  j                  _        y )NÚ_tmp_)r   Ú_dynamor5   Údebug_dir_rootr1  r¿   Únew_namerb  s    r$   Ú	__enter__zDebugDirManager.__enter__þ  sM   € Ü$Ÿ}™}×3Ñ3×BÑBˆÔØ×/Ñ/Ð0°°d·g±g°YÐ?ˆŒØ.2¯m©mŒ�‰×ÑÕ+r@   c                ó”   — t        j                  | j                  «       | j                  t        j
                  j                  _        y rP   )r1  r2  r8  r1  r   r6  r5   r7  )rc  rI   s     r$   Ú__exit__zDebugDirManager.__exit__  s*   € Ü�‰�d—m‘mÔ$Ø.2×.BÑ.BŒ�‰×ÑÕ+r@   Nrh  )
rV   rW   rX   r¸  rW  r3  rK  rS  r9  r;  r]   r@   r$   r0  r0  ÷  s(   … Øˆi�o‰o˜aÓ €GØÓó0ò<ó
Cr@   r0  c                óæ   ‡— ddl m} g Šdˆfd„}t        j                  j	                  |d|«      5  t
        j                  j                  «         | |i |¤Ž}d d d «       |‰fS # 1 sw Y   ‰fS xY w)Nr   ©ÚGraphLoweringc                ó(   •— ‰j                  | «       y rP   ©r"  ©ÚcodeÚsource_codess    €r$   Úsave_output_codez*run_and_get_code.<locals>.save_output_code  ó   ø€ Ø×Ñ˜DÕ!r@   rD  ©rB  rŸ   ©rþ   r>  r   r)  rœ  r   r6  Úreset)r„   rI   r(  r>  rD  r:  rC  s         @r$   Úrun_and_get_coderI    ss   ø€ Ý$à €Lõ"ô 
�‰×	Ñ	˜=Ð*<Ð>NÓ	Oñ %Ü�‰×ÑÔÙ�TÐ$˜VÑ$ˆ÷%ð �<ÐÐ÷%ð �<ÐÐús   ±'A$Á$A0c                ó$   ‡ — ˆ fd„}t        |«      S )Nc                 óR   •—  ‰«       } | j                  «       j                  «        | S rP   )rƒ   Úbackward)r:  r„   s    €r$   Úrun_with_backwardz1run_fw_bw_and_get_code.<locals>.run_with_backward  s!   ø€ Ù“ˆØ�
‰
‹×ÑÔØˆr@   )rI  )r„   rM  s   ` r$   Úrun_fw_bw_and_get_coderN    s   ø€ ôô
 Ð-Ó.Ð.r@   c                óX  ‡‡— ddl m} g Šdˆfd„Šd	ˆfd„}t        j                  j	                  |d|«      5  t        j                  j	                  |d‰«      5  t
        j                  j                  «         | |i |¤Ž}ddd«       ddd«       ‰S # 1 sw Y   ŒxY w# 1 sw Y   ‰S xY w)
zLGet the inductor-generated code, but skip any actual compilation or running.r   r=  c                ó(   •— ‰j                  | «       y rP   r@  rA  s    €r$   rD  z"get_code.<locals>.save_output_code%  rE  r@   c                ó”   •—  G d„ d«      }| j                   r| j                  «       n| j                  «       \  }} ‰|«        |«       S )Nc                  ó   — e Zd ZdZdd„Zd„ Zy)ú@get_code.<locals>.patched_compile_to_module.<locals>.DummyModulez4This is empty to replace the generated triton modulec                 ó   — y rP   r]   rb  s    r$   rS  zIget_code.<locals>.patched_compile_to_module.<locals>.DummyModule.__init__,  s   € Ør@   c                 ó   — y rP   r]   rf  s      r$   ÚcallzEget_code.<locals>.patched_compile_to_module.<locals>.DummyModule.call/  s   € àr@   Nrh  )rV   rW   rX   rY   rS  rV  r]   r@   r$   ÚDummyModulerS  )  s   „ ÙFóór@   rW  )Úcpp_wrapperÚcodegen_with_cpp_wrapperÚcodegen)rc  rW  rB  rŠ   rD  s       €r$   Úpatched_compile_to_modulez+get_code.<locals>.patched_compile_to_module(  sF   ø€ ÷	ñ 	ð 04×/?Ò/?ˆD×)Ñ)Ô+ÀTÇ\Á\Ã^ñ 	ˆˆañ
 	˜Ôá‹}Ðr@   Úcompile_to_modulerD  NrF  )rc  r>  rG  )r„   rI   r(  r>  r[  rŠ   rD  rC  s         @@r$   Úget_coder]    s    ù€ å$à €Lõ"õô( 
�‰×	Ñ	ØÐ*Ð,Eó
ñ  ä‡z�z×Ñ˜Ð(:Ð<LÓMñ ô 	�‰×ÑÔá�Ð˜Ñˆ÷ ÷  ð Ð÷ ð  ú÷  ð Ðús#   ¸"BÁ'BÂBÂB	ÂBÂB)c                ó|   — t        | g|¢­i |¤Ž}dt        |«      cxk  rdk  sn J dt        |«      › �«       ‚|d   S ©Nr   é   z%expected one or two code outputs got r   )r]  r   )r„   rI   r(  rC  s       r$   Úget_triton_codera  F  sS   € Ü˜BÐ0 Ò0¨Ñ0€Lð 	
ŒS�ÓÔ# !Ô#ðCà	.¬s°<Ó/@Ð.AÐBóCØ#à˜‰?Ðr@   c                ó‚   — t        | g|¢­i |¤Ž\  }}dt        |«      cxk  rdk  sn J dt        |«      › �«       ‚|d   S r_  )rI  r   )r„   rI   r(  rŠ   rC  s        r$   Úrun_and_get_triton_coderc  O  sW   € Ü& rÐ;¨DÒ;°FÑ;�O€A€|ð 	
ŒS�ÓÔ# !Ô#ðCà	.¬s°<Ó/@Ð.AÐBóCØ#à˜‰?Ðr@   c                óÔ   ‡‡‡— ddl m} ddlmŠ |j                  Šg Šˆˆˆfd„}t
        j                  j                  |d|«      5   | |i |¤Ž}d d d «       |‰fS # 1 sw Y   ‰fS xY w)Nr   )ÚCompiledFxGraphr=  c                 ó^   •—  ‰| i |¤Ž | d   }t        |‰«      sJ ‚‰j                  |«       y )Nr`  )rB   r"  )rI   r(  rþ   r>  Úgraph_loweringsÚ	real_inits      €€€r$   Ú	fake_initz-run_and_get_graph_lowering.<locals>.fake_init_  s7   ø€ Ù�4Ð"˜6Ò"Ø�Q‘ˆÜ˜% Ô/Ð/Ð/Ø×Ñ˜uÕ%r@   rS  )Útorch._inductor.codecachere  Útorch._inductor.graphr>  rS  r   r)  rœ  )	r„   rI   r(  re  ri  r:  r>  rg  rh  s	         @@@r$   Úrun_and_get_graph_loweringrl  X  so   ú€ Ý9Ý3à×(Ñ(€IØ€Oö&ô 
�‰×	Ñ	˜?¨J¸	Ó	Bñ %Ù�TÐ$˜VÑ$ˆ÷%ð �?Ð"Ð"÷%ð �?Ð"Ð"ús   Á	AÁA'c              #  óÌ   K  — ddl m} |j                  |    }	 t        j                  ||«      |j                  | <   d–— ||j                  | <   y# ||j                  | <   w xY w­w)z
    Override the lowering of aten_op with override_fn.
    The first argument of override_fn is the original lowering fn.
    r   )ÚloweringN)Útorch._inductorrn  Ú	loweringsr¯   Úpartial)Úaten_opÚoverride_fnrn  Úorig_fns       r$   Úoverride_loweringru  k  s`   è ø€ õ )à× Ñ  Ñ)€Gð.Ü&/×&7Ñ&7¸ÀWÓ&Mˆ×Ñ˜7Ñ#Ûà&-ˆ×Ñ˜7Ò#ø gˆ×Ñ˜7Ò#üs   ‚A$™'A Á A$ÁA!Á!A$c                ó�   ‡ ‡‡— ddl m} |j                  Šˆˆˆ fd„}t        j                  j
                  j                  |d|«      S )zr
    Add hook functions to be called at the beginning and end of Scheduler.__init__.
    Used for unit tests.
    r   )Ú	Schedulerc                óB   •—  ‰| |«        ‰| |«      }‰r	 ‰| |«       |S rP   r]   )Ú	schedulerr˜  Úoutrt  Úpost_fnÚpre_fns      €€€r$   rp  z(add_scheduler_init_hook.<locals>.wrapper„  s+   ø€ Ùˆy˜%Ô Ù�i Ó'ˆÙÙ�I˜uÔ%Øˆ
r@   rS  )Útorch._inductor.schedulerrw  rS  Úunittestr   r)  rœ  )r|  r{  rw  rp  rt  s   ``  @r$   Úadd_scheduler_init_hookr  {  s9   ú€ õ
 4à× Ñ €Göô �=‰=×Ñ×%Ñ% i°¸WÓEÐEr@   c                óz   — t         j                  rt        j                  | «       yt        j	                  | «       y)z·
    Warnings that will be actionable for PyTorch developers, but not
    end users.  Allows us to easily disable them in stable releases but
    keep them on for nightly builds.
    N)r5   Údeveloper_warningsry   r5  Úinfo)Úmsgs    r$   Údeveloper_warningr„  Ž  s$   € ô × Ò Ü�‰�CÕä�‰��r@   c                 ó´  — 	 t         j                  j                  d«      } | dz   t        t         j                  «      k  rTt        t         j                  | dz      «      dkD  r2t         j                  | dz      d   dk7  rt         j                  | dz      S t         j                  D ]#  }|j                  d«      sŒ|t        d«      d c S  y# t        $ r Y ŒBw xY w)a  
    An experimental API used only when config.benchmark_kernel is true.

    The benchmark name is only available at codegen time. So we can not
    directly call it in benchmark_all_kernels which is run after codegen.

    The function assumes the argument after --only is the benchmark name.
    It works for torchbench.py/hugginface.py/timm_models.py. But for ad-hoc
    scripts, this function may return None.

    There are 2 flavors of --only argument we need handle:
    1. --only model_name
    2. --only=model_name
    z--onlyr   r   ú-z--only=N)r   Úargvr¥   r   Ú
ValueErrorÚ
startswith)r£  r  s     r$   Úget_benchmark_namerŠ  š  s»   € ð	Ü�h‰h�n‰n˜XÓ&ˆà�!‰G”cœ#Ÿ(™(“mÒ#Ü”C—H‘H˜S 1™WÑ%Ó&¨Ò*Ü—‘˜˜q™Ñ! !Ñ$¨Ò+ä—8‘8˜C !™GÑ$Ð$ô �x‰xò )ˆØ�>‰>˜)Õ$Ø”s˜9“~Ð'Ð(Ò(ñ)øô ò Ùðús   ‚BC Ã	CÃCc                ó&   — t        d„ | D «       «      S )Nc              3  ó&   K  — | ]	  }|d k(  –— Œ y­w©r   Nr]   r  s     r$   rl   zis_ones.<locals>.<genexpr>º  ó   è ø€ Ò%˜!ˆq�A�vÑ%ùó   ‚©rF   ©rœ  s    r$   Úis_onesr’  ¹  ó   € ÜÑ%˜uÔ%Ó%Ð%r@   c                ó&   — t        d„ | D «       «      S )Nc              3  ó&   K  — | ]	  }|d k(  –— Œ y­w)r   Nr]   r  s     r$   rl   zis_zeros.<locals>.<genexpr>¾  rŽ  r�  r�  r‘  s    r$   Úis_zerosr–  ½  r“  r@   c                ó&   — t        d„ | D «       «      S )Nc              3  ó”   K  — | ]@  }t        |t        j                  «      r$|j                  t        j                  d «      k(  –— ŒB y­w)r£   N)rB   r   r  r`   )rj   Úitems     r$   rl   z is_cpu_device.<locals>.<genexpr>Â  s8   è ø€ ò àÜ�dœEŸL™LÔ)ð 	�‰”u—|‘| EÓ*Õ*ñùs   ‚AAr�  )Úinputss    r$   Úis_cpu_devicer›  Á  s   € Üñ àôó ð r@   c                óœ   — t        | t        j                  «      sJ d«       ‚| j                  rt        j
                  S t        j                  S )Nz8only support sympy.Expr as input to get_sympy_Expr_dtype)rB   rC   rÄ   r[   r   rå   rÝ   )rº  s    r$   Úget_sympy_Expr_dtyper�  É  sD   € ÜØŒU�Z‰Zôð BàAóBð ð ‡~‚~Ü�{‰{Ðä�}‰}Ðr@   c              /  óŠ   K  — | r-t        j                  j                  |i |¤Ž5 }|–— d d d «       y d –— y # 1 sw Y   y xY w­wrP   )r   ru   rv   )Úshould_profilerI   r(  rŽ   s       r$   Úmaybe_profiler   Ó  sE   è ø€ áÜ�^‰^×#Ñ# TÐ4¨VÑ4ð 	¸ØŠG÷	ð 	ô 	÷	ð 	üs   ‚"A¤7©A·A ¼Ac                 ól   — t         j                  j                  } | dk  rt        j                  «       } | S r®   )r5   r  Úthreadsr   Úget_num_threads)r¢  s    r$   r&  r&  Ü  s+   € Ü�j‰j× Ñ €GØ�‚{Ü×'Ñ'Ó)ˆØ€Nr@   c                ó  — ddl m}m} | t        j                  t        j
                  t        j                  fv sJ ‚t        j                  |«      j                  j                  d«      r”ddlm}  |«       }| t        j                  t        j
                  fv r	 || |«      S t        j                  j                  j                  j                   r |t        j                  |«      S  |t        j                  |«      S | t        j                  t        j
                  fv r || «      S t        j                  j                  j                  j                   r |t        j                  «      S  |t        j                  «      S )Nr   )Úget_max_simd_tflopsÚget_max_tensorcore_tflopsÚ
clock_rate)Úmax_clock_rate)Útriton.testingr¥  r¦  r   r×   rÙ   rÛ   ÚinspectÚ	signatureÚ
parametersr  Útorch._utils_internalr¨  Úbackendsr   ÚmatmulÚ
allow_tf32)r_   r¥  r¦  r¨  Úsm_clocks        r$   Úget_device_tflopsr²  ã  s  € çMà”U—]‘]¤E§N¡N´E·M±MÐBÑBÐBÐBä×ÑÐ,Ó-×8Ñ8×<Ñ<¸\ÔJå8á!Ó#ˆØ”U—]‘]¤E§N¡NÐ3Ñ3Ù,¨U°HÓ=Ð=ä�>‰>×Ñ×%Ñ%×0Ò0Ù,¬U¯]©]¸HÓEÐEá&¤u§}¡}°hÓ?Ð?à”U—]‘]¤E§N¡NÐ3Ñ3Ù,¨UÓ3Ð3ä�>‰>×Ñ×%Ñ%×0Ò0Ù,¬U¯]©]Ó;Ð;á&¤u§}¡}Ó5Ð5r@   c                 ó   — ddl m}   | «       S )Nr   ©Úget_dram_gbps)r©  rµ  r´  s    r$   Úget_gpu_dram_gbpsr¶  ÿ  s   € å,á‹?Ðr@   c                 óx   — ddl m}  | j                  j                  j	                  d«      j                  dd«      S )Nr   ©ÚdriverÚmax_shared_mem)Útriton.runtimer¹  ÚactiveÚutilsr¹  r  r¸  s    r$   Úget_gpu_shared_memoryr¾    s.   € Ý%à�=‰=×Ñ×4Ñ4°QÓ7×;Ñ;Ð<LÈaÓPÐPr@   c                ó$   — | j                  d«      S )NÚwelford)r‰  ©Úreduction_types    r$   Úis_welford_reductionrÃ    s   € Ø×$Ñ$ YÓ/Ð/r@   c                ó    — t        | «      rdS dS )Né   r   )rÃ  rÁ  s    r$   Úreduction_num_outputsrÆ    s   € Ü$ ^Ô4ˆ1Ð;¸!Ð;r@   c                 ó0   — t        j                  «       dk(  S )NÚLinux)ÚplatformÚsystemr]   r@   r$   Úis_linuxrË    s   € Ü�?‰?Ó Ñ'Ð'r@   c                 ó(   — t         j                  dk(  S )Nr7   )r   rÉ  r]   r@   r$   Ú
is_windowsrÍ    s   € Ü�<‰<˜7Ñ"Ð"r@   c                ó&   — t        d„ | D «       «      S )Nc              3  ón   K  — | ]-  }t        |t        j                  «      xr |j                   –— Œ/ y ­wrP   )rB   rC   rÄ   Ú	is_numberr  s     r$   rl   z#has_free_symbols.<locals>.<genexpr>  s)   è ø€ ÒJÀŒz˜!œUŸZ™ZÓ(Ò<°·±¨_Ó<ÑJùs   ‚35rò  )Úitrs    r$   r#  r#    s   € ÜÑJÀcÔJÓJÐJr@   c                 ó`  — ddl m} | D �]"  }t        ||j                  «      r`t	        |j
                  j                  «       «      s;t        |j
                  d«      sŒTt	        |j
                  j                  «       «      sŒx yt        ||j                  |j                  |j                  f«      rOt        |d«      rt        |d«      sJ ‚t	        |j                  «       «      st	        |j                  «       «      sŒô yt        ||j                  «      s�Œt        dt        |«      › �«      ‚ y)Nr   rv  r  TÚget_sizezunexpected type for is_dynamic F)rx  rw  rB   r²  r#  r³  rÓ  rœ   r  r´  r$  ÚComputedBufferrµ  Ú	TypeErrorr§   )rI   rw  Úts      r$   Ú
is_dynamicr×     sá   € Ýàó IˆÜ�a˜Ÿ™Ô&Ü §¡§¡Ó 1Ô2Ü˜Ÿ™ Õ-Ô2BÀ1Ç6Á6×CTÑCTÓCVÕ2WáÜ˜˜BŸM™M¨2¯;©;¸×8IÑ8IÐJÔKÜ˜1˜jÔ)¬g°a¸Ô.FÐFÐFÜ §
¡
£Ô-Ô1AÀ!Ç,Á,Ã.Õ1QÙÜ˜A˜rŸy™yÔ)ÙäÐ=¼dÀ1»g¸YÐGÓHÐHðIð r@   c                  ó   — e Zd ZdZdZy)ÚPlaceholderÚKERNEL_NAMEÚDESCRIPTIVE_NAMEN)rV   rW   rX   rÚ  rÛ  r]   r@   r$   rÙ  rÙ  6  s   „ ð  €Kð *Ñr@   rÙ  c                ó²  — ddl m} t        j                  ddd¬«      5 }t	        j
                  «       }t	        j
                  «       } t        |t        |«      ¬«      j                  |Ž  t        d|j                  › �|¬	«       t        |j                  |¬	«       t        j                  «       }t        ||t        j                  j                   «      5   | |j                  «       d d d «       t        j                  «       |z
  }	 ||j                  «       |j                  j#                  «        |j%                  «        t        d
|j                  › �|¬	«       t        |j                  |¬	«       |j'                  «       |j'                  «       k(  }
t(        j+                  d||j,                  |
|	«       d d d «       y # 1 sw Y   ŒÚxY w# 1 sw Y   y xY w)Nr   )Ústable_topological_sortÚwzutf-8F)ÚmodeÚencodingr7  )r.  Ú	fake_modezBefore:
)ÚfilezAfter:
zZ%s, save before/after graph to %s, graph before/after are the same = %s, time elapsed = %s)Úpattern_matcherrÝ  r'  ÚNamedTemporaryFileÚior   r+   r'   Ú	propagater?  rþ   r   Únowr*   r5   ÚtraceÚlog_url_for_graph_xformÚlintÚ	recompilerX  ry   r‚  r   )rÄ  r.  Úinprƒ  rÝ  r;  Ú	before_ioÚafter_ioÚ
start_timeÚtime_elapsedrÖ  s              r$   Úpass_execution_and_saverñ  @  sb  € Ý8ä	×	$Ñ	$ØØØô
ð 
ð 
Ü—K‘K“Mˆ	Ü—;‘;“=ˆØCŒ	�RÔ#3°CÓ#8Ô9×CÑCÀSÑIÜ�	˜"Ÿ(™(˜Ð$¨1Õ-Üˆb�h‰h˜YÕ'Ü—\‘\“^ˆ
Ü# B¨¬V¯\©\×-QÑ-QÓRñ 	Ù�—‘ŒN÷	ä—|‘|“~¨
Ñ2ˆá §¡Ô)Ø
�‰�‰ŒØ
�‰Œä�˜Ÿ™˜
Ð#¨!Õ,Üˆb�h‰h˜XÕ&Ø×ÑÓ  H×$5Ñ$5Ó$7Ñ7ˆÜ�‰ØhØØ�F‰FØØô	
÷-
ð 
÷	ð 	ú÷
ð 
ús%   ŸB6GÃGÃ(CGÇG
	ÇGÇGc                ój   — ddl m} t        | «      |j                  k(  xr |d u xs | j                  |u S ©Nr   rv  )rx  rw  r§   Ú_CollectiveKernelÚop_overload©r-  r  rw  s      r$   Úis_collectiver÷  b  s4   € Ýä�‹:˜×-Ñ-Ñ-ÒX°2¸°:Ò3WÀ×AQÑAQÐUWÐAWÐXr@   c                ó>   — ddl m} t        | «      |j                  k(  S ró  )rx  rw  r§   Ú_WaitKernel)r-  rw  s     r$   Úis_waitrú  h  s   € Ýä�‹:˜Ÿ™Ñ'Ð'r@   c                ó¨   — ddl m}m} t        | |«      sJ ‚t        | |«      rt	        d„ | j
                  D «       «      S t        | j                  «      S )Nr   ©ÚBaseSchedulerNodeÚGroupedSchedulerNodec              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrP   )Úcontains_collectiver  s     r$   rl   z&contains_collective.<locals>.<genexpr>s  s   è ø€ Ò@¨aÔ& q×)Ñ@ùrí  )r}  rý  rþ  rB   r	  Úsnodesr÷  r-  ©Úsnoderý  rþ  s      r$   r   r   n  sE   € ßQä�eÐ.Ô/Ð/Ð/Ü�%Ð-Ô.ÜÑ@°5·<±<Ô@Ó@Ð@ä˜UŸZ™ZÓ(Ð(r@   c                ó¨   — ddl m}m} t        | |«      sJ ‚t        | |«      rt	        d„ | j
                  D «       «      S t        | j                  «      S )Nr   rü  c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrP   )Úcontains_waitr  s     r$   rl   z contains_wait.<locals>.<genexpr>}  s   è ø€ Ò:¨”= ×#Ñ:ùrí  )r}  rý  rþ  rB   r	  r  rú  r-  r  s      r$   r  r  x  sE   € ßQä�eÐ.Ô/Ð/Ð/Ü�%Ð-Ô.ÜÑ:¨U¯\©\Ô:Ó:Ð:ä�u—z‘zÓ"Ð"r@   c                ó¨   — ddl m} t        |t        j                  j
                  «      r|h}t        | |j                  «      xr | j                  |v S ró  )rx  rw  rB   r   r  r  ÚFallbackKernelrõ  rö  s      r$   Úis_fallback_opr	  ‚  sC   € Ýä�"”e—j‘j×+Ñ+Ô,ØˆTˆÜ�d˜B×-Ñ-Ó.ÒI°4×3CÑ3CÀrÐ3IÐIr@   c                óB   — |||    j                   j                  «          S rP   )Údefining_oprV  )Úbuf_nameÚname_to_bufÚname_to_fused_nodes      r$   Úbuf_name_to_fused_snoder  Š  s!   € Ø˜k¨(Ñ3×?Ñ?×HÑHÓJÑKÐKr@   c                ó¶   — |r	 || «      ry |j                  | «       | j                  D ].  }t        |j                  ||«      }||v rŒt	        |||||¬«       Œ0 y )N©Úcriteria_cb)rª  Úunmet_dependenciesr  r   Úfind_recursive_deps_of_node)r  Úcollected_node_setr  r  r  ÚdepÚdefining_op_for_deps          r$   r  r  Ž  sp   € ñ ‘{ 5Ô)ØØ×Ñ˜5Ô!Ø×'Ñ'ò 
ˆÜ5Ø�H‰H�kÐ#5ó
Ðð Ð"4Ñ4ØÜ#ØØØØØ#ö	
ñ
r@   c           	     ó~  — |r	 || «      ry |j                  | «       | j                  «       D ]Ž  }|j                  D ]}  }|j                  €J ‚|j                  j	                  «       dk(  rŒ/|j                  j	                  «       |vrŒL||j                  j	                  «          }||v rŒnt        |||||¬«       Œ Œ� y )NÚOUTPUTr  )rª  Úget_outputsr  r-  rV  Úfind_recursive_users_of_node)r  r  r  r  r  Úor®  Úuser_ops           r$   r  r  £  sÅ   € ñ ‘{ 5Ô)ØØ×Ñ˜5Ô!Ø×ÑÓ ò ˆØ—G‘Gò 	ˆDØ—9‘9Ð(Ð(Ð(Ø�y‰y×!Ñ!Ó# xÒ/ØØ�y‰y×!Ñ!Ó#Ð+=Ñ=ØØ(¨¯©×);Ñ);Ó)=Ñ>ˆGØÐ,Ñ,ØÜ(ØØ"ØØ"Ø'öñ	ñr@   c                óü   — t         j                  j                  j                  rdnd}t         j                  j                  j
                  r)t         j                  j                  j                  «       sy|| z
  |z
  S )zaComputes the number of inputs to the aot fw graph which have fixed addresses (params and buffers)r`  r   )r   Ú
_functorchr5   Úfunctionalize_rng_opsr6  Úinline_inbuilt_nn_modulesr½  Úis_parameter_freezing)Údynamo_gm_num_inputsÚaot_fw_gm_num_inputsÚnum_rng_seed_offset_inputss      r$   Únum_fw_fixed_argumentsr&  ¼  sb   € ô ×Ñ×$Ñ$×:Ò:‰Àð ô 	�‰×Ñ×6Ò6Ü—‘×#Ñ#×9Ñ9Ô;ààÐ"6Ñ6Ð9SÑSÐSr@   c                óü   — d„ }d}g }| j                   j                  D ]0  }|j                  dk(  sŒ ||«      r|j                  |«       |dz  }Œ2 |t	        t        t        |«      «      «      k(  sJ ‚t        |«      S )z>
    Infers which inputs are static for a backwards graph
    c                ó^   — d| j                   vxr d| j                   vxr d| j                   vS )NÚtangentsÚbwd_seedÚbwd_base_offsetrÝ  r  s    r$   Úis_saved_tensorz'count_tangents.<locals>.is_saved_tensorÒ  s5   € à˜aŸf™fÐ$ò 0Ø !§&¡&Ð(ò0à!¨¯©Ð/ð	
r@   r   r#  r   )rþ   r˜  r  r"  rñ   rq   r   )Úfx_gr,  Ú	arg_countÚstatic_arg_idxsr,  s        r$   Úcount_tangentsr0  Í  s�   € ò

ð €IØ€OØ�Z‰Z×Ñò ˆØ�4‰4�=Ó Ù˜qÔ!Ø×&Ñ& yÔ1Ø˜‰N‰Ið	ð œd¤5¬¨_Ó)=Ó#>Ó?Ò?Ð?Ð?ÜˆÓÐr@   c                  ó.   — e Zd ZU ded<   d„ Zed„ «       Zy)Ú	BoxedBoolrË   rT   c                ó   — | j                   S rP   )rT   rb  s    r$   re  zBoxedBool.__bool__é  s   € Ø�z‰zÐr@   c                ó6   — t        | t        «      r	d| _        | S y©NF)rB   r2  rT   r  s    r$   ÚdisablezBoxedBool.disableì  s   € ä�cœ9Ô%ØˆCŒIØˆJØr@   N)rV   rW   rX   rK  re  rk  r6  r]   r@   r$   r2  r2  å  s    … àƒKòð ñó ñr@   r2  c              #  óÈ   ‡ ‡K  — ddl m} |j                  Šˆ ˆfd„}t        j                  j
                  j                  |d|«      5  d –— d d d «       y # 1 sw Y   y xY w­w)Nr   )ÚWrapperCodeGenc                óD   •— ‰j                  |«        ‰| |||g|¢­i |¤ŽS rP   r@  )rp  r   Úkernel_coder¥  rI   r(  Úkernel_listÚorig_define_kernels         €€r$   Únew_define_kernelz2collect_defined_kernels.<locals>.new_define_kernelú  s-   ø€ à×Ñ˜;Ô'Ù! '¨4°¸hÐXÈÒXÐQWÑXÐXr@   Údefine_kernel)Úcodegen.wrapperr8  r>  r~  r   r)  rœ  )r;  r8  r=  r<  s   `  @r$   Úcollect_defined_kernelsr@  ô  sR   ùè ø€ å/à'×5Ñ5ÐõYô
 
�‰×	Ñ	×	#Ñ	# N°OÐEVÓ	Wñ Û÷÷ ñ üs   „AA"ÁAÁ	A"ÁAÁA"c                ó   — | dz   S )NÚ__original__r]   rÝ  s    r$   Ú get_cloned_parameter_buffer_namerC    s   € Ø�.Ñ Ð r@   c                ó<   — t        | t        «      s	| �J | «       ‚| dv S )N)r   r   )rB   rŸ   rë  s    r$   Úis_gpurE    s&   € Ü�fœcÔ" f nÐ<°fÓ<Ð4Ø�_Ð$Ð$r@   c                ó<   — t        | t        «      sJ ‚t        | «      S rP   )rB   rŸ   rE  rë  s    r$   Údevice_need_guardrG    s   € Ü�fœcÔ"Ð"Ð"Ü�&‹>Ðr@   c                ód   — | t         j                  t         j                  t         j                  hv S rP   )r   rå   rË   rÙ   rE  s    r$   Ú,needs_fallback_due_to_atomic_add_limitationsrI    s    € à”U—[‘[¤%§*¡*¬e¯n©nÐ=Ð=Ð=r@   c                óü  — | j                   t        j                  j                  j                  t        j                  j                  j
                  fv r|€y| j                   t        j                  j                  j                  k(  rdnd}|d |hvxsé |xr t        |«      xr t        |«      xsË | j                   t        j                  j                  j                  k(  xrW |dk(  xrP |xrL |dk(  xrE t        j                  j                  xr) t        j                  j                  xs t        «       dk7  xs? ||k(  xr" |t        j                  t        j                  hv xs t        j                   «       S )NFrª  rƒ   r£   r   )Úoverloadpacketr   r�   ÚatenÚscatter_reduce_Úscatter_reduceÚscatter_rE  rI  r5   r  Úfallback_scatter_reduce_sumÚdynamic_threadsr&  rË   rå   r  )rõ  rÂ  Ú
self_dtypeÚ	src_dtypeÚsrc_device_typeÚsrc_is_tensorÚ	reduce_tys          r$   Úuse_scatter_fallbackrW    sZ  € ð 	×"Ñ"Ü�I‰I�N‰N×*Ñ*¬E¯I©I¯N©N×,IÑ,IÐJñ	KàÐ"àð ×+Ñ+¬u¯y©y¯~©~×/FÑ/FÒF‰ÈEð ð
 	˜t YÐ/Ð/ò 	8àò HÜ�Ó'òHä<¸YÓGò		8ð ×&Ñ&¬%¯)©)¯.©.×*HÑ*HÑHò LØ %Ñ'òLàòLð   5Ñ(òLô —
‘
×6Ñ6ò	Lô
 —‘×+Ñ+ÒJÔ/CÓ/EÈÑ/Jò	8ð ˜iÑ'ÒS¨J¼5¿:¹:ÄuÇ{Á{Ð:SÐ,Sò	8ô ×5Ñ5Ó7ð!r@   c                ó   — ddl m}m} ddlm} t        dt        | «      › d�«       t        | «      D �]  \  }}t        d|d›d�«       ||u rt        d	«       Œ'||u rt        d
«       Œ7t        ||«      rÂ|j                  «       }t        |rdnd› d�«       |r:|j                  €J ‚t        d|j                  j                  j                  › �«       t        d«       |j                  j                  D ]  }t        |«       Œ t        d«       |j                  j                  D ]  }t        |«       Œ �Œt!        dt#        |«      › �«      ‚ y)z�
    An API that can be used in pdb to dump a node_schedule.
    Right mainly dump the read/write dependencies but can add more as needed.
    r   )ÚDisableReductionÚEnableReduction)ÚSchedulerNodezNode schedule with z nodesr“  Ú3rÿ  zenable reductionzdisable reductionÚredÚpwz scheduler nodeNzoriginal reduction hint zReadDep:z	WriteDep:zUnrecognized node type: )Útorch._inductor.codegen.simdrY  rZ  r}  r[  r?  r   r�   rB   Úis_reductionr-  r³  Úreduction_hintÚread_writesÚreadsÚwritesr€   r§   )r}  rY  rZ  r[  r£  r-  Úis_redr  s           r$   Údump_node_schedulerf  =  s=  € ÷
 OÝ7ä	Ð¤ MÓ 2Ð3°6Ð
:Ô;Ü˜}Ó-ó H‰	ˆˆTÜ��#�a�˜ˆlÔØ�?Ñ"ÜÐ$Õ%ØÐ%Ñ%ÜÐ%Õ&Ü˜˜mÔ,Ø×&Ñ&Ó(ˆFÜ™f‘U¨$Ð/¨Ð?Ô@ÙØ—y‘yÐ,Ð,Ð,ÜÐ0°·±·±×1NÑ1NÐ0OÐPÔQÜ�*ÔØ×'Ñ'×-Ñ-ò �Ü�c•
ðä�+ÔØ×'Ñ'×.Ñ.ò �Ü�c•
òô Ð!9¼$¸t»*¸ÐFÓGÐGñ'Hr@   c                óz   — ddl m}  || j                  «       t        | j                  «      z  t
        z  dk(  «      S )Nr   )Ústatically_known_true)r  rh  Ústorage_offsetrG  r_   ÚGPU_ALIGN_BYTES)r¦   rh  s     r$   Útensor_is_alignedrk  \  s:   € õ Lá Ø	×	Ñ	Ó	 ¤>°&·,±,Ó#?Ñ	?Ä?ÑRÐVWÑWóð r@   c                ó|   — t        | j                  j                  «      syt        j                  xs t        | «      S r5  )rE  r`   r§   r5   Úassume_aligned_inputsrk  )Úexample_inputs    r$   Úshould_assume_input_alignedro  j  s2   € ô �-×&Ñ&×+Ñ+Ô,ØÜ×'Ñ'ÒKÔ+<¸]Ó+KÐKr@   c                 óö   — t         j                  j                  j                  «       } | st	        j
                  «       S | j                  j                  }|st	        j
                  «       S |j                  «       S rP   )	r   Ú_guardsÚTracingContextÚtry_getry  Únullcontextrá  r   Úsuppress_guards)Útracing_contextr   s     r$   Ú#maybe_get_suppress_shape_guards_ctxrw  s  sb   € ô
 —m‘m×2Ñ2×:Ñ:Ó<€OÙÜ×%Ñ%Ó'Ð'ð  ×)Ñ)×3Ñ3€IÙÜ×%Ñ%Ó'Ð'à×$Ñ$Ó&Ð&r@   c                ó  — t         j                  j                  j                  t        dd«      5  t
        j                  j                  «        dd l}dd l	} |j                  «       } |j                  |«      }ddlm} |j                  |«       |j                  }|j!                  |j"                  «        | |i |¤Ž}	|j%                  «       }
|j!                  |«       |j'                  |«       d d d «       |	|
fS # 1 sw Y   	
fS xY w)Nrz   Tr   )Úoutput_code_log)r~  r   r)  rœ  r5   r   r6  rH  rå  Úloggingr   ÚStreamHandlerrj  ry  Ú
addHandlerÚlevelÚsetLevelÚDEBUGrX  ÚremoveHandler)r„   rI   r(  rå  rz  Úlog_capture_stringÚchry  Ú
prev_levelr:  rÜ  s              r$   Úrun_and_get_cpp_coder„  „  sæ   € ô 
�‰×	Ñ	×	#Ñ	#¤F¨G°TÓ	:ñ *Ü�‰×ÑÔÛÛà(˜RŸ[™[›]ÐØ"ˆW×"Ñ"Ð#5Ó6ˆÝ=à×"Ñ" 2Ô&Ø$×*Ñ*ˆ
Ø× Ñ  §¡Ô/Ù�TÐ$˜VÑ$ˆØ×'Ñ'Ó)ˆØ× Ñ  Ô,Ø×%Ñ% bÔ)÷*ð  �1ˆ9Ð÷!*ð  �1ˆ9Ðús   °CC>Ã>D
c                ó¬   — d }t        | «      }|�|j                  S | D ]4  }t        |t        j                  «      sŒ|j
                  j                  c S  y rP   )r'   r   rB   r   rî  r-  )rš  r   rá  Úinputs       r$   Úshape_env_from_inputsr‡  ›  sY   € Ø€IÜ  Ó(€Ið ÐØ×"Ñ"Ð"ð ò (ˆÜ�eœUŸ\™\Õ*Ø—:‘:×'Ñ'Ò'ð(ð
 r@   c                ó8   ‡ ‡— t        ‰«      dk(  r‰ S dˆˆ fd„}|S )Nr   c                ó,   •— t        | ‰«        ‰| «      S rP   )Úcopy_misaligned_inputs)Ú
new_inputsÚinputs_to_checkr6  s    €€r$   Úrunz)align_inputs_from_check_idxs.<locals>.run·  s   ø€ Ü˜z¨?Ô;Ù�ZÓ Ð r@   )r‹  úList[InputType])r   )r6  rŒ  r�  s   `` r$   Úalign_inputs_from_check_idxsr�  °  s#   ù€ ô ˆ?Ó˜qÒ Øˆö!ð €Jr@   c                ó*  — t        d„ t        | j                  «       | j                  «       «      D «       «      dz   }t	        j
                  | |fd«      j                  «       }t	        j
                  || j                  «       | j                  «       «      S )Nc              3  ó2   K  — | ]  \  }}|d z
  |z  –— Œ y­wr�  r]   )rj   Úshaperï  s      r$   rl   z)clone_preserve_strides.<locals>.<genexpr>À  s   è ø€ ÒP¡] U¨FˆU�Q‰Y˜&Õ ÑPùrí  r   rN   )rƒ   rº   rR  rï  r   Ú
as_stridedÚclone)r!   Úneeded_sizeÚbuffers      r$   Úclone_preserve_stridesr—  ¾  sp   € äÑP´c¸!¿&¹&»(ÀAÇHÁHÃJÓ6OÔPÓPÐSTÑTð ô ×Ñ˜a + °Ó6×<Ñ<Ó>€FÜ×Ñ˜F A§F¡F£H¨a¯h©h«jÓ9Ð9r@   c                ó    — |D ]I  }| |   }t        |t        j                  «      sJ ‚|j                  «       t        z  sŒ<t        |«      | |<   ŒK y rP   )rB   r   r  Údata_ptrÚ	ALIGNMENTr—  )r‹  Úcheck_inputs_idxsr�   Ú_inps       r$   rŠ  rŠ  Æ  sL   € ð ò 9ˆØ˜!‰}ˆÜ˜$¤§¡Ô-Ð-Ð-Ø�=‰=‹?œYÓ&Ü2°4Ó8ˆJ�qŠMñ	9r@   c                óâ   — g }|D ]N  }| |   }t        |t        j                  «      sŒ#|j                  «       t        z  dk(  sŒ>|j                  |«       ŒP t        |«      t        |«      k7  r|S |S )z[
    We require all inputs to be aligned, so introduce a copy for any
    that aren't.
    r   )rB   r   r  r™  rš  r"  r   )rš  Ústatic_input_idxsÚaligned_static_input_idxsr£  r†  s        r$   Úremove_unaligned_input_idxsr   Ð  st   € ð !#ÐØ ò 2ˆØ�s‘ˆÜ�eœUŸ\™\Õ*°·±Ó0@Ä9Ñ0LÐQRÓ/RØ%×,Ñ,¨SÕ1ð2ô Ð$Ó%¬Ð->Ó)?Ò?Ø(Ð(ØÐr@   c                óx  ‡— t         j                  j                  j                  «       }|��|j                  �‚t        |j                  «      dk(  sJ ‚t        | «      Š|j                  D ]M  }|€|j                  j                  d «       Œ!|j                  j                  t        ˆfd„|D «       «      «       ŒO y y y )Nr   c              3  óZ   •K  — | ]"  }‰�‰j                  |«      n
t        |«      –— Œ$ y ­wrP   )Úevaluate_symexprrQ   )rj   r    r   s     €r$   rl   z5set_tracing_context_output_strides.<locals>.<genexpr>í  s:   øè ø€ ò ð ð  )Ð4ð &×6Ñ6°qÔ9ä!$ Q£ó(ñùs   ƒ(+)	r   rq  rr  rs  Úoutput_stridesr   r‡  r"  r$  )r7  Úcompiled_graphrJ  Úexprsr   s       @r$   Ú"set_tracing_context_output_stridesr§  â  s±   ø€ ä�m‰m×*Ñ*×2Ñ2Ó4€GØÐ˜w×5Ñ5ÐAÜ�7×)Ñ)Ó*¨aÒ/Ð/Ð/Ü)¨.Ó9ˆ	Ø#×2Ñ2ò 	ˆEØˆ}Ø×&Ñ&×-Ñ-¨dÕ3à×&Ñ&×-Ñ-Üó ð "'ôó õ	ñ		ð  BÐr@   )rL   ú
sympy.Expr)é   éd   )r„   zCallable[[], Any]ri  r„  )ri  rË   )r`   z"Union[Optional[torch.device], str]ri  ztorch.device)r³   zIterable[_T]ri  zValuesView[_T])rÇ   úUnion[int, sympy.Expr]rÈ   r«  ri  r«  )r÷   z"Iterable[Union[int, torch.SymInt]]ri  zList[sympy.Expr])r÷   z Iterable[Union[int, sympy.Expr]]ri  zList[Union[int, torch.SymInt]])r  útorch._ops.OpOverloadrP   )r  z1Optional[Callable[[torch._ops.OpOverload], bool]])r   )r`   rŸ   )r   r   )r6  zCallable[..., Any]r8  rQ   r`   rŸ   ri  r„  )r]   é
   r­  g      ð?r   )rI  r   rJ  rŸ   )rI  r   rM  z	List[str])ri  rQ   )r„   z!Callable[Concatenate[Any, P], RV]ri  zCachedMethod[P, RV])r«  zIterable[torch.fx.Node]ri  zSet[torch.fx.Node])rÅ  r¨  ri  rŸ   )rÔ  r2   r£  rQ   ri  úsympy.Symbol)r   rŸ   ri  r®  )rÅ  r¨  ræ  zDict[sympy.Expr, Any]ri  r¨  )r·   r   ri  rË   )rI   r   ri  rË   )r.  útorch.fx.GraphModule)rI  r   )NNT)ri  z	List[int])rÂ  zList[torch.dtype]ri  rË   )rÊ  rŸ   ri  rË   r•  )rº  r¨  ri  ztorch.dtype)rÑ  zIterable[Any])r#  rQ   r$  rQ   )r-  r¯  )r   rŸ   )rõ  r¬  )r¦   útorch.Tensor)rn  r°  )rš  zList[torch.Tensor])r6  ú Callable[[List[InputType]], Any]rŒ  úSequence[int]ri  r±  )r!   r°  )r‹  rŽ  r›  r²  ri  rj  )rš  rŽ  rž  r²  )ÙÚ
__future__r   r–  ry  ÚdataclassesÚenumr¯   rª  rå  r¸  rz  r‡  r±   r+  rÉ  r1  r   r'  r‰  r4  r~  r   r   Útypingr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   Útyping_extensionsr   r   r   rC   r   r   Ú	lru_cacher%   Útorch._dynamo.device_interfacer&   Útorch._dynamo.utilsr'   Útorch.autogradr(   Útorch.autograd.profiler_utilr)   Ú(torch.fx.passes.graph_transform_observerr*   Útorch.fx.passes.shape_propr+   Útorch.utils._sympy.functionsr,   r-   r.   r/   r0   Útorch.utils._sympy.symbolr1   r2   Útorch.utils._sympy.value_rangesr3   r4   rx  r5   Úruntime.runtime_utilsr6   rÆ   r4  Ú	getLoggerrV   ry   r8   rÄ   Ú	VarRangesr  rQ   Ú	InputTyperj  rš  r=   r?   rH   ÚFunctionrJ   r”   r¡   r¬   r´   r½   rÁ   rõ   rø   r  r  r  r/  rm   r<  rD  rK  rN  rP  rS  r[  r\  r]  r`  rt  r~  rŒ  r¨  r¯  r½  rÂ  rÍ  rÕ  rÚ  rÞ  rè  rì  ró  r  r  r  r  rK  r  r!  rz  r<  rC  rG  rI  rM  r—  r¥  rU  r»  r¿  rÃ  rË  rÐ  rÛ  rè  rì  rü  r  r
  r+  r.  r0  rI  rN  r]  ra  rc  rl  ru  r  r„  rŠ  r’  r–  r›  r�  r   r&  r²  r¶  r¾  rÃ  rÆ  rË  rÍ  r#  r×  ÚEnumrÙ  rñ  r÷  rú  r   r  r	  r  r  r  r&  r0  Ú	dataclassr2  r@  rC  rE  rG  rI  rW  rf  rk  ro  rw  r„  r‡  r�  r—  rŠ  r   r§  r]   r@   r$   ú<module>rÉ     sr  ðæ "ã Û Û Û Û Û Û 	Û Û Û Û Û 	Û Û Û 
Û Û Û Û Ý Ý ÷÷ ÷ ÷ ÷  5Ý ã ã ð �UˆO€	ð
 €×Ñ�TÓñó ðõ DÝ 0Ý %Ý 2Ý KÝ 0÷õ ÷ 8ß Då Ý =ð �l‰l˜gÑ%€à€g×Ñ˜Ó!€áˆTƒ]€Ø�—‘˜UŸZ™ZÐ'Ñ(€	Ø�%—,‘, Ð#Ñ$€	ð €Ø€	à€Ø�{ Q‘Ñ'¨AÒ-°+ÀÒ2BÐ XÐDXÓ XÐBò5ó
LôˆE�N‰Nô ôOðd €×Ñ�TÓòó ðóò@ò@ó
+ð)Ø!ð)Ø*@ð)àó)ò AðF+Ø	+ð+àó+ðØ	)ðà#óó&Gð OSðØKóò2ô.'ð NTðØðØ69ðØGJðà
óð  CIðØ<?óó)ó'ó#òò$ñ ˆcƒN€ÙˆT˜TÔ"€ô�8˜W Q¨ U™^ô óò"ò&)òB52ðr 9=ðØ*ðàóò&>ó"ò$%ó	DòUó	>óó.ó-ò(òVAóð !#Ð �IÓ "ó	òð ×Òò( ó ð( óVAð €×Ñ�QÓñ7ó ð7ô�*ô ÷~ñ ~ôB
˜ô 
ð ×Òñ$ó ð$÷ñ ð@ €×Ñ�TÓò	ó ð	ó;óóóð 16ÀUô òð8 €×Ñ�TÓñ@ó ð@ð €×Ñ�TÓñRó ðRò63òl>ó1òhC÷Cñ Cò" ò/ò$òNòò#ð& ×Òñ.ó ð.óFò&	ò)ò>&ò&òóð ×Òñó ðòð €×Ñ�TÓñ6ó ð6ð6 €×Ñ�TÓñó ðòQò0ò<ó(ò#óKòô,*�$—)’)ô *ò
óDYò(ò)ò#òJòLð
 MQó
ð, MQóó2Tó" ð0 ×Ò÷ð ó ðð ×Òñó ðó!ó%ó
ò
>ð
$Ø&ó$òNHó>óLò'ò"ó.ð*Ø+ðà"ðð &óó:ð9Øð9Ø4Að9à	ó9ðØðà$óó$r@   