Ë
    ÄÓ^jlu  ã                   óÖ  — d dl Z d dlZd dlmZmZ d dlmZ d dlmZm	Z	m
Z
mZmZ d dlZd dlZd dlmZ d dlmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ ddlmZ  ed«      Z ed«      Z e!ejD                  df   Z#e!e$ejJ                     e$ejD                     f   Z&ejN                  jQ                  e)d«      Z*d dlm+Z+m,Z, e
rd dl-m.Z.m/Z/ dejD                  dejD                  dz  fd„Z0dejD                  dejD                  dz  fd„Z1dejD                  de2ejD                  e3f   dejD                  dz  fd„Z4dejD                  de2ejD                  e3f   dejD                  dz  fd„Z5dejD                  de6fd„Z7 e jp                  d¬«       G d„ d «      «       Z9e	d!d"d#ejD                  d$ejD                  d%ed   de!e&e&f   dz  f
d&„«       Z:e		 dBd!d"d#ejD                  d$ejD                  d%ed'   de!e&e&f   f
d(„«       Z:	 dBd!d"d#ejD                  d$ejD                  d%e6de!e&e&f   dz  f
d)„Z: G d*„ d+«      Z;d,e$ejJ                     d-e$ejJ                     d.e$ejJ                     d/e$ejJ                     d0e$e$ejD                        d1e$e$ee$ejD                     gejD                  f         de2ejJ                  ejD                  f   fd2„Z<d3ed   de9dz  fd4„Z=d5ejD                  de2ejJ                  e3f   d6ee>   de3fd7„Z?d8e>de3dz  fd9„Z@d:ejD                  e3z  de3fd;„ZA e jp                  d¬«       G d<„ d=«      «       ZB e jp                  d¬«       G d>„ d?«      «       ZCd@ed   deCdz  fdA„ZDy)Cé    N)ÚCounterÚdefaultdict)ÚCallable)ÚLiteralÚoverloadÚTYPE_CHECKINGÚTypeVarÚUnion)Úindex_vars_no_squeeze)Úsympy_productÚ
sympy_subs)Ú
OrderedSet)ÚIdentity)Ú	try_solve)Úsymbol_is_typeÚSymTé   ©ÚVÚTÚU.Úloop_tiling)ÚFloorDivÚModularIndexing©ÚFusedSchedulerNodeÚSchedulerNodeÚexprÚreturnc                 óÂ  — | j                  «       ryt        | t        «      ryt        | j                  «      dk(  sJ ‚t        t        | j                  «      «      }t        | t        «      r;t        t        j                  | j                  d   | j                  d   «      |«      }n t        t        j                  | d«      |«      }|r|d   j                  «       sy|d   S )zw
    Given an expr with a single free symbol, solve for a constant relation that would make
    this expression 0.
    Nr   r   é   )Úis_constantÚ
isinstancer   ÚlenÚfree_symbolsÚnextÚiterr   r   ÚsympyÚEqÚargs)r   Úfree_symbolÚouts      úg/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_inductor/tiling_utils.pyÚsolve_for_zeror.   $   s´   € ð
 ×ÑÔØÜ	�Dœ(Ô	#Øäˆt× Ñ Ó! QÒ&Ð&Ð&Ü”t˜D×-Ñ-Ó.Ó/€KÜ�$œÔ(ÜœŸ™ §¡¨1¡¨t¯y©y¸©|Ó<¸kÓJ‰äœŸ™  qÓ)¨;Ó7ˆÙ�c˜!‘f×(Ñ(Ô*ØØˆq‰6€Mó    c           	      óú  ‡— t        | j                  «      dk7  ryt        t        | j                  «      «      Šdt        j
                  dt        j
                  dz  fˆfd„}| j                  t        «      s| j                  t        «      s || «      S g }g }t        j                  j                  | «      D ]x  }t        |t        j                  «      rKd}|j                  D ]5  }t        |«      }|€Œ|j                  «       sJ ‚d}|j!                  |«       Œ7 |rŒf y|j!                  |«       Œz |syt#        |«      }	 ddt        j
                  d	t        j
                  d
t        j
                  dz  dt        j
                  fd„}	|j%                  t        |	«      j%                  t        |	«      }
 ||
«      }|rt'        |‰|i«      dk7  ry|j!                  |«       t        t)        |«      «      dk(  r|d   S y)aÄ  
    Giving an expr with a single free symbol, try to find a tiling that would
    make the expression coalesced with respect to that symbol.

    Tiling an expression `x` by `y` means that the expression will now be indexed
    by both the original (x) and by (x * y). So we are looking for a
    multiplicative factor that will make ((x + 1) * y) - (x * y) == 1.

    To simplify things for sympy, we'll try just x * y == 1, check x(1) and x(0).
    r   Nr   r   c                 ó  •— | j                  t        «      s| j                  t        «      rJ ‚t        | j                  «      dk7  ry t        t        j                  | d«      ‰«      }|r|d   j                  «       sy |d   S )Nr   )	Úhasr   r   r$   r%   r   r(   r)   r"   )r   r,   r+   s     €r-   Ú_solve_simple_exprz,solve_for_tiling.<locals>._solve_simple_exprJ   sk   ø€ Ø—8‘8œOÔ,°T·X±X¼hÔ5GÐGÐGÜˆt× Ñ Ó! QÒ&ØäœŸ™  qÓ)¨;Ó7ˆÙ˜#˜a™&×,Ñ,Ô.ØØ�1‰vˆr/   FTÚxÚyÚzc                 ó   — | |z  S ©N© )r4   r5   r6   s      r-   Úindexing_div_repz*solve_for_tiling.<locals>.indexing_div_repw   s   € ð
 �1‰uˆr/   r   r8   )r$   r%   r&   r'   r(   ÚExprr2   r   r   ÚAddÚ	make_argsr#   ÚMulr*   r.   r"   ÚappendÚsumÚreplacer   r   )r   r3   Úrequired_valuesÚeq_1_expressionsÚargÚseenÚmul_argr,   Ú	eq_1_exprr:   Úeq_1_expr_simplifiedr+   s              @r-   Úsolve_for_tilingrI   9   sã  ø€ ô ˆ4×ÑÓ Ò"Øä”t˜D×-Ñ-Ó.Ó/€Kð¤§¡ð ´·
±
¸TÑ0Aõ ð �8‰8”OÔ$¨T¯X©X´hÔ-?Ù! $Ó'Ð'à€OØÐô
 �y‰y×"Ñ" 4Ó(ò )ˆä�cœ5Ÿ9™9Ô%ØˆDàŸ8™8ò ,�Ü$ WÓ-�Ø�;Øà—‘Ô(Ð(Ð(Ø�Ø×&Ñ& sÕ+ð,ò Ùà×#Ñ# CÕ(ð#)ñ& ØäÐ$Ó%€Ið
  $ñÜ�:‰:ðä�:‰:ðô �:‰:˜Ñðô 
�‰ó	ð %×,Ñ,¬_Ð>NÓO×WÑWÜÐ"óÐñ Ð1Ó
2€Cñ ”*˜Y¨°cÐ(:Ó;¸qÒ@Øà×Ñ˜3Ôä
Œ:�oÓ&Ó'¨1Ò,Ø˜qÑ!Ð!àr/   ÚindexÚ
var_rangesc                 ó*  — i }| j                   D ]  }||v rd||<   Œt        |«      ||<   Œ t        | |«      }|D ]1  }|| j                   vrŒd||<   	 t        | |«      }||k(  r|c S d||<   Œ3 y# t        $ r t        j                  d| |«       Y ŒWw xY w)zÀ
    Try to find the variable that this index is broadcast over.
    A broadcast pattern is one where consecutive values of a variable
    access the same memory location (e.g., x // 10).
    r   r   úzero division error %s %sN)r%   Úget_hintr   ÚZeroDivisionErrorÚloop_tiling_logÚinfo)rJ   rK   Ú	variablesÚvÚ
zero_indexÚnew_vals         r-   Úfind_broadcast_varrV   “   sÇ   € ð *,€IØ×Ñò 'ˆØ�
‰?ØˆI�aŠLä# A›;ˆI�aŠLð	'ô ˜E 9Ó-€JØò ˆØ�E×&Ñ&Ñ&Øàˆ	�!‰ð	Ü  ¨	Ó2ˆGð
 �jÒ ØŠHØˆ	�!Šðð øô !ò 	Ü× Ñ Ð!<¸eÀYÔOÙð	ús   ÁA/Á/ BÂBc                 óœ  — t         j                  j                  | «      }|D ]
  }||v sŒ|c S  i }| j                  D ]  }||v rd||<   Œt	        |«      ||<   Œ t        | |«      }|D ]<  }d||<   	 t        | |«      }||z
  dk(  rd||<   t        | |«      |z
  dk(  r|c S d||<   Œ> y# t        $ r t        j                  d| |«       Y Œbw xY w)z;
    Try to find the symbol which coalesces this index
    r   r   rM   r!   N)	r(   r<   r=   r%   rN   r   rO   rP   rQ   )rJ   rK   Útop_level_termsrS   rR   rT   rU   s          r-   Úfind_coalesced_varrY   ¶   s  € ô —i‘i×)Ñ)¨%Ó0€OØò ˆØ�ÒØŠHðð
 *,€IØ×Ñò 'ˆØ�
‰?ØˆI�aŠLä# A›;ˆI�aŠLð	'ô ˜E 9Ó-€JØò ˆØˆ	�!‰ð	Ü  ¨	Ó2ˆGð �ZÑ 1Ò$ØˆI�a‰Lô ˜5 )Ó,¨wÑ6¸1Ò<Ø’Øˆ	�!Šðð øô !ò 	Ü× Ñ Ð!<¸eÀYÔOÙð	ús   Á1B(Â( CÃ
CÚmemory_exprc                 ó:   — t        d„ | j                  D «       «      S )zD
    Check if this memory expression has any indirect indexing.
    c              3   óP   K  — | ]  }t        |t        j                  «      –— Œ  y ­wr8   )r   r   ÚINDIRECT©Ú.0Úss     r-   ú	<genexpr>z&has_indirect_access.<locals>.<genexpr>à   s   è ø€ ÒR°AŒ~˜a¤§¡×/ÑRùs   ‚$&)Úanyr%   )rZ   s    r-   Úhas_indirect_accessrc   Ü   s   € ô ÑR¸×9QÑ9QÔRÓRÐRr/   T)Úfrozenc                   óÞ   — e Zd ZU dZeej                     ed<   eej                     ed<   eej                  ee
   f   ed<   eej                  ee
   f   ed<   eej                  ef   ed<   y)ÚFusedNormalizedReadsWriteszO
    Normalized reads and writes for nodes in the same FusedSchedulerNode.
    Ú
index_varsÚreduce_varsÚreadsÚwritesrK   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r(   ÚSymbolÚ__annotations__Údictr;   ÚstrÚintr9   r/   r-   rf   rf   ã   sk   … ñð ˜5Ÿ<™<Ñ(Ó(Ø˜EŸL™LÑ)Ó)Ø�—
‘
˜J s™OÐ+Ñ,Ó,Ø�—‘˜Z¨™_Ð,Ñ-Ó-Ø�U—\‘\ 3Ð&Ñ'Ô'r/   rf   Únr   Úpointwise_numelÚ	red_numelÚnone_if_not_divisiblec                  ó   — y r8   r9   ©rt   ru   rv   rw   s       r-   Úget_pw_red_splitsrz   ð   s   € ð 25r/   Fc                  ó   — y r8   r9   ry   s       r-   rz   rz   ù   s   € ð +.r/   c                 óR  — | j                  «       sJt        j                  j                  j	                  t        | j                  j                  d   «      |«      r^| j                  j                  | j                  j                  d   f| j                  j                  | j                  j                  d   ffS t        t        | j                  j                  d   «      «      t        ||z  «      k(  sJ ‚t        | j                  j                  d   «      dz
  }d}|dk\  r0|| j                  j                  d   |   z  }||k(  rn|dz  }|dk\  rŒ0|dk\  rr| j                  j                  d   d| }| j                  j                  d| }| j                  j                  d   |d  }| j                  j                  |d  }	||f|	|ffS |ry | j                  j                  | j                  j                  d   f| j                  j                  | j                  j                  d   ffS )Nr   r   )Úis_reductionr   ÚgraphÚsizevarsÚstatically_known_equalsr   Ú_bodyÚsizesÚ	iter_varsrh   rN   r$   )
rt   ru   rv   rw   ÚiÚprodÚ	pw_splitsrƒ   Ú
red_splitsÚred_varss
             r-   rz   rz     sï  € ð 	‡~�~Ôœ1Ÿ7™7×+Ñ+×CÑCÜ�a—g‘g—m‘m AÑ&Ó'¨ôð
 �W‰W×Ñ §¡§¡¨aÑ 0Ð1Ø�W‰W× Ñ  !§'¡'§-¡-°Ñ"2Ð3ð
ð 	
ô
 ”M !§'¡'§-¡-°Ñ"2Ó3Ó4¼Ø˜)Ñ#ó9ò ð ð ô 	ˆA�G‰G�M‰M˜!ÑÓ Ñ!€AØ€DØ
ˆqŠ&Ø�—‘—‘˜aÑ  Ñ#Ñ#ˆØ�9ÒØØ	ˆQ‰ˆð	 ˆq‹&ð 	ˆA‚vØ—G‘G—M‘M !Ñ$ Q qÐ)ˆ	Ø—G‘G×%Ñ% a¨Ð*ˆ	à—W‘W—]‘] 1Ñ% a bÐ)ˆ
Ø—7‘7×$Ñ$ Q RÐ(ˆØ˜9Ð%¨°*Ð'=Ð=Ð=áØð �W‰W×Ñ §¡§¡¨aÑ 0Ð1Ø�W‰W× Ñ  !§'¡'§-¡-°Ñ"2Ð3ð
ð 	
r/   c                   ó\   — e Zd ZdZded   fd„Zdeeef   fd„Zdededeeef   d	z  fd
„Z	y	)ÚNodeSplitGetterz_
    Finds a Pointwise, Reduction Split that compatible with all nodes in a SchedulerNode.
    Únoder   c                 ón  — || _         |j                  d   d   | _        |j                  d   d   | _        t	        t
        «      | _        t	        t
        «      | _        d| _        t        «       | _	        |j                  d   }t        |j                  «       «      D �]‡  }t        |t        j                  j                  j                   «      sŒ3t#        || j                  | j                  d¬«      }|€0| j                  j%                  |j&                  j(                  «       Œˆ|\  \  }}\  }}t        j                  j*                  j,                  j.                  j1                  |||f| j                  «      \  }}| j                  t3        |«         j%                  t5        |«      «       | j                  t3        |«         j%                  t5        |«      «       |dk7  rt7        |«      f| _        t5        |«      t5        |«      f}| j                  j%                  |«       �ŒŠ t        «       | _        y )Nr   r   r9   T)rw   )r‹   Úgroupru   rv   r   r   Úpw_split_optionsÚred_split_optionsÚreduction_splitÚall_node_sizesÚreversedÚ	get_nodesr#   ÚtorchÚ	_inductorÚ	schedulerr   rz   Úaddr�   r‚   ÚcodegenÚsimdÚ
SIMDKernelÚprepare_split_iteration_lengthsr$   Útupler   Úseen_pw_splits)	Úselfr‹   Úfused_grouprt   Úmaybe_splitsÚ_Ún_pw_splitsÚn_red_splitsÚn_sizes	            r-   Ú__init__zNodeSplitGetter.__init__6  sÓ  € ð ˆŒ	Ø+/¯:©:°a©=¸Ñ+;ˆÔØ%)§Z¡Z°¡]°1Ñ%5ˆŒä>IÌ*Ó>UˆÔÜ?JÌ:Ó?VˆÔà&(ˆÔÜ?I»|ˆÔà—j‘j ‘mˆÜ˜$Ÿ.™.Ó*Ó+ó 	,ˆAÜ˜a¤§¡×!:Ñ!:×!HÑ!HÔIØô
 -Ø�4×'Ñ'¨¯©ÈtôˆLð Ð#Ø×#Ñ#×'Ñ'¨¯©¯©Ô6Øà2>Ñ/ÑˆQ�Ñ/˜q ,ô —‘×'Ñ'×,Ñ,×7Ñ7×WÑWØ +¨|Ð!<¸d¿n¹nóñ &ˆK˜ð ×!Ñ!¤# kÓ"2Ñ3×7Ñ7¼¸kÓ8JÔKØ×"Ñ"¤3 |Ó#4Ñ5×9Ñ9¼%ÀÓ:MÔNà˜rÒ!Ü(5°lÓ(CÐ'E�Ô$ä˜KÓ(¬%°Ó*=Ð>ˆFØ×Ñ×#Ñ# FÖ+ð=	,ô@ 2<³ˆÕr/   r   c                 ó2  — t        | j                  «      dk(  rt        t        | j                  «      «      S t        | j                  «      dk(  r| j
                  f| j                  ffS t        | j                  j                  «       «      }t        | j                  j                  «       «      }dt        t        t        t           f   dt        ddfd„}||z   }t        t        |dd«      «      D ]Œ  \  }}t        |dd«      D ]K  }| j                  |   D ]7  }| j                  ||z
     D ]   }	| j!                  ||	«      x}
sŒ|
c c c c S  Œ9 ŒM  || j                  ||z
  «        || j                  ||z
  «       ŒŽ | j
                  f| j                  ffS )	zI
        Get a compatible pointwise, reduction split of the node
        r   r   Úsplit_optionsÚcurr_lengthr   Nc                 óÞ   — | |   D ]e  }t        t        |«      dz
  «      D ]I  }t        |d| t        |||dz    «      fz   ||dz   d  z   «      }| t        |«         j	                  |«       ŒK Œg y )Nr   r   r!   )Úranger$   rœ   r   r—   )r§   r¨   Úsplitr„   Ú	new_splits        r-   Úadd_combined_split_optionszCNodeSplitGetter.get_node_splits.<locals>.add_combined_split_optionsu  s�   € ð ' {Ñ3ò A�Üœs 5›z¨A™~Ó.ò A�AÜ %Ø˜a ˜
¤m°E¸!¸aÀ!¹eÐ4DÓ&EÐ%GÑGÈ%ÐPQÐTUÑPUÐPWÈ.ÑXó!�Ið "¤# i£.Ñ1×5Ñ5°iÕ@ñ	AñAr/   éÿÿÿÿ)r$   r‘   r&   r'   rŽ   ru   rv   ÚmaxÚkeysr�   rq   rs   r   ÚSplitÚ	enumeraterª   Ú	try_split)rž   Úmax_pw_splitÚmax_red_splitr­   Úmax_total_splitsÚ	curr_iterÚtotal_splitsÚpw_split_lenÚpw_splitÚ	red_splitr,   s              r-   Úget_node_splitszNodeSplitGetter.get_node_splitsg  s¬  € ô
 ˆt×"Ñ"Ó# qÒ(Üœ˜T×0Ñ0Ó1Ó2Ð2äˆt×$Ñ$Ó%¨Ò*Ø×)Ñ)Ð+¨d¯n©nÐ->Ð?Ð?ä˜4×0Ñ0×5Ñ5Ó7Ó8ˆÜ˜D×2Ñ2×7Ñ7Ó9Ó:ˆð	AÜ¤¤Z´Ñ%6Ð 6Ñ7ð	AÜFIð	Aàó	Að (¨-Ñ7ÐÜ'0´Ð7GÈÈBÓ1OÓ'Pò 	Ñ#ˆI�|Ü % l°A°rÓ :ò '�Ø $× 5Ñ 5°lÑ Cò '�HØ%)×%;Ñ%;Ø$ |Ñ3ñ&ò '˜	ð #'§.¡.°¸9Ó"EÐE˜3ÑEØ#&ŸJ˜Jñ	'ñ'ð'ñ ' t×'<Ñ'<¸lÈYÑ>VÔWÙ&Ø×&Ñ&¨¸	Ñ(Aõð	ð ×%Ñ%Ð'¨$¯.©.Ð):Ð;Ð;r/   ÚpwÚredNc                 ó´  — ddl m}m} || j                  v ry| j                  j	                  |«       | j
                  D ]ˆ  \  }}	 ||z   }||f}|j                  ||«      \  }	}
t        |
«      dk(  sJ ‚|	dt        |«       }t        t        j                  j                  |«      «      }||k7  sŒq| j                  ||«      x}sŒ†|c S  ||fS # |$ r Y  yw xY w)zs
        See if this split is compatible, and potentially returning a longer split
        than the input.
        r   )Ú	CantSplitrš   Nr!   )Útorch._inductor.codegen.simdrÀ   rš   r�   r—   r‘   Ú_split_iteration_rangesr$   rœ   Ú	itertoolsÚchainÚfrom_iterabler³   )rž   r½   r¾   rÀ   rš   Ún_pwÚn_redÚgroupsÚlengthsÚsplitsÚgettersÚpw_group_splitsÚflattened_pw_splitsr,   s                 r-   r³   zNodeSplitGetter.try_split‘  sö   € ÷ 	Gà�×$Ñ$Ñ$ØØ×Ñ×Ñ Ô#à×.Ñ.ò 	‰KˆD�%ðØ˜c™�Ø ˜-�Ø",×"DÑ"DÀVÈWÓ"U‘�˜ô �w“< 1Ò$Ð$Ð$Ø$ Y¤s¨2£wÐ/ˆOô
 #(¬	¯©×(EÑ(EÀoÓ(VÓ"WÐØ" bÓ(ØŸ.™.Ð)<¸cÓBÐB�3ÑBØ’Jð#	ð& �3ˆwˆøð ò Úðús   ÁCÃCÃC)
rk   rl   rm   rn   r
   r¥   rœ   r±   r¼   r³   r9   r/   r-   rŠ   rŠ   1  sY   „ ñð/>àÐ9Ñ:ó/>ðb(<  u¨e |Ñ!4ó (<ðT˜Eð ¨ð °%¸¸u¸Ñ2EÈÑ2Lô r/   rŠ   rƒ   rˆ   Únorm_pw_varsÚnorm_red_varsÚ
new_rangesÚreturn_getters_groupsc           	      ó¸  — t        d„ |D «       «      }t        j                  d|› �«      }d}t        | «      dk(  rt        |«      dk(  ri S t        |«      t        ||z   «      k(  sJ ‚g }	|D ]'  }
|	j	                  |
D �cg c]
  } ||«      ‘Œ c}«       Œ) i }t        t        |	| |fd¬«      «      D ]f  \  }\  }
}t        |
«      t        |«      k7  r|dk(  sJ ‚t        |«      dk(  sJ ‚Œ8|j                  t        |
|«      D ��ci c]  \  }}||“Œ
 c}}«       Œh d}i }t        |||z   d¬«      D ]l  \  }}g }t        t        |«      «      D ]  }|j	                  ||   «       |dz  }Œ d}t        t        |«      dz
  dd«      D ]  }||z  |||   <   ||   |z  }Œ Œn |j                  «       D ��ci c]  \  }}|t        ||«      “Œ c}}S c c}w c c}}w c c}}w )zBMaps original variables to expressions using normalized variables.c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr8   )r$   r^   s     r-   ra   z$apply_var_mapping.<locals>.<genexpr>Ê  s   è ø€ Ò.˜a”3�q—6Ñ.ùs   ‚zv_0:r   T)Ústrictr   r®   )r@   r(   Úsymbolsr$   r?   r²   ÚzipÚupdaterª   Úitemsr   )rƒ   rˆ   rÎ   rÏ   rÐ   rÑ   Únum_varsÚ	flat_varsÚcountÚapply_groupsr�   ÚgÚiter_vars_to_flat_varsr„   Ú	var_grouprS   Úflat_vars_to_new_varsÚ	new_rangeÚnew_varÚ
range_varsr¡   r…   Úks                          r-   Úapply_var_mappingrå   ³  s'  € ô. Ñ. :Ô.Ó.€HÜ—‘  X JÐ/Ó0€IØ€Eä
ˆ9ƒ~˜Òœs 8›}°Ò1Øˆ	äˆz‹?œc ,°Ñ">Ó?Ò?Ð?Ð?Ø€LØ&ò ;ˆØ×Ñ°5Ö9¨a™Q˜y�\Ò9Õ:ð;ð  ÐÜ!*ÜˆL˜9 hÐ/¸Ô=ó"ò 
PÑˆÑˆE�9ô
 ˆu‹:œ˜Y›Ò'Ø˜’6ˆM�6Ü�y“> QÒ&Ð&Ð&Øà×%Ñ%¼¸EÀ9Ó8M×&N±°°1 q¨!¡tÓ&NÕOð
Pð €EØÐÜ!Ø�L =Ñ0¸ôò 'Ñˆ	�7ð ˆ
Ü”s˜9“~Ó&ò 	ˆAØ×Ñ˜i¨Ñ.Ô/Ø�Q‰J‰Eð	ð ˆÜ”s˜9“~¨Ñ)¨2¨rÓ2ò 	'ˆAØ3:¸T±>Ð! *¨Q¡-Ñ0Ø˜Q‘< $Ñ&‰Dñ	'ð'ð +×0Ñ0Ó2÷áˆAˆqð 	
Œ:�aÐ.Ó/Ñ/óð ùò= :ùó 'Oùó"s   Á=G
ÄGÆ0Gr‹   c           
      ó^	  ‡)— t        t        «      }t        t        «      }| j                  «       }| j                  «       }t        «       }t        «       Š)|D ]O  }t        j
                  j                  j                  ||«      r‰)j                  |«       Œ?|j                  |«       ŒQ t        ˆ)fd„| j                  j                  D «       «      }| j                  d   d   }| j                  d   d   }	t        | «      j                  «       \  }
}t        |
|d¬«      \  \  }}}t        | j!                  «       «      D �]G  }t#        |t$        j&                  j                  j(                  «      sŒ3|j*                  }t        t        «      }t        t        «      }|D ],  }|j-                  |«      D ]  }||   j                  |«       Œ Œ. |D ],  }|j/                  |«      D ]  }||   j                  |«       Œ Œ. |s|sŒÄt1        |||	«      \  \  }}\  }}|
|z   }||f}t$        j&                  j2                  j4                  j6                  j9                  |||	«      }	 t$        j&                  j2                  j4                  j6                  j;                  ||«      \  }}tA        ||||||«      }dtB        jD                  dtB        jD                  fd	„}|jG                  «       D � �!ci c]  \  } }!tI         || «      |«      |!“Œ }"} }!|jG                  «       D �#�!ci c]  \  }#}!tI         ||#«      |«      |!“Œ }$}#}!|"jG                  «       D ]  \  }}%||xx   |%z  cc<   Œ |$jG                  «       D ]  \  }}%||xx   |%z  cc<   Œ �ŒJ |jG                  «       D �&�!ci c]0  \  }&}!t        j
                  jJ                  jM                  |&|«      |!“Œ2 }}&}!|jG                  «       D �'�!ci c]0  \  }'}!t        j
                  jJ                  jM                  |'|«      |!“Œ2 }}'}!tO        |||||«      }(tP        jS                  d
|(«       |(S # t$        j&                  j2                  j4                  j<                  $ r |j>                  s|	j>                  sJ ‚Y  yw xY wc c}!} w c c}!}#w c c}!}&w c c}!}'w )zjExtracts index variables, reduce variables, read/write expressions, and variable ranges from a fused node.c              3   óT   •K  — | ]  }|j                   ‰vsŒ|j                   –— Œ! y ­wr8   )Úname)r_   ÚdepÚremoved_bufferss     €r-   ra   z1extract_normalized_read_writes.<locals>.<genexpr>	  s%   øè ø€ ò Ø°c·h±hÀoÒ6Uˆ��ñùs   ƒ(—(r   r   rt   )ÚprefixNr   r   c                 ó0   — | j                  t        d„ «      S )Nc                 ó   — | S r8   r9   )r4   s    r-   ú<lambda>zIextract_normalized_read_writes.<locals>.remove_identity.<locals>.<lambda>P  s   € °A€ r/   )rA   r   )r   s    r-   Úremove_identityz7extract_normalized_read_writes.<locals>.remove_identityO  s   € Ø—<‘<¤©+Ó6Ð6r/   zNormalized Fused reads: %s)*r   r   Úget_buffer_namesÚget_operation_namesr   r~   r–   Ú$can_buffer_be_removed_through_fusionr—   Úread_writesri   r�   rŠ   r¼   r   Úlistr“   r#   r”   r•   r   r�   Úget_all_read_exprÚget_all_write_exprrz   r˜   r™   rš   r›   rÂ   rÀ   r%   rå   r(   r;   rØ   r   r   Úsimplify_with_rangesrf   rP   rQ   )*r‹   ri   rj   Úall_output_namesÚop_namesÚoutputsÚbuf_nameÚinputsru   rv   r†   r‡   rÎ   rÏ   Úrangesrt   ÚbodyÚn_readsÚn_writesÚinpr   r,   rƒ   r¢   rˆ   r£   rÈ   rÉ   rÐ   rÑ   Úvar_maprï   ÚreadrS   Ún_reads_newÚwriteÚn_writes_newÚ	buf_namesÚrÚwÚ	fused_outrê   s*                                            @r-   Úextract_normalized_read_writesr  ø  s�  ø€ ô 0;¼:Ó/F€EÜ0;¼JÓ0G€Fà×,Ñ,Ó.ÐØ×'Ñ'Ó)€HÜ)›|€GÜ'1£|€OØ$ò "ˆÜ�7‰7×Ñ×AÑAÀ(ÈHÔUØ×Ñ Õ)à�K‰K˜Õ!ð	"ô ó Ø ×,Ñ,×2Ñ2ôó €Fð #'§*¡*¨Q¡-°Ñ"2€OØ ŸJ™J q™M¨!Ñ,€Iä+¨DÓ1×AÑAÓCÑ€Iˆzô -BØ�: cô-Ñ)Ñ!€\�= 6ô �$—.‘.Ó"Ó#ó G&ˆÜ˜!œUŸ_™_×6Ñ6×DÑDÔEØà�w‰wˆä5@ÄÓ5LˆÜ6AÄ*Ó6Mˆð ò 	'ˆCØ×.Ñ.¨sÓ3ò '�Ø˜‘×!Ñ! #Õ&ñ'ð	'ð ò 	(ˆCØ×/Ñ/°Ó4ò (�Ø˜‘×"Ñ" 3Õ'ñ(ð	(ñ ™xØä=NØˆ 	ó>
Ñ:Ñ ˆ�KÑ": 8¨\ð ˜ZÑ'ˆØ Ð/ˆä�O‰O×#Ñ#×(Ñ(×3Ñ3×SÑSØ˜ óð 	ð

	ä—‘×'Ñ'×,Ñ,×7Ñ7×OÑOØ˜Góñ .ˆJÐ-ô $ØØØØØØ!ó
ˆð	7¤%§*¡*ð 	7´·±ó 	7ð JQÏÉË÷
Ù>E¸dÀAŒJ‘ tÓ,¨gÓ6¸Ñ9ð
ˆñ 
ð
 %ŸN™NÓ,÷
á��qô ‘ uÓ-¨wÓ7¸Ñ:ð
ˆñ 
ð
  +×0Ñ0Ó2ò 	%‰OˆD�)Ø�$‹K˜9Ñ$ŒKð	%ð  ,×1Ñ1Ó3ò 	&‰OˆD�)Ø�4‹L˜IÑ%ŒLò	&ðMG&ðT INÏÉË÷Ù@DÀÀ1Œ�‰×Ñ×-Ñ-¨a°Ó8¸!Ñ;ð€Eñ ð IOÏÉË÷Ù@DÀÀ1Œ�‰×Ñ×-Ñ-¨a°Ó8¸!Ñ;ð€Fñ ô +ØØØØØó€Iô ×ÑÐ5°yÔAØÐøôc �‰×&Ñ&×+Ñ+×5Ñ5ò 	ð #×/Ò/°9×3IÒ3IÐIÐIÚð		üó(
ùó
ùóùós,   É AQË(RÌRÎ5R#Ï&5R)ÑARÒRÚaddrr  c                 ó  — g }| j                   D ]B  }|j                  |«      }t        |t        j                  «      rŒ/|€Œ2|j                  |«       ŒD ddlm} |j                  j                  j                  t        |«      «      S )z7
    Score addr according to its approximate size.
    r   r   )r%   Úgetr   r   r]   r?   Úvirtualizedr   r~   r   Úoptimization_hintr   )r  rK   r  Ú	var_sizesrS   Úv_sizer   s          r-   Ú	get_scorer  r  sr   € ð €IØ×Ñò %ˆØ—‘ Ó"ˆä˜a¤§¡Õ/°FÑ4FØ×Ñ˜VÕ$ð	%õ
 à�7‰7×Ñ×-Ñ-¬m¸IÓ.FÓGÐGr/   rû   c                 óÆ   — t         j                  j                  | «      }|sy t         j                  j                  j	                  t        |j                  «       «      «      S r8   )r   r~   Útry_get_bufferr   r  r   Úget_size)rû   Úbufs     r-   Útry_get_buf_sizer  „  sB   € Ü
�'‰'×
 Ñ
  Ó
*€CÙØÜ�7‰7×Ñ×-Ñ-¬m¸C¿L¹L»NÓ.KÓLÐLr/   rS   c                 óx   — t        | t        «      r| S t        j                  j                  j                  | «      S r8   )r#   rs   r   r~   r   r  )rS   s    r-   rN   rN   ‹  s,   € Ü�!”SÔØˆä�w‰w×Ñ×1Ñ1°!Ó4Ð4r/   c                   óD   — e Zd ZU dZej
                  ed<   eed<   eed<   y)Ú	VarTilingzm
    Tiling of a var by `tiling_factor` that yields additional coalesced mem accesses by `benefit_score`
    ÚvarÚtiling_factorÚscoreN)rk   rl   rm   rn   r(   ro   rp   rs   r9   r/   r-   r  r  ’  s   … ñð 
�‰ÓØÓØ„Jr/   r  c                   ó|   — e Zd ZU eej
                  ef   ed<   eej
                  ef   ed<   eed<   dZ	e
dz  ed<   y)ÚCoalesceVarAnalysisÚcoalesced_by_varÚuncoalesced_addrsÚnorm_read_writesNÚsuggested_split)rk   rl   rm   rq   r(   r;   rs   rp   rf   r$  r  r9   r/   r-   r   r   �  s?   … ð
 ˜5Ÿ:™: s˜?Ñ+Ó+à˜EŸJ™J¨˜OÑ,Ó,à0Ó0à(,€O�Y Ñ%Ô,r/   r   Ú
fused_nodec           
      óè  ‡(— t        | «      }|€y|j                  }|j                  }|j                  }t	        «       }t	        «       }|j
                  }|j                  }|r|st        t        |«      «      nd}	t        j                  d„ |j                  «       D «       d„ |j                  «       D «       «      D �]?  \  }
\  }}t        |||«      }|dk(  rŒt        |«      }|rd}nt        ||«      }|€t        ||«      }d}|D ]X  }t         j"                  j%                  |«      x}sŒ%t'        |«      x}sŒ3|t)        ||«      |j*                  j,                  z  z  }ŒZ ||
rdndz  }|r‚d}|	�^||	k7  rYt.        j1                  |d«      }	 t3        ||«      }d||	<   t3        ||«      }||z
  }|dv rd||	<   t3        ||«      }||z
  }|dv rd	}|s||xx   |z  cc<   �Œ$||	xx   |z  cc<   �Œ3||xx   |z  cc<   �ŒB |st9        |||¬
«      S t;        t        «      }|j                  «       D �]"  \  }}t        |«      rŒt.        j1                  |j=                  «       d«      }|j>                  |j=                  «       z  D ]Ì  }||vrŒ|dk(  rŒ||= t3        ||«      } d||<   tA        | j>                  «      dk7  rŒ;tC        | «      }!|!�|!jE                  «       r|!jF                  sŒetI        |!«      }!t         j"                  jJ                  jM                  |!||   «      sŒždŠ(tO        ˆ(fd„|!||   |!z  fD «       «      sŒ½||   |!xx   |z  cc<   ŒÎ �Œ% tA        |«      dk(  rt9        |||¬
«      S d}"d}#|j                  «       D ])  \  }$}%|%j                  «       D ]  \  }&}'|'|#kD  sŒ|$|&f}"|'}#Œ Œ+ |"€t9        |||¬
«      S t9        |||tQ        |"d   |"d   |#«      ¬«      S # t4        t6        f$ r Y �Œ#w xY w)aé  
    Implementation for BaseSchedulerNode.get_coalesce_analysis().
    Call that node method so loop-transform cache invalidation is honored.

    Find variables that coalesce the reads and writes and score the total size.

    If uncoalesced memory expressions are found, look for additionally tiling of variables
    which will coalesce memory accesses.

    For instance - for the following expression:

    (32*p0) // 2048

    Tiling p0 by 64 will make this expression coalesced.
    Nc              3   ó$   K  — | ]  }d |f–— Œ
 y­w)TNr9   ©r_   Úitems     r-   ra   z-_analyze_memory_coalescing.<locals>.<genexpr>Ò  s   è ø€ Ò0˜$ˆ$�ŒÑ0ùó   ‚c              3   ó$   K  — | ]  }d |f–— Œ
 y­w)FNr9   r(  s     r-   ra   z-_analyze_memory_coalescing.<locals>.<genexpr>Ô  s   è ø€ Ò2˜4ˆ%�ŒÑ2ùr*  r   r   r!   F)r   r   T)r!  r"  r#  é   c              3   ór   •K  — | ].  }t         j                  j                  j                  ‰|«      –— Œ0 y ­wr8   )r   r~   r   Ústatically_known_lt)r_   ÚblockÚMIN_TILING_BLOCKs     €r-   ra   z-_analyze_memory_coalescing.<locals>.<genexpr>@  s1   øè ø€ ò àô —‘× Ñ ×4Ñ4Ð5EÀu×Mñùs   ƒ47)r!  r"  r#  r$  ))r  ri   rj   rK   r   rg   rh   r&   r’   rÃ   rÄ   rØ   r  rc   rY   rV   r   r~   r  r  ÚminÚdtypeÚitemsizerq   Úfromkeysr   rO   Ú	TypeErrorr   r   r°   r%   r$   rI   r"   Ú
is_integerrs   r   r.  Úallr  ))r%  r#  ri   rj   rK   r!  r"  rg   rh   Úinnermost_varÚis_readrZ   r  ÚsizeÚindirect_exprÚmaybe_coalesced_varÚtotal_scorerû   r  Úbuf_sizeÚalready_coalesced_1dÚsubsÚval_0Úval_1Ú	stride_01Úval_2Ú	stride_12Útiling_scoresÚuncoalesced_exprÚ
addr_scoreÚ	expr_subsrS   Úsingle_var_exprr  Úbest_tilingÚbest_tiling_scorer  Útiling_counterÚtileÚ
tile_scorer0  s)                                           @r-   Ú_analyze_memory_coalescingrP  «  s�  ø€ ô& 6°jÓAÐàÐØà×"Ñ"€EØ×$Ñ$€FØ!×,Ñ,€Jä07³	ÐÜ/6«yÐð "×,Ñ,€JØ"×.Ñ.€Ká&0¹ŒŒX�jÓ!Ô"È$ð ô .7¯_©_Ù0 %§+¡+£-Ô0á2 6§<¡<£>Ô2ó.ó >:Ñ)ˆÑ)�+˜yô
 ˜ j°)Ó<ˆØ�1Š9Øô ,¨KÓ8ˆáØ"&Ñä"4°[À*Ó"MÐð #Ð*Ü&8¸ÀjÓ&QÐ#àˆØ!ò 	HˆHÜ—w‘w×-Ñ-¨hÓ7Ð7�Ñ7Ü,¨XÓ6Ð6�Ñ6ð œs 8¨TÓ2°S·Y±Y×5GÑ5GÑGÑG‘ð	Hð 	™G‘q¨Ñ*ˆáð $)Ð ØÐ(Ð-@ÀMÒ-Qô —}‘} Z°Ó3�ðÜ& {°DÓ9�EØ*+�D˜Ñ'Ü& {°DÓ9�EØ %¨¡�IØ  FÑ*Ø./˜˜]Ñ+Ü *¨;¸Ó =˜Ø$)¨E¡M˜	Ø$¨Ñ.Ø37Ð0ñ (Ø Ð!4Ó5¸ÑDÕ5à  Ó/°;Ñ>Õ/à˜kÓ*¨kÑ9Õ*ð}>:ñ@ Ü"Ø-Ø/Ø-ô
ð 	
ô 7BÄ'Ó6J€Mà(9×(?Ñ(?Ó(Aó +:Ñ$Ð˜*ÜÐ/Ô0Øä—M‘M *§/¡/Ó"3°QÓ7ˆ	Ø!×.Ñ.°·±Ó1BÑBò &	:ˆAà˜
Ñ"Øà˜QŠØà˜!�Ü(Ð)9¸9ÓEˆOØˆI�a‰Lä�?×/Ñ/Ó0°AÒ5Øä,¨_Ó=ˆMð Ð%Ø$×0Ñ0Ô2Ø$×/Ò/àä Ó.ˆMÜ—7‘7×#Ñ#×7Ñ7¸ÀzÐRSÁ}ÔUØð
  !ÐÜó à+¨Z¸©]¸mÑ-KÐLôô ð à˜!Ñ˜]Ó+¨zÑ9Ô+òM&	:ð+:ôZ ˆ=Ó˜QÒÜ"Ø-Ø/Ø-ô
ð 	
ð 26€KØÐà,×2Ñ2Ó4ò /Ñˆˆ^Ø .× 4Ñ 4Ó 6ò 	/ÑˆD�*ØÐ-Ó-Ø" D˜k�Ø$.Ñ!ñ	/ð/ð ÐÜ"Ø-Ø/Ø-ô
ð 	
ô Ø)Ø+Ø)Ü! +¨a¡.°+¸a±.ÐBSÓTô	ð øôy *¬9Ð5ò Úðús   ÆAOÏO1Ï0O1)F)EÚdataclassesrÃ   Úcollectionsr   r   Úcollections.abcr   Útypingr   r   r   r	   r
   r(   r”   Útorch._inductor.dependenciesr   Útorch._inductor.utilsr   r   Útorch.utils._ordered_setr   Útorch.utils._sympy.functionsr   Útorch.utils._sympy.solver   Útorch.utils._sympy.symbolr   r   r  r   r   r   rœ   r;   r±   rô   ro   ÚVarsAndRangesÚ_loggingÚgetArtifactLoggerrk   rP   r   r   Útorch._inductor.schedulerr   r   r.   rI   rq   rs   rV   rY   Úboolrc   Ú	dataclassrf   rz   rŠ   rå   r  rr   r  r  rN   r  r   rP  r9   r/   r-   ú<module>ra     sk  ðÛ Û ß ,Ý $ß CÕ Cã ã Ý >ß ;Ý /Ý 1Ý .ß :å ñ ˆCƒL€ÙˆCƒL€ð 	ˆe�j‰j˜#ˆoÑ€Ø�d˜5Ÿ<™<Ñ(¨$¨u¯z©zÑ*:Ð:Ñ;€ð —.‘.×2Ñ2°8¸]ÓK€ß Bñ ßKð˜Ÿ™ð ¨¯
©
°TÑ(9ó ð*W˜5Ÿ:™:ð W¨%¯*©*°tÑ*;ó Wðt Ø�:‰:ð Ø#'¨¯
©
°C¨Ñ#8ð à
‡Z�Z�$Ñó ðF#Ø�:‰:ð#Ø#'¨¯
©
°C¨Ñ#8ð#à
‡Z�Z�$Ñó#ðLS U§Z¡Zð S°Dó Sð €×Ñ˜dÔ#÷	(ð 	(ó $ð	(ð 
ð5Øð5à—Z‘Zð5ð �z‰zð5ð # 4™=ð	5ð
 ˆ=˜-Ð'Ñ(¨4Ñ/ò5ó 
ð5ð 
ð
 -2ñ	.Øð.à—Z‘Zð.ð �z‰zð.ð # 5™>ð	.ð
 ˆ=˜-Ð'Ñ(ò.ó 
ð.ð #(ñ	,
Øð,
à—Z‘Zð,
ð �z‰zð,
ð  ð	,
ð
 ˆ=˜-Ð'Ñ(¨4Ñ/ó,
÷^ñ ðDBØ�E—L‘LÑ!ðBà�5—<‘<Ñ ðBð �u—|‘|Ñ$ðBð ˜Ÿ™Ñ%ð	Bð
 �T˜%Ÿ*™*Ñ%Ñ&ðBð    X¨t°E·J±JÑ/?Ð.@À%Ç*Á*Ð.LÑ%MÑ NÑOðBð 
ˆ%�,‰,˜Ÿ
™
Ð
"Ñ#óBðJwØ
Ð5Ñ
6ðwà $Ñ&ówðtHØ
�*‰*ðHØ"& u§|¡|°SÐ'8Ñ"9ðHØFPÐQTÁoðHàóHð$M˜sð M s¨T¡zó Mð5�—
‘
˜SÑ ð 5 Só 5ð €×Ñ˜dÔ#÷ð ó $ðð €×Ñ˜dÔ#÷
-ð 
-ó $ð
-ð}ØÐ;Ñ<ð}à˜4Ñô}r/   