§
    ž²ÅjWP ã                  ó.  — d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlZd dlZd dlZd dlm Z m!Z! d dl"m#Z#m$Z$ d dl%m&Z& d dl'm(Z( d d	l)m*Z*m+Z+ d d
l,m-Z- ddl.m/Z/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5m6Z6m7Z7 ddl8m9Z9 ddl1m:Z:m;Z;m<Z<m=Z= ddl2m>Z>m?Z?m@Z@mAZA ddlBmCZC ddlDmEZEmFZF ddlGmHZHmIZI ddlJmKZK ddlLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZW ddlXmYZY  ejZ        e[¦  «        Z\ej]         ^                    e[d¦  «        Z_ej]         ^                    e[d¦  «        Z`eja         G d„ d¦  «        ¦   «         Zbeja         G d„ deb¦  «        ¦   «         Zc G d„ d¦  «        Zd G d„ d ¦  «        ZedQd%„Zf G d&„ d'¦  «        ZgdRd.„Zheji        jj        jk        eji        jj        jl        eji        jj        jm        eji        jj        jn        d/œZo G d0„ d1ed¦  «        Zp G d2„ d3ed¦  «        Zq G d4„ d5ed¦  «        ZrdSd7„ZsdTd<„Zt G d=„ d>ed¦  «        Zu G d?„ d@eu¦  «        Zv G dA„ dBed¦  «        Zw	 dUdVdK„Zxeja         G dL„ dM¦  «        ¦   «         Zy ejz        ¦   «         Z{ G dN„ d9¦  «        Z| G dO„ dP¦  «        Z}dS )Wé    )ÚannotationsN)Údefaultdict)ÚAnyÚCallableÚCounterÚDefaultDictÚDictÚGenericÚListÚOptionalÚSequenceÚSetÚTupleÚTypeVarÚUnion)ÚcountersÚdynamo_timed)Úget_metric_tableÚis_metric_table_enabled)Úfree_unbacked_symbols)Ú
OrderedSet)Úfree_symbol_is_typeÚSymT)Ú
has_tritoné   )ÚcommsÚconfigÚdependenciesÚirÚmetrics)ÚBackendFeatureÚget_scheduling_for_deviceÚKernel)Ú estimate_nccl_collective_runtime)ÚDepÚ	MemoryDepÚStarDepÚWeakDep)ÚComputedBufferÚget_device_typeÚMultiOutputÚMultiOutputLayout)ÚLoopBody)ÚMemoryPlanningInfoForBufferÚMemoryPlanningInfoForNode)Ú
green_textÚred_text)ÚSimplifyIndexing)Úcache_on_selfÚcmpÚdevice_need_guardÚget_device_tflopsÚget_dtype_sizeÚget_gpu_dram_gbpsÚIndentedBufferÚis_collectiveÚis_gpuÚis_waitÚsympy_product)ÚVÚfusionÚloop_orderingc                  óÆ   — e Zd ZU ded<   ded<   ded<    ej        e¬¦  «        Zded	<    ej        e¬¦  «        Z	d
ed<   dd„Z
dd„Zdd„Zdd„Zdd„Zdd„Zd d„Zd d„ZdS )!ÚSchedulerBufferÚ	SchedulerÚ	schedulerz	ir.BufferÚnodeÚBaseSchedulerNodeÚdefining_op)Údefault_factoryúList[NodeUser]Úusersr.   Ú
mpi_bufferÚreturnÚintc                ó4   — t          | j        j        ¦  «        S ©N)ÚhashrE   Úname©Úselfs    úJC:\Projects\Historical\venv\Lib\site-packages\torch/_inductor/scheduler.pyÚ__hash__zSchedulerBuffer.__hash__T   s   € Ý�D”I”NÑ#Ô#Ð#ó    Ústrc                ó¶  — t          ¦   «         }|                      ¦   «         }|                     |› dt          | j        ¦  «        j        › �¦  «         |                     |› d| j        j        › �¦  «         |                      ¦   «         r9|                     |› dt          |                      ¦   «         ¦  «        › �¦  «         |  	                    ¦   «         r9|                     |› dt          |  	                    ¦   «         ¦  «        › �¦  «         t          | j        ¦  «        dk    r |                     |› d| j        › �¦  «         n}|                     |› d�¦  «         |                     d¦  «        5  | j        D ]}|                     |› d�¦  «         Œ	 d d d ¦  «         n# 1 swxY w Y   |                     d	¦  «         |                     ¦   «         S )
Nú: z
.layout = z.aliases = z.mutations = r   z	.users = z
.users = [ú,ú])r9   Úget_nameÚ	writelineÚtyperE   Ú__name__ÚlayoutÚget_aliasesÚpformatÚget_mutationsÚlenrJ   ÚindentÚgetrawvalue)rS   ÚresultrQ   Úusers       rT   Ú	debug_strzSchedulerBuffer.debug_strW   s  € ÝÑ!Ô!ˆØ�}Š}‰ŒˆØ×Ò˜DÐ>Ð>¥D¨¬¡O¤OÔ$<Ð>Ð>Ñ?Ô?Ð?Ø×Ò˜DÐ>Ð>¨D¬IÔ,<Ð>Ð>Ñ?Ô?Ð?Ø×ÒÑÔð 	PØ×Ò ÐNÐNµ¸×9IÒ9IÑ9KÔ9KÑ1LÔ1LÐNÐNÑOÔOÐOØ×ÒÑÔð 	TØ×Ò ÐRÐRµ7¸4×;MÒ;MÑ;OÔ;OÑ3PÔ3PÐRÐRÑSÔSÐSåˆtŒz‰?Œ?˜aÒÐØ×Ò Ð;Ð;¨t¬zÐ;Ð;Ñ<Ô<Ð<Ð<à×Ò Ð0Ð0Ð0Ñ1Ô1Ð1Ø—’˜qÑ!Ô!ð 1ð 1Ø œJð 1ð 1�DØ×$Ò$¨ Z Z ZÑ0Ô0Ð0Ð0ð1ð1ð 1ð 1ñ 1ô 1ð 1ð 1ð 1ð 1ð 1ð 1øøøð 1ð 1ð 1ð 1ð ×Ò˜SÑ!Ô!Ð!Ø×!Ò!Ñ#Ô#Ð#s   Å7#F'Æ'F+Æ.F+c                ó4   — | j                              ¦   «         S rO   ©rE   r\   rR   s    rT   r\   zSchedulerBuffer.get_namek   ó   € ØŒy×!Ò!Ñ#Ô#Ð#rV   ÚNonec                ó^  — | j         €J ‚| j                              ¦   «         sd S | j                              ¦   «         sJ| j                              ¦   «         s1t	          | j                              ¦   «         t          j        ¦  «        r+t          j	        j
                             | j         ¦  «         d S t          t          j        d¦  «        r·|                      ¦   «         t          j        j        v r’t          j        j        |                      ¦   «                  }|| j        j        v r| j        j        |         j         }n| j        j        |         j         }t          j	        j
                             || j         ¦  «         d S t          j	        j
                             | j         ¦  «         d S )NÚargs)rE   Úshould_allocateÚget_inputs_that_alias_outputÚget_mutation_namesÚ
isinstanceÚget_output_specr   ÚCommBufferLayoutr>   ÚgraphÚwrapper_codeÚcodegen_allocationÚhasattrÚkernelr\   Úinplace_update_buffersrD   Úname_to_donated_bufferÚname_to_bufÚcodegen_inplace_reuse)rS   Úinput_buffer_nameÚinput_buffers      rT   ÚallocatezSchedulerBuffer.allocaten   sy  € ØŒyÐ$Ð$Ð$ØŒy×(Ò(Ñ*Ô*ð 	ØˆFð ŒI×2Ò2Ñ4Ô4ð	àŒy×+Ò+Ñ-Ô-ð	õ ˜$œ)×3Ò3Ñ5Ô5µrÔ7JÑKÔKð	õ
 ŒGÔ ×3Ò3°D´IÑ>Ô>Ð>ØˆFõ •A”H˜fÑ%Ô%ð	?à—’‘”¥1¤8Ô#BÐBÐBõ !"¤Ô ?ÀÇÂÁÄÔ PÐØ  D¤NÔ$IÐIÐIØ#œ~ÔDØ%ô äð �ð  $œ~Ô9Ð:KÔLÔQ�ÝŒGÔ ×6Ò6ØØ”	ñô ð ð ð õ
 ŒGÔ ×3Ò3°D´IÑ>Ô>Ð>Ð>Ð>rV   Úboolc                ó²   — | j         €J ‚t          | j         j        t          j        ¦  «        rdS | j        D ]}t          |j         t          ¦  «        r dS Œ dS ©NFT)rE   rs   r`   r   Ú
NoneLayoutrJ   Ú
OutputNode)rS   Úuses     rT   Úcan_freezSchedulerBuffer.can_free�   sd   € àŒyÐ$Ð$Ð$Ý�d”iÔ&­¬Ñ6Ô6ð 	Ø�5Ø”:ð 	ð 	ˆCÝ˜#œ(¥JÑ/Ô/ð Ø�u�uðàˆtrV   c                ó@  — i }|D ]r}t          |j        ¦  «        |v rC|                     |t          |j        ¦  «                 ¦  «        |t          |j        ¦  «        <   Œ[||t          |j        ¦  «        <   Œst          |                     ¦   «         ¦  «        | _        d S rO   )ÚidrE   ÚmergeÚlistÚvaluesrJ   )rS   rJ   rg   r‡   s       rT   Ú	set_userszSchedulerBuffer.set_users™   s‡   € à&(ˆØð 	+ð 	+ˆCÝ�#”(‰|Œ|˜vÐ%Ð%Ø'*§y¢y°½¸3¼8¹¼Ô1EÑ'FÔ'F�•r˜#œ(‘|”|Ñ$Ð$à'*�•r˜#œ(‘|”|Ñ$Ð$Ý˜&Ÿ-š-™/œ/Ñ*Ô*ˆŒ
ˆ
ˆ
rV   úSequence[str]c                óF   — | j         €J ‚| j                              ¦   «         S rO   )rE   rq   rR   s    rT   ra   zSchedulerBuffer.get_aliases£   s$   € ØŒyÐ$Ð$Ð$ØŒy×5Ò5Ñ7Ô7Ð7rV   c                óF   — | j         €J ‚| j                              ¦   «         S rO   )rE   rr   rR   s    rT   rc   zSchedulerBuffer.get_mutations§   ó$   € ØŒyÐ$Ð$Ð$ØŒy×+Ò+Ñ-Ô-Ð-rV   N©rL   rM   ©rL   rW   ©rL   rm   ©rL   r‚   )rJ   rI   rL   rm   ©rL   r�   )r_   Ú
__module__Ú__qualname__Ú__annotations__ÚdataclassesÚfieldrŒ   rJ   r.   rK   rU   ri   r\   r�   rˆ   rŽ   ra   rc   © rV   rT   rB   rB   J   s)  € € € € € € àÐÐÑØ€O€O�OØ"Ð"Ð"Ñ"Ø-˜KÔ-¸dÐCÑCÔC€EÐCÐCÐCÑCØ.?¨kÔ.?Ø3ð/ñ /ô /€Jð ð ð ñ ð$ð $ð $ð $ð$ð $ð $ð $ð($ð $ð $ð $ð?ð ?ð ?ð ?ðBð ð ð ð+ð +ð +ð +ð8ð 8ð 8ð 8ð.ð .ð .ð .ð .ð .rV   rB   c                  ó   — e Zd ZU dZded<   dS )ÚSchedulerDonatedBufferNúOptional[BaseSchedulerNode]rG   )r_   r˜   r™   rG   rš   r�   rV   rT   rŸ   rŸ   ¬   s#   € € € € € € à/3€KÐ3Ð3Ð3Ñ3Ð3Ð3rV   rŸ   c                  óà  — e Zd ZU ded<   ded<   ded<   ded<   ded	<   d
ed<   dZd„Zd[d„Zd\d„Zd\d„Zd\d„Zd]d„Z	d\d„Z
d^d„Zd_d„Zd`d"„Zdad%„Zdbd'„Zdcd)„Zddd-„Zd^d.„Zded/„Zded0„Zd^d1„Zd^d2„Zdfd5„Zd\d6„Zd\d7„Zeded8„¦   «         Zeded9„¦   «         Zdgd;„Zdhd=„Zdid@„ZdjdB„Z dbdC„Z!dbdD„Z"dbdE„Z#dbdF„Z$dbdG„Z%dbdH„Z&dbdI„Z'dkdL„Z(dbdM„Z)d^dN„Z*	 dldmdS„Z+edndT„¦   «         Z,edodV„¦   «         Z-dpdX„Z.dYS )qrF   z7Tuple[torch.device, Tuple[Tuple[sympy.Expr, ...], ...]]Úgroupúdependencies.ReadWritesÚread_writeszOrderedSet[Dep]Úunmet_dependenciesrM   Ú	min_orderÚ	max_orderr/   Úmpi_noderD   rC   rL   rm   c                ó$   — || _         d„ | _        d S )Nc                 ó   — g S rO   r�   )ro   Úkwargss     rT   ú<lambda>z,BaseSchedulerNode.__init__.<locals>.<lambda>Â   s   €  B€ rV   )rD   Údebug_device_str)rS   rD   s     rT   Ú__init__zBaseSchedulerNode.__init__¾   s   € Ø$-ˆŒð 'Ð&ð 	ÔÐÐrV   rE   úir.Operationc                óæ   ‡ — |‰ _         t          ¦   «         ‰ _        t          ¦   «         ‰ _        d‰ _        ˆ fd„|                     ¦   «         D ¦   «         ‰ _        d„ ‰ j        D ¦   «         ‰ _        d S )NFc                ó>   •— g | ]}t          ‰j        |‰¬ ¦  «        ‘ŒS ))rD   rE   rG   )rB   rD   )Ú.0ÚoutputrS   s     €rT   ú
<listcomp>z5BaseSchedulerNode._init_from_node.<locals>.<listcomp>Ë   sE   ø€ ð /
ð /
ð /
ð õ Øœ.ØØ ðñ ô ð/
ð /
ð /
rV   c                ó8   — i | ]}|                      ¦   «         |“ŒS r�   ©r\   ©r²   Úbufs     rT   ú
<dictcomp>z5BaseSchedulerNode._init_from_node.<locals>.<dictcomp>Ó   s/   € ð <
ð <
ð <
Ø$'ˆC�LŠL‰NŒN˜Cð<
ð <
ð <
rV   )rE   r   Ú	ancestorsÚ
last_usageÚwrittenÚget_outputsÚoutputsÚoutputs_by_name©rS   rE   s   ` rT   Ú_init_from_nodez!BaseSchedulerNode._init_from_nodeÄ   s�   ø€ Ø,0ˆŒ	Ý*4©,¬,ˆŒõ ‰LŒLð 	Œð ˆŒð/
ð /
ð /
ð /
ð ×*Ò*Ñ,Ô,ð/
ñ /
ô /
ˆŒð<
ð <
Ø+/¬<ð<
ñ <
ô <
ˆÔÐÐrV   rW   c                óZ   — t          | ¦  «        j        › d|                      ¦   «         ›d�S )Nz(name=ú)©r^   r_   r\   rR   s    rT   Ú__repr__zBaseSchedulerNode.__repr__×   s*   € Ý�t‘*”*Ô%ÐAÐA¨T¯]ª]©_¬_ÐAÐAÐAÐArV   c                ó˜  — |                       ¦   «         }t          ¦   «         }|                     |› dt          | ¦  «        j        › dt          t          | dd¦  «        ¦  «        j        › d|› dt          | j        j        ¦  «        › d|› dt          | j	        ¦  «        › d|› d	t          | j        j
        | j	        z
  ¦  «        › d|› d
�¦  «         |                     ¦   «         5  |                      ¦   «         D ])}|                     |                     ¦   «         ¦  «         Œ*	 ddd¦  «         n# 1 swxY w Y   |                     d¦  «         	 |                     |                      ¦   «         ¦  «         n,# t           $ r t"                               dd¬¦  «         Y nw xY w|                     ¦   «                              ¦   «         S )ú#Longer form printout for trace logsrY   ú(rE   Nú)
ú
.writes = ú
ú.unmet_dependencies = ú.met_dependencies = z.outputs = [
        r[   úIgnoring error in debug_str()T©Úexc_info)r\   r9   Úsplicer^   r_   Úgetattrrb   r¤   Úwritesr¥   Úreadsre   r½   ri   r]   Údebug_str_extraÚ	ExceptionÚlogÚwarningrf   Úrstrip)rS   rQ   r¸   Úouts       rT   ri   zBaseSchedulerNode.debug_strÚ   sG  € à�}Š}‰ŒˆÝÑÔˆØ�
Š
àðð Ý	ˆd‰ŒÔ	ðð Ý#¥G¨D°&¸$Ñ$?Ô$?Ñ@Ô@ÔIðð àðð å˜Ô)Ô0Ñ1Ô1ðð ð ðð õ % TÔ%<Ñ=Ô=ðð ð ð	ð õ # 4Ô#3Ô#9¸DÔ<SÑ#SÑTÔTð	ð ð
 ðð ð ñ	
ô 	
ð 	
ð �ZŠZ‰\Œ\ð 	,ð 	,Ø×'Ò'Ñ)Ô)ð ,ð ,�Ø—
’
˜3Ÿ=š=™?œ?Ñ+Ô+Ð+Ð+ð,ð	,ð 	,ð 	,ñ 	,ô 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,øøøð 	,ð 	,ð 	,ð 	,ð 	�Š�cÑÔÐð	HØ�JŠJ�t×+Ò+Ñ-Ô-Ñ.Ô.Ð.Ð.øÝð 	Hð 	Hð 	HÝ�KŠKÐ7À$ˆKÑGÔGÐGÐGÐGð	Høøøð �ŠÑ Ô ×'Ò'Ñ)Ô)Ð)s$   Ã%?D1Ä1D5Ä8D5Å'E: Å:&F#Æ"F#c                ó   — dS )NÚ r�   rR   s    rT   rÕ   z!BaseSchedulerNode.debug_str_extraó   ó   € ØˆrrV   ú	List[str]c                ó,   — |                       | ¦  «        S rO   )r­   rR   s    rT   Ú_debug_str_for_devicez'BaseSchedulerNode._debug_str_for_deviceö   s   € Ø×$Ò$ TÑ*Ô*Ð*rV   c                ó®  — t          | j        dd ¦  «        }d}t          |t          j        j        j        ¦  «        r/d|                     |                     ¦   «         gdd¬¦  «        z   }net          |t          j        j        j	        ¦  «        rAd|                     | 
                    ¦   «         |                     ¦   «         gdd¬¦  «        z   }| › |› �S )NÚdatarÜ   z, F)ÚshortenÚ	multiline)rÒ   rE   rs   ÚtorchÚ	_inductorr   Ú	PointwiseÚ
str_helperÚget_sizeÚ	ReductionÚget_reduction_sizeÚget_reduction_type)rS   Ú
maybe_dataÚdata_strs      rT   Údebug_str_shortz!BaseSchedulerNode.debug_str_shortù   sã   € Ý˜TœY¨°Ñ5Ô5ˆ
ØˆÝ�j¥%¤/Ô"4Ô">Ñ?Ô?ð 		Ø˜j×3Ò3Ø×$Ò$Ñ&Ô&Ð'°À%ð 4ñ ô ñ ˆHˆHõ ˜
¥E¤OÔ$6Ô$@ÑAÔAð 	Ø˜j×3Ò3Ø×.Ò.Ñ0Ô0°*×2OÒ2OÑ2QÔ2QÐRØØð 4ñ ô ñ ˆHð
 Ð"˜Ð"Ð"Ð"rV   c                ó^   — t                                d| | j        | j        j        ¦  «         d S )Nz(%s: unmet_dependencies = %s, writes = %s)r×   Úinfor¥   r¤   rÓ   rR   s    rT   Úlog_detailszBaseSchedulerNode.log_details  s7   € Ý�ŠØ6ØØÔ#ØÔÔ#ñ		
ô 	
ð 	
ð 	
ð 	
rV   Úself_depr&   Ú	other_depc                ó   — d S rO   r�   )rS   ró   rô   s      rT   Úreorder_loops_by_dep_pairz+BaseSchedulerNode.reorder_loops_by_dep_pair  s	   € ð 	ˆrV   ÚrenamesúDict[str, str]c                ó`   — |                       | j                             |¦  «        ¦  «         d S rO   )Úset_read_writesr¤   Úrename©rS   r÷   s     rT   Úupdate_mutated_namesz&BaseSchedulerNode.update_mutated_names  s-   € Ø×Ò˜TÔ-×4Ò4°WÑ=Ô=Ñ>Ô>Ð>Ð>Ð>rV   Údepr%   c                ó`   — |                       | j                             |¦  «        ¦  «         d S rO   )rú   r¤   Ú	with_read©rS   rþ   s     rT   Úadd_fake_depzBaseSchedulerNode.add_fake_dep  s-   € Ø×Ò˜TÔ-×7Ò7¸Ñ<Ô<Ñ=Ô=Ð=Ð=Ð=rV   r‚   c                óX   — t          d„ |                      ¦   «         D ¦   «         ¦  «        S )Nc              3  óf   K  — | ],}|                      ¦   «         p|                     ¦   «         V — Œ-d S rO   )ra   rc   r·   s     rT   ú	<genexpr>z=BaseSchedulerNode.has_aliasing_or_mutation.<locals>.<genexpr>  sN   è è € ð 
ð 
Ø9<ˆC�OŠOÑÔÐ4 ×!2Ò!2Ñ!4Ô!4ð
ð 
ð 
ð 
ð 
ð 
rV   )Úanyr½   rR   s    rT   Úhas_aliasing_or_mutationz*BaseSchedulerNode.has_aliasing_or_mutation  s<   € Ýð 
ð 
Ø@D×@PÒ@PÑ@RÔ@Rð
ñ 
ô 
ñ 
ô 
ð 	
rV   Úrwc                ó^   — || _         | j         j        | _        |                      ¦   «          d S rO   )r¤   rÔ   r¥   Ú
prune_deps)rS   r  s     rT   rú   z!BaseSchedulerNode.set_read_writes   s.   € ØˆÔØ"&Ô"2Ô"8ˆÔØ�ŠÑÔÐÐÐrV   Úfuture_used_buffersúOrderedSet[str]Úmutation_real_namec                óz   ‡— |                       ¦   «         }t          ˆfd„|D ¦   «         ¦  «        }||z
  | _        d S )Nc                ó<   •— g | ]}‰                      ||¦  «        ‘ŒS r�   )Úget)r²   Úkr  s     €rT   r´   z4BaseSchedulerNode.set_last_usage.<locals>.<listcomp>)  s*   ø€ Ð"VÐ"VÐ"VÀAÐ#5×#9Ò#9¸!¸QÑ#?Ô#?Ð"VÐ"VÐ"VrV   )Úused_or_aliased_buffer_namesr   r»   )rS   r  r  Úused_bufferss     ` rT   Úset_last_usagez BaseSchedulerNode.set_last_usage%  sI   ø€ ð ×8Ò8Ñ:Ô:ˆÝ!Ð"VÐ"VÐ"VÐ"VÈÐ"VÑ"VÔ"VÑWÔWˆØ&Ð)<Ñ<ˆŒˆˆrV   c                óB   — | j         D ]}|                     ¦   «          Œd S rO   )r¾   r�   )rS   r¸   s     rT   Úmark_runzBaseSchedulerNode.mark_run,  s,   € Ø”<ð 	ð 	ˆCØ�LŠL‰NŒNˆNˆNð	ð 	rV   c                ó‚   — t          d„ t          j        | j        j        | j        j        ¦  «        D ¦   «         ¦  «        S )Nc              3  ó$   K  — | ]}|j         V — Œd S rO   ©rQ   ©r²   rþ   s     rT   r  z6BaseSchedulerNode.used_buffer_names.<locals>.<genexpr>1  s8   è è € ð 
ð 
àð ŒHð
ð 
ð 
ð 
ð 
ð 
rV   )r   Ú	itertoolsÚchainr¤   rÔ   rÓ   rR   s    rT   Úused_buffer_namesz#BaseSchedulerNode.used_buffer_names0  sH   € Ýð 
ð 
å ” tÔ'7Ô'=¸tÔ?OÔ?VÑWÔWð
ñ 
ô 
ñ 
ô 
ð 	
rV   c                ó   ‡— t          ¦   «         Šd„ t          j        | j        j        | j        j        ¦  «        D ¦   «         }t          |¦  «        dk    r¨|                     ¦   «         }‰                     |¦  «         t          j
        j                             |¦  «        rH|                     ˆfd„t          j
        j        |                              ¦   «         D ¦   «         ¦  «         t          |¦  «        dk    °¨‰S )Nc                ó   — g | ]	}|j         ‘Œ
S r�   r  r  s     rT   r´   zBBaseSchedulerNode.used_or_aliased_buffer_names.<locals>.<listcomp>9  s*   € ð 
ð 
ð 
àð ŒHð
ð 
ð 
rV   r   c              3  ó$   •K  — | ]
}|‰v¯|V — Œd S rO   r�   )r²   ÚaliasÚ
used_namess     €rT   r  zABaseSchedulerNode.used_or_aliased_buffer_names.<locals>.<genexpr>A  s>   øè è € ð ð àð  JÐ.Ð.ð	 ð /Ð.Ð.Ð.ðð rV   )r   r  r  r¤   rÔ   rÓ   rd   ÚpopÚaddr>   rv   Úname_to_bufferr  Úextendrq   )rS   Údepsrþ   r"  s      @rT   r  z.BaseSchedulerNode.used_or_aliased_buffer_names6  sû   ø€ Ý&0¡l¤lˆ
ð
ð 
å ” tÔ'7Ô'=¸tÔ?OÔ?VÑWÔWð
ñ 
ô 
ˆõ �$‰iŒi˜!ŠmˆmØ—(’(‘*”*ˆCØ�NŠN˜3ÑÔÐÝŒwÔ%×)Ò)¨#Ñ.Ô.ð Ø—’ð ð ð ð å!"¤Ô!7Øô"ç2Ò2Ñ4Ô4ð	ñ ô ñ ô ð õ	 �$‰iŒi˜!Šmˆmð ÐrV   c                óR   ‡ — t          ˆ fd„‰ j        D ¦   «         ¦  «        ‰ _        d S )Nc              3  óB   •K  — | ]}|j         ‰j        j        v¯|V — Œd S rO   )rQ   rD   Úavailable_buffer_names©r²   rþ   rS   s     €rT   r  z/BaseSchedulerNode.prune_deps.<locals>.<genexpr>K  sA   øè è € ð -
ð -
àØŒx˜tœ~ÔDÐDÐDð àDÐDÐDÐDð-
ð -
rV   ©r   r¥   rR   s   `rT   r
  zBaseSchedulerNode.prune_depsJ  sD   ø€ Ý",ð -
ð -
ð -
ð -
àÔ.ð-
ñ -
ô -
ñ #
ô #
ˆÔÐÐrV   c                óº   ‡ ‡— dˆ fd„Št          ˆfd„‰ j        j        D ¦   «         ¦  «        }‰                      ‰ j                             |¦  «        ¦  «         d S )Nrþ   r%   rL   r‚   c                ó´   •— t          | t          ¦  «        sdS ‰j        j        | j                 j        }|                     ¦   «         t          j        j	        v S ©NF)
rs   r(   rD   r}   rQ   rG   r\   r>   rv   Úremoved_operations)rþ   ÚoprS   s     €rT   Úshould_prunez7BaseSchedulerNode.prune_weak_deps.<locals>.should_pruneS  sF   ø€ Ý˜c¥7Ñ+Ô+ð Ø�uØ”Ô+¨C¬HÔ5ÔAˆBØ—;’;‘=”=¥A¤GÔ$>Ð>Ð>rV   c              3  ó2   •K  — | ]} ‰|¦  «        ¯|V — Œd S rO   r�   ©r²   rþ   r2  s     €rT   r  z4BaseSchedulerNode.prune_weak_deps.<locals>.<genexpr>Y  sF   øè è € ð 
ð 
Ø°\°\À#Ñ5FÔ5Fð
Øð
ð 
ð 
ð 
ð 
ð 
rV   ©rþ   r%   rL   r‚   )r   r¤   rÔ   rú   Úremove_reads)rS   Ú	to_remover2  s   ` @rT   Úprune_weak_depsz!BaseSchedulerNode.prune_weak_depsQ  sŒ   øø€ ð	?ð 	?ð 	?ð 	?ð 	?ð 	?õ ð 
ð 
ð 
ð 
ØÔ+Ô1ð
ñ 
ô 
ñ 
ô 
ˆ	ð 	×Ò˜TÔ-×:Ò:¸9ÑEÔEÑFÔFÐFÐFÐFrV   Úname_to_fused_nodeúDict[str, BaseSchedulerNode]c                ó<   — t          | || j        j        ¦  «         d S rO   )Ú_prune_redundant_depsrD   r}   )rS   r9  s     rT   Úprune_redundant_depsz&BaseSchedulerNode.prune_redundant_deps^  s"   € õ 	˜dÐ$6¸¼Ô8RÑSÔSÐSÐSÐSrV   c                óF   — | j         €J ‚| j                              ¦   «         S rO   )rE   Úget_operation_namerR   s    rT   r\   zBaseSchedulerNode.get_namec  r’   rV   c                ó*   — |                       ¦   «         S rO   r¶   rR   s    rT   Úget_first_namez BaseSchedulerNode.get_first_nameg  s   € Ø�}Š}‰ŒÐrV   c                óX   — t          d„ |                      ¦   «         D ¦   «         ¦  «        S )Nc                ó6   — g | ]}|                      ¦   «         ‘ŒS r�   r¶   ©r²   rE   s     rT   r´   z9BaseSchedulerNode.get_operation_names.<locals>.<listcomp>l  s    € ÐHÐHÐH¨t˜4Ÿ=š=™?œ?ÐHÐHÐHrV   )r   Ú	get_nodesrR   s    rT   Úget_operation_namesz%BaseSchedulerNode.get_operation_namesj  s)   € åÐHÐH°t·~²~Ñ7GÔ7GÐHÑHÔHÑIÔIÐIrV   c                ó>   — t          d„ | j        D ¦   «         ¦  «        S )Nc                ó6   — g | ]}|                      ¦   «         ‘ŒS r�   r¶   ©r²   rÚ   s     rT   r´   z6BaseSchedulerNode.get_buffer_names.<locals>.<listcomp>p  s    € ÐBÐBÐB¨c˜3Ÿ<š<™>œ>ÐBÐBÐBrV   )r   r¾   rR   s    rT   Úget_buffer_namesz"BaseSchedulerNode.get_buffer_namesn  s!   € åÐBÐB°T´\ÐBÑBÔBÑCÔCÐCrV   úSequence[BaseSchedulerNode]c                ó   — | gS rO   r�   rR   s    rT   rE  zBaseSchedulerNode.get_nodesr  s	   € ØˆvˆrV   úSequence[SchedulerBuffer]c                ó   — | j         S rO   )r¾   rR   s    rT   r½   zBaseSchedulerNode.get_outputsu  s
   € ØŒ|ÐrV   Úbuf_namerB   c                ó   — | j         |         S rO   )r¿   )rS   rO  s     rT   Ú
get_outputzBaseSchedulerNode.get_outputx  s   € ØÔ# HÔ-Ð-rV   úOptional[torch.device]c                óF   — | j         €J ‚| j                              ¦   «         S rO   )rE   Ú
get_devicerR   s    rT   rT  zBaseSchedulerNode.get_device{  s$   € ØŒyÐ$Ð$Ð$ØŒy×#Ò#Ñ%Ô%Ð%rV   c                óH   — |                       ¦   «         }|d uo
|j        dk    S ©NÚcpu)rT  r^   ©rS   Údevices     rT   Úis_cpuzBaseSchedulerNode.is_cpu  s(   € Ø—’Ñ"Ô"ˆØ˜TÐ!Ð: f¤k°UÒ&:Ð:rV   c                óZ   — |                       ¦   «         }|d uot          |j        ¦  «        S rO   )rT  r;   r^   rX  s     rT   r;   zBaseSchedulerNode.is_gpuƒ  s+   € Ø—’Ñ"Ô"ˆØ˜TÐ!Ð9¥f¨V¬[Ñ&9Ô&9Ð9rV   c                ó   — dS r/  r�   rR   s    rT   Úis_reductionzBaseSchedulerNode.is_reduction‡  ó   € ØˆurV   c                ó   — dS r/  r�   rR   s    rT   Úis_split_scanzBaseSchedulerNode.is_split_scanŠ  r^  rV   c                ó   — dS r/  r�   rR   s    rT   Úis_templatezBaseSchedulerNode.is_template�  r^  rV   c                ó   — dS r/  r�   rR   s    rT   Ú	is_externzBaseSchedulerNode.is_extern�  r^  rV   c                ó   — dS r/  r�   rR   s    rT   Ú
is_foreachzBaseSchedulerNode.is_foreach“  r^  rV   Úread_depúdependencies.Depc                ó   — dS r/  r�   ©rS   rg  s     rT   Úcan_inplacezBaseSchedulerNode.can_inplace–  r^  rV   c                ó   — dS r/  r�   rR   s    rT   Úhas_side_effectsz"BaseSchedulerNode.has_side_effects™  r^  rV   c                ó†	  ‡	— ddl m} t          | t          ¦  «        r°t          j        r¤t          j                             |  	                    ¦   «         t          j        ¦  «        rht          t          j        t          j        j        j        j        ¦  «        rt%          t          j        dd¦  «        �t'          t          j        d¦  «        sdS d„ | j        j        |                      ¦   «                                       ¦   «         D ¦   «         }t1          | j        j        d„ ¬¦  «        }| j        t          j        j        z  | j        j        z  Š	|                      ¦   «         D �]Z}|j        }|€J ‚|                      ¦   «         rM| !                    ¦   «         s9| "                    ¦   «         s%|                     ¦   «         t          j        j#        v rŒp| j        j        D �]Ü}|j$        | j        j%        v r| j        j%        |j$                 }n$| j        j&         '                    |j$        ¦  «        }|�r‡t          j        j(         )                    || ¦  «        �rat          |j*        tV          ¦  «        �sF|j,        €J ‚ˆ	fd	„|j,        D ¦   «         }t[          |¦  «        dk    �r|d
         j.        �r|d
         j        | u �rø|j        ��ðt          |j         /                    ¦   «         t`          j1        t`          j2        t`          j3        f¦  «        �s§|j*        r[t          |j*        j        t`          j4        t`          j5        f¦  «        r+t[          |j         !                    ¦   «         ¦  «        d
k    �sE ||j        ¦  «         ||j        ¦  «        k    �r"t          j        j6         7                    |                     ¦   «         |                     ¦   «         ¦  «         t          t          j        t          j        j        j        j        ¦  «        rlt          j        j8         9                    |                     ¦   «         ¦  «         t          j        j8         9                    |                     ¦   «         ¦  «         |                     ¦   «         t          j        j:        |                     ¦   «         <    n�ŒÞ�Œ\dS )z~
        Decide if there should be inplace updates for the node
        and record the decision in the active kernel.
        r   ©Úbuffer_reuse_keyÚ	mutationsNro   c                ó6   — h | ]}|                      ¦   «         ’ŒS r�   r¶   rD  s     rT   ú	<setcomp>z:BaseSchedulerNode.decide_inplace_update.<locals>.<setcomp>¯  s0   € ð 
ð 
ð 
àð �MŠM‰OŒOð
ð 
ð 
rV   c                ó   — | j         S rO   r  ©Úxs    rT   r¬   z9BaseSchedulerNode.decide_inplace_update.<locals>.<lambda>´  s   € ÀQÄV€ rV   ©Úkeyc                óJ   •— g | ]}|j                              ¦   «         ‰v¯|‘Œ S r�   rk   )r²   rv  Úinconsequential_nodess     €rT   r´   z;BaseSchedulerNode.decide_inplace_update.<locals>.<listcomp>Ô  s;   ø€ ð &ð &ð &àØœ6Ÿ?š?Ñ,Ô,Ð4IÐIÐIð àIÐIÐIrV   r   );Úcodegen.wrapperrp  rs   ÚSchedulerNoder   Úinplace_buffersr>   rv   Úhas_featurerT  r!   ÚINPLACE_BUFFERSrz   rå   ræ   ÚcodegenÚsimdÚ
SIMDKernelrÒ   ry   rD   r9  r\   rE  Úsortedr¤   rÔ   rº   r0  Úcompleted_operationsr½   rE   rp   rq   rr   Úremoved_buffersrQ   r|   r}   r  rw   Ú	can_reuserG   ÚNopKernelSchedulerNoderJ   rd   rk  rt   r   r…   r,   ÚMutationLayoutSHOULDREMOVEÚFallbackKernelr+   ro   Úmake_inplacerq  r$  r{   )
rS   rp  Úfused_nodesÚordered_readsr¸   Úbuf_nodeÚreadÚ	input_bufÚremaining_usesrz  s
            @rT   Údecide_inplace_updatez'BaseSchedulerNode.decide_inplace_updateœ  sj  ø€ ð
 	6Ð5Ð5Ð5Ð5Ð5õ �t�]Ñ+Ô+ð	åÔ&ð	õ ”×#Ò# D§O¢OÑ$5Ô$5µ~Ô7UÑVÔVð	õ
 �qœx­¬Ô)@Ô)EÔ)PÑQÔQð	õ �1œ8 [°$Ñ7Ô7ÐCõ �œ &Ñ)Ô)ð Dð
 ˆFð
ð 
àœÔ9¸$¿-º-¹/¼/ÔJ×TÒTÑVÔVð
ñ 
ô 
ˆõ
 ˜tÔ/Ô5Ð;KÐ;KÐLÑLÔLˆð ŒNÝŒgÔ(ñ)àŒnÔ1ñ2ð 	ð ×#Ò#Ñ%Ô%ð C	ñ C	ˆCØ”xˆHØÐ'Ð'Ð'à×,Ò,Ñ.Ô.ðà×8Ò8Ñ:Ô:ðð ×.Ò.Ñ0Ô0ðð —<’<‘>”>¥Q¤WÔ%<Ð<Ð<ààÔ(Ô.ð 8ñ 8�à”9 ¤Ô EÐEÐEØ $¤Ô EÀdÄiÔ P�I�Ià $¤Ô :× >Ò >¸t¼yÑ IÔ I�Ið ñ1åœÔ,×6Ò6°yÀ$ÑGÔGñ1õ ' yÔ'<Õ>TÑUÔUñ1ð
 %œ?Ð6Ð6Ð6ð&ð &ð &ð &à!*¤ð&ñ &ô &�Nõ ˜NÑ+Ô+¨qÒ0Ñ0Ø*¨1Ô-Ô9ñ 1à*¨1Ô-Ô2°dÐ:Ñ:Ø%œNÑ6Ý *Ø%œN×:Ò:Ñ<Ô<å "¤Ý "Ô 4Ý "Ô =ðñ!ô !ñ 7ð &Ô1ð 7õ !+Ø )Ô 5Ô :Ý!#Ô!2µB´NÐ Cñ!ô !ð 7õ !$ I¤N×$OÒ$OÑ$QÔ$QÑ RÔ RÐUVÒ VÑ Và,Ð,¨Y¬^Ñ<Ô<Ø+Ð+¨C¬HÑ5Ô5ò6ñ 6õ œœ×2Ò2°9×3EÒ3EÑ3GÔ3GÈÏÊÉÌÑXÔXÐXå%ÝœH¥e¤oÔ&=Ô&BÔ&Mñô ð Cõ œHÔ.×2Ò2°9×3EÒ3EÑ3GÔ3GÑHÔHÐHÝœHÔ.×2Ò2°3·<²<±>´>ÑBÔBÐBð &×.Ò.Ñ0Ô0õ œÔ7ØŸLšL™NœNñð ˜ùùðGC	ð C	rV   TÚbufferr9   Ú	only_oncec                óB  — t           j        sd S |r	| j        rd S | j        €J ‚| j                             ¦   «         }g }|D �],}|j        dk    rŒ|                     d¦  «         |                     d¦  «         d|j        › d|j        › �}d|j        v r|d|j        d         › �z   }|                     |¦  «         d|j        v r§|j        d         › }| 	                    d	¦  «        d
         }|                     d| 
                    dd¦  «         
                    dd¦  «         
                    dd¦  «        z   ¦  «         |                     d¦  «         |                     d¦  «         �Œ.t          |¦  «        dk    rd S |                     |¦  «         d| _        d S )Nr³   rÜ   z#pragma CMT ORIGIN:z#pragma CMT ú Úseq_nrz seq_nr:Ústack_traceú|éÿÿÿÿÚ{z{{Ú}z}}rË   ú\z#pragma CMT END ORIGINr   T)r   Úcomment_originr¼   rE   Úget_originsr1  ÚappendÚtargetÚmetaÚsplitÚreplacerd   Ú
writelines)	rS   r’  r“  ÚoriginsÚ	out_linesÚoÚop_info_strr—  Ústack_trace_last_lines	            rT   Úcodegen_originating_infoz*BaseSchedulerNode.codegen_originating_info  sÕ  € õ Ô$ð 	ØˆFàð 	˜œð 	ØˆFØŒyÐ$Ð$Ð$Ø”)×'Ò'Ñ)Ô)ˆØˆ	àð 	%ñ 	%ˆAØŒt�xÒÐàà×Ò˜RÑ Ô Ð à×ÒÐ2Ñ3Ô3Ð3Ø:¨¬Ð:Ð:°´Ð:Ð:ˆKØ˜1œ6Ð!Ð!Ø)Ð,I°q´v¸hÔ7GÐ,IÐ,IÑI�Ø×Ò˜[Ñ)Ô)Ð)Ø ¤Ð&Ð&Ø!"¤¨Ô!6Ð8�Ø(3×(9Ò(9¸#Ñ(>Ô(>¸rÔ(BÐ%Ø× Ò Ø"Ø+×3Ò3°C¸Ñ>Ô>ß’W˜S $Ñ'Ô'ß’W˜T 4Ñ(Ô(ñ)ñô ð ð × Ò Ð!9Ñ:Ô:Ð:Ø× Ò  Ñ$Ô$Ð$ùåˆy‰>Œ>˜QÒÐØˆFð 	×Ò˜)Ñ$Ô$Ð$ØˆŒˆˆrV   c                óŽ  ‡ ‡	‡
‡‡‡— t          ‰ t          ¦  «        rdS t          ‰ t          ¦  «        rt          ‰ j        t          ¦  «        rdS dd„Št          ‰ t
          ¦  «        rY ‰t          ‰                      ¦   «         d         ¦  «        t          ‰                      ¦   «         d         ¦  «        z  ¦  «        Šnt          d¦  «        Št          j
        t          ¦  «        }‰ j        j        ‰ j        j        z  D ]"}||j                                      |¦  «         Œ#t#          d	„ ‰ j        j        D ¦   «         ¦  «        }t#          d
„ ‰ j        j        D ¦   «         ¦  «        }dˆ fd„Št          ‰ t$          ¦  «        r&t#          ˆˆ fd„|D ¦   «         ¦  «        }||z
  }||z
  }d}||z  D ]‘}t'          ˆfd„||         D ¦   «         ¦  «        Š	|t(          j        j        v rt(          j        j        |         }n,|t(          j        j        v rt(          j        j        |         }nŒzdˆ	ˆ
ˆ ˆfd„Š
| ‰
|¦  «        z  }Œ’|S )aM  
        Counting the number of bytes accessed for a kernel is
        surprisingly tricky. In particular, there is a differentiation
        between 'theoretical' memory accesses and practical memory
        accesses. For example, a layernorm kernel may actually access an
        input 3 times, but in theory, it only needs to access its input
        once (and may be optimized to do so through say, persistent
        reductions)

        Another example is that even though a buffer is passed in, we may
        not access the entire buffer. This may occur if we are accessing
        a slice of the buffer. Another tricky case is for indirect
        indexing, where the amount of bytes accessed depends on the
        values of the input.

        What this function aims to compute is the memory accesses for
        worst-case inputs, best-case optimization. What this means is
        that for each buffer we compute the amount of potential accesses in two ways and take the minimum.

        1. Numel in ranges multiplied by number of deps the buffer has
        2. The buffer size
        r   Úsú
sympy.ExprrL   rM   c                óN   — t           j        j                             | d¬¦  «        S )Nr   ©Úfallback)r>   rv   ÚsizevarsÚ	size_hint)r¬  s    rT   Útry_size_hintzEBaseSchedulerNode.get_read_write_buffers_sizes.<locals>.try_size_hintM  s    € Ý”7Ô#×-Ò-¨a¸!Ð-Ñ<Ô<Ð<rV   r   ç    eÍÍAc              3  ó$   K  — | ]}|j         V — Œd S rO   r  r  s     rT   r  zABaseSchedulerNode.get_read_write_buffers_sizes.<locals>.<genexpr>[  s$   è è € ÐFÐF¨˜3œ8ÐFÐFÐFÐFÐFÐFrV   c              3  ó$   K  — | ]}|j         V — Œd S rO   r  r  s     rT   r  zABaseSchedulerNode.get_read_write_buffers_sizes.<locals>.<genexpr>\  s$   è è € ÐHÐH¨˜CœHÐHÐHÐHÐHÐHÐHrV   r¸   rW   ÚsnodesrK  r‚   c                óª   •— ‰j         j        |          j        }t          d„ |D ¦   «         ¦  «        }t	          |t          |¦  «        z
  ¦  «        dk    S )Nc              3  ó$   K  — | ]}|j         V — Œd S rO   )rE   )r²   rh   s     rT   r  zZBaseSchedulerNode.get_read_write_buffers_sizes.<locals>.is_materialized.<locals>.<genexpr>`  s$   è è € Ð!>Ð!>° $¤)Ð!>Ð!>Ð!>Ð!>Ð!>Ð!>rV   r   )rD   r}   rJ   r   rd   )r¸   r·  rJ   Úbuf_usesrS   s       €rT   Úis_materializedzGBaseSchedulerNode.get_read_write_buffers_sizes.<locals>.is_materialized^  sQ   ø€ Ø”NÔ.¨sÔ3Ô9ˆEÝ!Ð!>Ð!>¸Ð!>Ñ!>Ô!>Ñ>Ô>ˆHÝ�x¥*¨VÑ"4Ô"4Ñ4Ñ5Ô5¸Ò9Ð9rV   c              3  ó>   •K  — | ]} ‰|‰j         ¦  «        °|V — Œd S rO   ©r·  )r²   rþ   r»  rS   s     €€rT   r  zABaseSchedulerNode.get_read_write_buffers_sizes.<locals>.<genexpr>d  sJ   øè è € ð )ð )Ø¨_¨_¸SÀ$Ä+Ñ-NÔ-Nð)Øð)ð )ð )ð )ð )ð )rV   c              3  ó   •K  — | ]}‰V — Œd S rO   r�   )r²   rþ   Ú
node_numels     €rT   r  zABaseSchedulerNode.get_read_write_buffers_sizes.<locals>.<genexpr>l  s#   øè è € Ð$RÐ$R°C ZÐ$RÐ$RÐ$RÐ$RÐ$RÐ$RrV   ú(Optional[Union[ir.Buffer, ir.TensorBox]]c                óÎ  •— | sdS t          | j        t          ¦  «        rŸ‰j        j        |                      ¦   «                  j        }d}|D ]o}t          |j        t          ¦  «        sJ ‚t          |j        j        t          ¦  «        r0|j         
                    ¦   «         D ]}| ‰|j        ¦  «        z  }ŒŒm dS |S t          | j        t          j        ¦  «        r-t          ˆfd„|                      ¦   «         D ¦   «         ¦  «        S  ‰	t          |                      ¦   «         ¦  «        ¦  «        }t#          |                      ¦   «         ¦  «        t'          ‰|¦  «        z  S )Nr   c              3  óh   •K  — | ],} ‰t           j                             |¦  «        ¦  «        V — Œ-d S rO   )r>   rv   Ú
get_buffer)r²   Úmut_nameÚget_buf_bytess     €rT   r  zXBaseSchedulerNode.get_read_write_buffers_sizes.<locals>.get_buf_bytes.<locals>.<genexpr>‰  sQ   øè è € ð ð à$ð &˜¥a¤g×&8Ò&8¸Ñ&BÔ&BÑCÔCðð ð ð ð ð rV   )rs   r`   r,   rD   r}   r\   rJ   rE   rF   r+   r½   r   r…   Úsumrr   r=   ré   r7   Ú	get_dtypeÚmin)
r¸   rJ   Útotrh   Ú	sched_bufÚ	buf_elemsÚbuf_accessed_elemsrÅ  rS   r³  s
         €€€€rT   rÅ  zEBaseSchedulerNode.get_read_write_buffers_sizes.<locals>.get_buf_bytesu  sx  ø€ Øð Ø˜1õ ˜cœjÕ*;Ñ<Ô<ð Ø œNÔ6°s·|²|±~´~ÔFÔL�EØ�CØ %ð 	%ð 	%˜Ý)¨$¬)Õ5FÑGÔGÐGÐGÐGÝ% d¤i¤nµkÑBÔBð %Ø-1¬Y×-BÒ-BÑ-DÔ-Dð Eð E 	Ø # } }°Y´^Ñ'DÔ'DÑ D  ðEð $% 1 1Ø�JÝ ¤
­B¬MÑ:Ô:ð 	Ýð ð ð ð à(+×(>Ò(>Ñ(@Ô(@ðñ ô ñ ô ð ð
 !. ­m¸C¿LºL¹N¼NÑ.KÔ.KÑ LÔ L�IÝ)¨#¯-ª-©/¬/Ñ:Ô:½SØ*¨Iñ>ô >ñ ð rV   )r¬  r­  rL   rM   )r¸   rW   r·  rK  rL   r‚   )r¸   rÀ  rL   rM   )rs   r‡  ÚExternKernelSchedulerNoderE   r+   r|  r=   Ú
get_rangesrM   Úcollectionsr   rŒ   r¤   rÔ   rÓ   rQ   rŸ  r   ÚFusedSchedulerNoderÆ  r>   rv   r%  Úgraph_inputs)rS   Úbuf_accessesrþ   rÔ   rÓ   r…  Ú
node_bytesrO  r¸   rÌ  rÅ  r»  r¿  r³  s   `        @@@@@rT   Úget_read_write_buffers_sizesz.BaseSchedulerNode.get_read_write_buffers_sizes-  sº  øøøøøø€ õ0 �dÕ2Ñ3Ô3ð 	Ø�1Ý�dÕ5Ñ6Ô6ð 	½:ØŒI•{ñ<
ô <
ð 	ð �1ð	=ð 	=ð 	=ð 	=õ �d�MÑ*Ô*ð 	"Ø&˜Ý˜dŸošoÑ/Ô/°Ô2Ñ3Ô3Ý §¢Ñ 1Ô 1°!Ô 4Ñ5Ô5ñ6ñô ˆJˆJõ
 ˜S™œˆJÝ"Ô.­tÑ4Ô4ˆØÔ#Ô)¨DÔ,<Ô,CÑCð 	/ð 	/ˆCØ˜œÔ"×)Ò)¨#Ñ.Ô.Ð.Ð.åÐFÐF¨tÔ/?Ô/EÐFÑFÔFÑFÔFˆÝÐHÐH°Ô0@Ô0GÐHÑHÔHÑHÔHˆð	:ð 	:ð 	:ð 	:ð 	:ð 	:õ
 �dÕ.Ñ/Ô/ð 	,Ý(ð )ð )ð )ð )ð )Ø%ð)ñ )ô )ñ ô ˆOð ˜oÑ-ˆFØ˜OÑ+ˆEØˆ
à ™ð (	-ð (	-ˆHÝ!$Ð$RÐ$RÐ$RÐ$R¸<ÈÔ;QÐ$RÑ$RÔ$RÑ!RÔ!RÐà�1œ7Ô1Ð1Ð1Ý”gÔ,¨XÔ6��Ø�QœWÔ1Ð1Ð1Ý”gÔ*¨8Ô4��àðð ð ð ð ð ð ð ð ð< ˜-˜-¨Ñ,Ô,Ñ,ˆJˆJàÐrV   Úfloatc           	     ó¢  ‡— |                       ¦   «         d                              ¦   «         d         }|j                             ¦   «         }t	          t          |¦  «        ¦  «        sdS t          | j        ¦  «        r•t          | j        t          j	        ¦  «        sJ ‚	 t          | j        ¦  «        S # t          $ r%}t                               |¦  «         Y d}~dS d}~wt          $ r%}t                               |¦  «         Y d}~dS d}~ww xY wt          | j        ¦  «        rdS |j                             ¦   «         }	 t#          ¦   «         }t%          |¦  «        dz  }n# t&          $ r Y dS w xY wt          | t(          ¦  «        �rýt          | j        t          j        ¦  «        sJ dt-          | j        ¦  «        ›�¦   «         ‚t.                               t3          | j        dd¦  «        d¦  «        }|��Œddlm} ddlm}	 t=          d	„ | j        j        D ¦   «         ¦  «        rdS  |¦   «         5 }
 |	d
¬¦  «        5 }tA          j!        | j        j"        ¦  «        5  tA          j#        |
¦  «        5  ddlm$Š ˆfd„| j        j        D ¦   «         }| j        j%        } |j&        |g|¢R i | j        j'        ¤Ž d}| (                    ¦   «         }|  )                    ¦   «         }||z  |z  dz  }||z  }tU          ||¦  «        cddd¦  «         cddd¦  «         cddd¦  «         cddd¦  «         S # 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   nFt          | tV          ¦  «        st          | j        tX          ¦  «        r|  )                    ¦   «         |z  S dS )zB
        Returns estimated op runtime in nanoseconds (ns)
        r   Nl    J)£útype(self.node)=Úpython_kernel_namerÜ   )ÚFakeTensorMode)ÚFlopCounterModec              3  óz   K  — | ]6}t          t          |                     ¦   «         ¦  «        ¦  «        d k    V — Œ7dS ©r   N)rd   r   Ú	get_numel©r²   Úns     rT   r  z:BaseSchedulerNode.get_estimated_runtime.<locals>.<genexpr>Ê  sT   è è € ð ð àõ Õ-¨a¯kªk©m¬mÑ<Ô<Ñ=Ô=ÀÒAðð ð ð ð ð rV   F)Údisplayr   )Úir_node_to_tensorc                ó*   •— g | ]} ‰|d ¬¦  «        ‘ŒS )F)Úguard_shaper�   )r²   Úinputrá  s     €rT   r´   z;BaseSchedulerNode.get_estimated_runtime.<locals>.<listcomp>Û  s9   ø€ ð #ð #ð #à!ð *Ð)¨%¸UÐCÑCÔCð#ð #ð #rV   g      ð?r´  )-rE  r½   rE   rt   r;   r*   r:   rs   r   ÚIRNoder$   Ú
ValueErrorr×   rñ   Ú	TypeErrorr<   Úmaybe_get_dtyper8   r6   rÖ   rÍ  ÚExternKernelr^   Úkernel_name_to_opr  rÒ   Útorch._subclasses.fake_tensorrÙ  Útorch.utils.flop_counterrÚ  r  Úinputsr>   Úset_current_nodeÚfx_nodeÚset_fake_moderá  Ú	__class__Úprocess_kernelr«   Úget_total_flopsrÔ  ÚmaxrÐ  r)   )rS   r¸   r`   ÚeÚdtypeÚgpu_memory_bandwidthÚ	gpu_flopsr1  rÙ  rÚ  Ú	fake_modeÚflop_counter_modeÚfake_inputsÚclsÚfactorÚcounted_flopsÚcounted_bytesÚcompute_timeÚtransfer_timerá  s                      @rT   Úget_estimated_runtimez'BaseSchedulerNode.get_estimated_runtime—  sˆ  ø€ ð
 �nŠnÑÔ˜qÔ!×-Ò-Ñ/Ô/°Ô2ˆØ”×)Ò)Ñ+Ô+ˆÝ•o fÑ-Ô-Ñ.Ô.ð 	à�1õ ˜œÑ#Ô#ð 	Ý˜dœi­¬Ñ3Ô3Ð3Ð3Ð3ð
Ý7¸¼	ÑBÔBÐBøÝð ð ð õ —’˜‘”�Ø�q�q�q�q�qøøøøÝð ð ð å—’˜‘”�Ø�q�q�q�q�qøøøøðøøøõ
 �T”YÑÔð 	ð
 �1à”×(Ò(Ñ*Ô*ˆð	Ý#4Ñ#6Ô#6Ð Ý)¨%Ñ0Ô0°6Ñ9ˆIˆIøÝð 	ð 	ð 	Ø�1�1ð	øøøõ �dÕ5Ñ6Ô6ñ 1	NÝ˜dœi­¬Ñ9Ô9ÐPÐPÐ;P½dÀ4Ä9¹o¼oÐ;PÐ;PÑPÔPÐ9Ý"×&Ò&Ý˜œ	Ð#7¸Ñ<Ô<¸dñô ˆBð
 ‰~ØHÐHÐHÐHÐHÐHØDÐDÐDÐDÐDÐDåð ð à!œYÔ-ðñ ô ñ ô ð ð ˜1à#�^Ñ%Ô%ð <¨°O°OØ!ð5ñ 5ô 5ð <à&­Ô(:Ø”IÔ%ñ)ô )ð<ð <õ ”?Øñô ð	<ð <ð 6Ð5Ð5Ð5Ð5Ð5ð#ð #ð #ð #à%)¤YÔ%5ð#ñ #ô #�Kð œ)Ô-�CØ&�CÔ& rÐL¨KÐLÐLÐL¸4¼9Ô;KÐLÐLÐLð !�FØ$5×$EÒ$EÑ$GÔ$G�MØ$(×$EÒ$EÑ$GÔ$G�MØ$*¨]Ñ$:¸YÑ$FÈ#Ñ#M�LØ$1Ð4HÑ$H�Mõ ˜|¨]Ñ;Ô;ð1<ð <ð <ð <ñ <ô <ð <ð <ð <ð <ð <ñ <ô <ð <ð <ð <ð <ð <ñ <ô <ð <ð <ð <ð <ð <ñ <ô <ð <ð <ð <ð <ð <ð <øøøð <ð <ð <ð <ð <ð <ð <ñ <ô <ð <ð <ð <ð <ð <ð <øøøð <ð <ð <ð <ð <ð <ð <ñ <ô <ð <ð <ð <ð <ð <ð <øøøð <ð <ð <ð <ð <ð <ð <ñ <ô <ð <ð <ð <ð <ð <ð <øøøð <ð <ð <ð <øõ4 ˜Õ0Ñ1Ô1ð 	NµZØŒI•~ñ6
ô 6
ð 	Nð ×4Ò4Ñ6Ô6Ð9MÑMÐMàˆqsÁ   Â!B5 Â5
DÂ?CÃDÃ,DÄDÅ E% Å%
E3Å2E3È7M=ÉM&É#MÉ8BL8	ÌMÌM&ÌM=Ì8L<Ì<MÌ?L<Í MÍM&ÍMÍM&ÍMÍM&ÍM=Í&M*	Í*M=Í-M*	Í.M=Í=NÎNúOptional[ir.TemplateBuffer]c                ó   — d S rO   r�   rR   s    rT   Úget_template_nodez#BaseSchedulerNode.get_template_nodeô  ó   € ØˆtrV   N)rD   rC   rL   rm   )rE   r¯   rL   rm   r”   )rL   rÞ   r•   ©ró   r&   rô   r&   rL   rm   ©r÷   rø   rL   rm   )rþ   r%   rL   rm   r–   )r  r£   rL   rm   ©r  r  r  rø   rL   rm   ©rL   r  ©r9  r:  rL   rm   ©rL   rK  )rL   rM  )rO  rW   rL   rB   ©rL   rR  ©rg  rh  rL   r‚   )T)r’  r9   r“  r‚   rL   rm   r“   )rL   rÕ  ©rL   r  )/r_   r˜   r™   rš   r®   rÁ   rÅ   ri   rÕ   rà   rï   rò   rö   rý   r  r  rú   r  r  r  r  r
  r8  r=  r\   rA  r3   rF  rJ  rE  r½   rQ  rT  rZ  r;   r]  r`  rb  rd  rf  rk  rm  r‘  rª  rÔ  r  r  r�   rV   rT   rF   rF   ±   s   € € € € € € ØBÐBÐBÑBØ(Ð(Ð(Ñ(Ø'Ð'Ð'Ñ'ð €N€N�NØ€N€N�NØ'Ð'Ð'Ñ'ð'ð 'ð 'ð 'ð
ð 
ð 
ð 
ð&Bð Bð Bð Bð*ð *ð *ð *ð2ð ð ð ð+ð +ð +ð +ð#ð #ð #ð #ð
ð 
ð 
ð 
ðð ð ð ð
?ð ?ð ?ð ?ð>ð >ð >ð >ð
ð 
ð 
ð 
ð
ð ð ð ð
=ð =ð =ð =ðð ð ð ð
ð 
ð 
ð 
ðð ð ð ð(
ð 
ð 
ð 
ðGð Gð Gð GðTð Tð Tð Tð
.ð .ð .ð .ðð ð ð ð ðJð Jð Jñ „]ðJð ðDð Dð Dñ „]ðDðð ð ð ðð ð ð ð.ð .ð .ð .ð&ð &ð &ð &ð;ð ;ð ;ð ;ð:ð :ð :ð :ðð ð ð ðð ð ð ðð ð ð ðð ð ð ðð ð ð ðð ð ð ðð ð ð ðcð cð cð cðL 9=ð*ð *ð *ð *ð *ðX ðgð gð gñ „]ðgðR ðZð Zð Zñ „]ðZðxð ð ð ð ð rV   rF   c                  óD   — e Zd ZU g d¢Zded<   ded<   dd„Zdd„Zdd„ZdS )Ú	WhyNoFuse)Únode1Únode2Úreasonro   rW   r  zTuple[Any, ...]ro   r  rF   r  rL   rm   c                ó"   — || _         || _        d S rO   )r  r  ©rS   r  r  s      rT   r®   zWhyNoFuse.__init__ÿ  s   € ØˆŒ
ØˆŒ
ˆ
ˆ
rV   r   c                óV   — || _         || _        t                               | ¦  «         d S rO   )r  ro   Ú
fusion_logÚdebug)rS   r  ro   s      rT   Ú__call__zWhyNoFuse.__call__  s*   € ØˆŒØˆŒ	Ý×Ò˜ÑÔÐÐÐrV   c                ó�   — d| j                              ¦   «         › d| j                             ¦   «         › d�| j        | j        z  z   S )Nzcannot fuse z with rY   )r  r\   r  r  ro   rR   s    rT   Ú__str__zWhyNoFuse.__str__  sJ   € ØT˜dœj×1Ò1Ñ3Ô3ÐTÐT¸4¼:×;NÒ;NÑ;PÔ;PÐTÐTÐTØŒK˜$œ)Ñ#ñ
ð 	
rV   N)r  rF   r  rF   rL   rm   )r  rW   ro   r   rL   rm   r”   )r_   r˜   r™   Ú	__slots__rš   r®   r  r  r�   rV   rT   r  r  ø  st   € € € € € € ð 5Ð4Ð4€IØ€K€K�KØÐÐÑðð ð ð ðð ð ð ð

ð 
ð 
ð 
ð 
ð 
rV   r  Úobjr   rL   rW   c                óÀ   — t          | t          ¦  «        rt          | t          ¬¦  «        } t	          j        | d¬¦  «        }d|v rdt          j        |d¦  «        › �S |S )Nrw  é   )re   rË   ú    )rs   r   rƒ  rW   Úpprintrb   Útextwrapre   )r  rg   s     rT   rb   rb     sb   € Ý�#•zÑ"Ô"ð #å�S�cÐ"Ñ"Ô"ˆÝŒ^˜C¨Ð*Ñ*Ô*€FØˆv€~€~Ø6•H”O F¨GÑ4Ô4Ð6Ð6Ð6Ø€MrV   c                  ó2   — e Zd Zdd„Zdd„Zdd	„Zdd„ZeZdS )r†   rþ   r'   rL   rm   c                ó0   — t          |g¦  «        | _        d S rO   r,  r  s     rT   r®   zOutputNode.__init__  s   € Ý",¨c¨UÑ"3Ô"3ˆÔÐÐrV   r‚   c                ó   — dS r/  r�   rR   s    rT   r]  zOutputNode.is_reduction  r^  rV   r�   c                ó   — dS )Nr�   r�   rR   s    rT   rq   z'OutputNode.get_inputs_that_alias_output  rÝ   rV   rW   c                ó   — dS )NÚOUTPUTr�   rR   s    rT   r\   zOutputNode.get_name"  s   € ØˆxrV   N)rþ   r'   rL   rm   r–   r—   r”   )r_   r˜   r™   r®   r]  rq   r\   rÅ   r�   rV   rT   r†   r†     se   € € € € € ð4ð 4ð 4ð 4ðð ð ð ðð ð ð ðð ð ð ð €H€H€HrV   r†   rE   r9  r:  r}   úDict[str, SchedulerBuffer]rm   c                óÞ  ‡ ‡‡‡‡— t          j        ¦   «         Š‰ j        D ]c}t          |t          ¦  «        sL‰|j                 j        }‰‰|                     ¦   «                                       ¦   «         xx         dz  cc<   Œdd	ˆˆˆˆ fd„Št          ˆfd„‰ j        D ¦   «         ¦  «        }|r>‰ j        |z
  ‰ _        ‰  	                    ‰ j
                             |¦  «        ¦  «         dS dS )
am  
    Prunes weakdeps intended for mutation ordering
    on an upstream fused node if after fusion there is another dependency
    on the fused upstream node, making the weakdep redundant

    In essence this enforces an ordering on fusions. As fusions occur, weakdeps will
    be incrementally removed, enabling other fusions, ensuring they are fused in order.
    r   rþ   r%   rL   r‚   c                óâ   •— t          | t          ¦  «        rX‰| j                 j                             ¦   «         }‰‰|                              ¦   «                  dk    }‰|         ‰k    }|p|S dS )Nr   F)rs   r(   rQ   rG   r\   )rþ   Úop_nameÚis_redundantÚis_self_depr}   Úname_to_dep_countr9  rE   s       €€€€rT   r2  z+_prune_redundant_deps.<locals>.should_prune<  ss   ø€ Ý�c�7Ñ#Ô#ð 		Ø! #¤(Ô+Ô7×@Ò@ÑBÔBˆGØ,Ð-?ÀÔ-H×-QÒ-QÑ-SÔ-SÔTÐWXÒXˆLð -¨WÔ5¸Ò=ˆKØÐ. ;Ð.à�5rV   c              3  ó2   •K  — | ]} ‰|¦  «        ¯|V — Œd S rO   r�   r4  s     €rT   r  z(_prune_redundant_deps.<locals>.<genexpr>H  sF   øè è € ð ð Ø°,°,¸sÑ2CÔ2CðØðð ð ð ð ð rV   Nr5  )rÏ  r   r¥   rs   r(   rQ   rG   r\   r   rú   r¤   r6  )rE   r9  r}   rþ   r1  Údeps_to_pruner0  r2  s   ```   @@rT   r<  r<  (  s>  øøøøø€ õ '2Ô&9Ñ&;Ô&;ÐàÔ&ð Qð QˆÝ˜#�wÑ'Ô'ð 	QØ˜SœXÔ&Ô2ˆBØÐ0°·²±´Ô?×HÒHÑJÔJÐKÐKÔKÈqÑPÐKÐKÑKøð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
õ ð ð ð ð ØÔ.ðñ ô ñ ô €Mð ð KØ"&Ô"9¸MÑ"IˆÔØ×Ò˜TÔ-×:Ò:¸=ÑIÔIÑJÔJÐJÐJÐJðKð KrV   )zextern_kernels.convolutionzextern_kernels.mmzextern_kernels.bmmzextern_kernels.addmmc                  ó8   ‡ — e Zd Zdˆ fd„Zdd	„Zdd„Zdd„Zˆ xZS )rÍ  rD   rC   rE   r¯   rL   rm   c                óÂ   •— t          ¦   «                              |¦  «         |                      |¦  «         |                      |                     ¦   «         ¦  «         d S rO   ©Úsuperr®   rÁ   rú   Úget_read_writes©rS   rD   rE   rñ  s      €rT   r®   z"ExternKernelSchedulerNode.__init__[  óU   ø€ Ý‰Œ×Ò˜Ñ#Ô#Ð#Ø×Ò˜TÑ"Ô"Ð"Ø×Ò˜T×1Ò1Ñ3Ô3Ñ4Ô4Ð4Ð4Ð4rV   rW   c                ó\   — |                       ¦   «         › dt          | j        dd ¦  «        › �S )Nz.node.kernel = rØ  )r\   rÒ   rE   rR   s    rT   rÕ   z)ExternKernelSchedulerNode.debug_str_extra`  s.   € Ø—-’-‘/”/ÐbÐbµ'¸$¼)ÐEYÐ[_Ñ2`Ô2`ÐbÐbÐbrV   r‚   c                ó   — dS ©NTr�   rR   s    rT   rd  z#ExternKernelSchedulerNode.is_externc  r  rV   c                óp   — | j         €J ‚t          | j         d¦  «        o| j                              ¦   «         S )Nrm  )rE   ry   rm  rR   s    rT   rm  z*ExternKernelSchedulerNode.has_side_effectsf  s6   € ØŒyÐ$Ð$Ð$Ý�t”yÐ"4Ñ5Ô5ÐV¸$¼)×:TÒ:TÑ:VÔ:VÐVrV   ©rD   rC   rE   r¯   rL   rm   r”   r–   )r_   r˜   r™   r®   rÕ   rd  rm  Ú__classcell__©rñ  s   @rT   rÍ  rÍ  Z  s…   ø€ € € € € ð5ð 5ð 5ð 5ð 5ð 5ð
cð cð cð cðð ð ð ðWð Wð Wð Wð Wð Wð Wð WrV   rÍ  c                  ó    ‡ — e Zd Zdˆ fd„Zˆ xZS )	r‡  rD   rC   rE   r¯   rL   rm   c                óÂ   •— t          ¦   «                              |¦  «         |                      |¦  «         |                      |                     ¦   «         ¦  «         d S rO   r5  r8  s      €rT   r®   zNopKernelSchedulerNode.__init__l  r9  rV   r>  )r_   r˜   r™   r®   r?  r@  s   @rT   r‡  r‡  k  s=   ø€ € € € € ð5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5rV   r‡  c                  óê   ‡ — e Zd ZU ded<   ded<   d3ˆ fd„Z	 	 d4d5d„Z	 	 d4d5d„Zd6d„Zd7d„Zd8d„Z	d9d„Z
d:d „Zd;d!„Zd;d"„Zd;d#„Zd<d%„Zd=d(„Zd>d*„Zd?d+„Zed@d-„¦   «         ZdAd0„ZedBd2„¦   «         Zˆ xZS )Cr|  z Tuple[Sequence[sympy.Expr], ...]Ú_sizesr-   Ú_bodyrD   rC   rE   ú+Union[ir.ComputedBuffer, ir.TemplateBuffer]rL   rm   c                óœ   •— t          ¦   «                              |¦  «         |                      |¦  «         |                      ¦   «          d S rO   )r6  r®   rÁ   Ú_compute_attrsr8  s      €rT   r®   zSchedulerNode.__init__v  sI   ø€ õ
 	‰Œ×Ò˜Ñ#Ô#Ð#Ø×Ò˜TÑ"Ô"Ð"Ø×ÒÑÔÐÐÐrV   NÚextra_indexing_constraintsú*Optional[Tuple[Dict[Any, Any], List[Any]]]Úrecompute_sizes_body_funcúOptional[Callable[..., Any]]c                ó–  — t          | j        t          j        t          j        f¦  «        sJ ‚| j                             ||¬¦  «        \  | _        | _        | j                             ¦   «         }| j	         
                    |¦  «        j        }| || j        ¦  «        f| _        t          j         pt          |j        ¦  «         }t          | j        t          j        ¦  «        r0|                      | j                             |¬¦  «        ¦  «         d S |                      t'          j        | j        g| j        ¢R d|iŽ¦  «         d S )N©rI  rK  ©Ú	normalizerP  )rs   rE   r   r)   ÚTemplateBufferÚsimplify_and_reorderrD  rE  Úget_device_or_errorrD   Úget_backendÚgroup_fnr¢   r   Úloop_ordering_after_fusionr;   r^   rú   Úextract_read_writesr   )rS   rI  rK  rY  rU  Úshould_normalizes         rT   rH  zSchedulerNode._compute_attrs  sk  € õ
 ˜$œ)¥bÔ&7½Ô9JÐ%KÑLÔLÐLÐLÐLØ"&¤)×"@Ò"@Ø'AØ&?ð #Añ #
ô #
ÑˆŒ�T”Zð
 ”×.Ò.Ñ0Ô0ˆØ”>×-Ò-¨fÑ5Ô5Ô>ˆØ˜h˜h t¤{Ñ3Ô3Ð4ˆŒ
õ  &Ô@Ð@ð 
ÍØŒKñI
ô I
ð E
Ðõ �d”i¥Ô!2Ñ3Ô3ð 		Ø× Ò Ø”	×-Ò-Ð8HÐ-ÑIÔIñô ð ð ð ð × Ò ÝÔ0Ø”JðØ!%¤ðð ð Ø8Hðð ñô ð ð ð rV   c                ó4   — |                       ||¬¦  «         d S )NrN  )rH  )rS   rI  rK  s      rT   Úrecompute_size_and_bodyz%SchedulerNode.recompute_size_and_bodyŸ  s1   € ð
 	×ÒØ'AØ&?ð 	ñ 	
ô 	
ð 	
ð 	
ð 	
rV   rP  r‚   c                ó¼   — d„ | j         j        D ¦   «         }|                      t          j        | j        g| j        ¢R d|iŽ                     |¦  «        ¦  «         d S )Nc                óJ   — h | ] }t          |t          t          f¦  «        ¯|’Œ!S r�   )rs   r(   r'   r  s     rT   rs  z5SchedulerNode.refresh_dependencies.<locals>.<setcomp>¬  s<   € ð 
ð 
ð 
ØµZÀÅgÍwÐEWÑ5XÔ5Xð
Øð
ð 
ð 
rV   rP  )r¤   rÔ   rú   r   rW  rE  rD  r   )rS   rP  Ú	fake_depss      rT   Úrefresh_dependenciesz"SchedulerNode.refresh_dependencies©  sˆ   € ð
ð 
ØÔ+Ô1ð
ñ 
ô 
ˆ	ð 	×ÒÝÔ,Ø”
ðØ!œ[ðð ð Ø4=ðð çŠi˜	Ñ"Ô"ñ	
ô 	
ð 	
ð 	
ð 	
rV   Ú	new_orderúSequence[int]c                ó  — | j                              |¦  «        | _         | j         j        | _        |                      d¬¦  «         ddlm} |j                             ¦   «          | j	         
                    | ¦  «         d S )NFrO  r   ©ÚSIMDScheduling)rE  Úreorder_iter_loopsÚsizesrD  r^  Úcodegen.simdrc  Úcandidate_tilingsÚcache_clearÚpointwise_read_writesÚclear_cache)rS   r_  rc  s      rT   Úapply_new_loop_orderz"SchedulerNode.apply_new_loop_order¸  s‰   € Ø”Z×2Ò2Øñ
ô 
ˆŒ
ð ”jÔ&ˆŒà×!Ò!¨EÐ!Ñ2Ô2Ð2à0Ð0Ð0Ð0Ð0Ð0ð 	Ô(×4Ò4Ñ6Ô6Ð6ØÔ"×.Ò.¨tÑ4Ô4Ð4Ð4Ð4rV   ró   r&   rô   c                ó®  — d }| j         d         }t          |¦  «        |j        cxk    r|j        k    rn n|                     |¦  «        }|rZt          xj        dz  c_        t                               d|                      ¦   «         |¦  «         |  	                    |¦  «         d S t                               d|                      ¦   «         ¦  «         d S )Nr   r   z"Reorder loops for %s with order %szEDon't reordering %s because we can not decide the suitable loop order)
rD  rd   Únum_varsÚdecide_loop_order_to_matchr    Únum_loop_reorderingÚloop_ordering_logr  r\   rk  )rS   ró   rô   r_  Ú
self_sizess        rT   rö   z'SchedulerNode.reorder_loops_by_dep_pairÉ  sä   € ð ˆ	Ø”[ ”^ˆ
Ýˆz‰?Œ?˜hÔ/ÐEÐEÒEÐE°9Ô3EÒEÐEÐEÐEÐEØ ×;Ò;¸IÑFÔFˆIàð 
	ÝÐ'Ô'¨1Ñ,Ð'Ô'Ý×#Ò#Ø4°d·m²m±o´oÀyñô ð ð ×%Ò% iÑ0Ô0Ð0Ð0Ð0å×#Ò#ØWØ—’‘”ñô ð ð ð rV   rW   c                óü  — |                       ¦   «         }|› d| j        d         › �|› d| j        d         › �|› d| j        › �g}| j                             ¦   «         D ]i}t          |t          ¦  «        sR|j        }t          j	         
                    |¦  «        }|                     |› dt          |j        ¦  «        › �¦  «         Œjt          | j        t          ¦  «        rX|                     d|› d�¦  «         |                     t!          j        | j                             ¦   «         d	¦  «        ¦  «         | j        €J ‚|                     |                      ¦   «         ¦  «         d
                     |¦  «        S )Nz.group.device = r   z.group.iteration = r   z	.sizes = z
_layout = zclass z_loop_body:r!  rË   )r\   r¢   rD  r¤   Úreads_and_writesrs   r(   rQ   r>   rv   rÃ  rŸ  rb   r`   rE  r-   r#  re   ri   rE   r&  rà   Újoin)rS   rQ   Úlinesrþ   rO  r¸   s         rT   rÕ   zSchedulerNode.debug_str_extraÝ  sp  € Ø�}Š}‰ŒˆàÐ4Ð4 T¤Z°¤]Ð4Ð4ØÐ7Ð7¨¬
°1¬Ð7Ð7ØÐ+Ð+˜dœkÐ+Ð+ð
ˆð
 Ô#×4Ò4Ñ6Ô6ð 	Kð 	KˆCÝ˜c¥7Ñ+Ô+ð KØœ8�Ý”g×(Ò(¨Ñ2Ô2�Ø—’ ÐIÐIµG¸C¼JÑ4GÔ4GÐIÐIÑJÔJÐJøÝ�d”j¥(Ñ+Ô+ð 	JØ�LŠLÐ3 $Ð3Ð3Ð3Ñ4Ô4Ð4Ø�LŠL�œ¨¬×)=Ò)=Ñ)?Ô)?ÀÑHÔHÑIÔIÐIàŒyÐ$Ð$Ð$Ø�Š�T×/Ò/Ñ1Ô1Ñ2Ô2Ð2à�yŠy˜ÑÔÐrV   úSequence[Sequence[sympy.Expr]]c                ó   — | j         S rO   )rD  rR   s    rT   rÎ  zSchedulerNode.get_rangesò  ó
   € ØŒ{ÐrV   c                óâ   — t          | j        t          j        t          j        f¦  «        sJ dt          | j        ¦  «        ›�¦   «         ‚t          | j                             ¦   «         ¦  «        S ©Nr×  )rs   rE   r   r)   rQ  r^   r‚   rì   rR   s    rT   r]  zSchedulerNode.is_reductionõ  sk   € ÝØŒI�Ô)­2Ô+<Ð=ñ
ô 
ð 	!ð 	!à �d�4”9‰oŒoÐ Ð ñ	!ô 	!ð 
õ �D”I×0Ò0Ñ2Ô2Ñ3Ô3Ð3rV   c                ó  — t          | j        t          j        t          j        f¦  «        sJ dt          | j        ¦  «        ›�¦   «         ‚t          | j        t          j        ¦  «        o#t          | j        j        t          j        ¦  «        S rz  )rs   rE   r   r)   rQ  r^   râ   Ú	SplitScanrR   s    rT   r`  zSchedulerNode.is_split_scanû  s‚   € ÝØŒI�Ô)­2Ô+<Ð=ñ
ô 
ð 	!ð 	!à �d�4”9‰oŒoÐ Ð ñ	!ô 	!ð 
õ ˜$œ)¥RÔ%6Ñ7Ô7ð 
½JØŒIŒN�BœLñ=
ô =
ð 	
rV   c                ó@   — t          | j        t          j        ¦  «        S rO   ©rs   rE   r   rQ  rR   s    rT   rb  zSchedulerNode.is_template  s   € Ý˜$œ)¥RÔ%6Ñ7Ô7Ð7rV   r  c                óR   — t          | j        t          j        ¦  «        r| j        nd S rO   r~  rR   s    rT   r  zSchedulerNode.get_template_node  s"   € Ý& t¤yµ"Ô2CÑDÔDÐNˆtŒyˆyÈ$ÐNrV   Ú
index_varsúSequence[sympy.Expr]c                ó€   — |                       ¦   «          |                      ¦   «          |                      |¦  «         d S rO   )r‘  r  r€  )rS   r€  s     rT   ÚrunzSchedulerNode.run	  s9   € Ø×"Ò"Ñ$Ô$Ð$Ø�Š‰ŒˆØ�Š�ZÑ Ô Ð Ð Ð rV   úDict[sympy.Expr, sympy.Expr]c                óR  — | j         }t          t          t          |¦  «        ¦  «        t          t          t          |¦  «        ¦  «        k    sJ ‚t	          t          t          j                             |¦  «        t          j                             |¦  «        ¦  «        ¦  «        }|S rO   )	rD  rÆ  Úmaprd   ÚdictÚzipr  r  Úfrom_iterable)rS   r€  re  Ú
var_rangess       rT   Úranges_from_index_varsz$SchedulerNode.ranges_from_index_vars  sˆ   € ð ”ˆÝ•3•s˜E‘?”?Ñ#Ô#¥s­3­s°JÑ+?Ô+?Ñ'@Ô'@Ò@Ð@Ð@Ð@ÝÝÝ”×-Ò-¨jÑ9Ô9Ý”×-Ò-¨eÑ4Ô4ñô ñ
ô 
ˆ
ð ÐrV   c                óª  — |                       |¦  «        }	 t          j        t          t          j        ¦   «         |¦  «        ¦  «        5  t          j                             | ¦  «        5   | j        |Ž  d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S # t          $ r" t           
                    d| j        ¦  «         ‚ w xY w)NzError in codegen for %s)r‹  r>   Úset_ops_handlerr2   Úget_ops_handlerrz   rî  rE  rÖ   r×   ÚfatalrE   )rS   r€  rŠ  s      rT   r€  zSchedulerNode.codegen  sZ  € Ø×0Ò0°Ñ<Ô<ˆ
ð	ÝÔ"Ý ¥Ô!2Ñ!4Ô!4°jÑAÔAñô ð (ð (åŒx×(Ò(¨Ñ.Ô.ð(ð (ð �”
˜JÐ'Ð'ð(ð (ð (ñ (ô (ð (ð (ð (ð (ð (ð (øøøð (ð (ð (ð (ð (ð (ð (ñ (ô (ð (ð (ð (ð (ð (ð (ð (øøøð (ð (ð (ð (ð (ð (øõ ð 	ð 	ð 	Ý�IŠIÐ/°´Ñ;Ô;Ð;Øð	øøøsS   —3B& Á
 BÁ*BÁ5BÂB	ÂBÂB	Â	BÂB& ÂBÂB& Â BÂ!B& Â&,Cr£   c                ó�   — | j         \  }}t          j        | j        |t          j        j        gt          |¦  «        z  g¬¦  «        S )zH
        Get the memory dependencies in the non-reduction axis.
        )Úhidden_args)rD  r   rW  rE  ÚsympyÚSÚZerord   )rS   re  Úreduction_sizess      rT   ri  z#SchedulerNode.pointwise_read_writes&  sI   € ð
 "&¤ÑˆˆÝÔ/ØŒJ˜­U¬W¬\¨N½SÀÑ=QÔ=QÑ,QÐ+Rð
ñ 
ô 
ð 	
rV   rg  rh  c                óî  — |                       ¦   «         rdS t          d„ |                      ¦   «         D ¦   «         ¦  «        rdS t          | j        j        ¦  «        dk    r”t          |t          j        ¦  «        rzt          t          | j        j        ¦  «        ¦  «        }t          |t          j        ¦  «        sJ dt          |¦  «        ›�¦   «         ‚|j        |j        k    o|j        |j        k    S dS )NFc              3  ó>   K  — | ]}|                      ¦   «         V — Œd S rO   )ra   rI  s     rT   r  z,SchedulerNode.can_inplace.<locals>.<genexpr>3  s,   è è € Ð?Ð? Sˆs�ŠÑ Ô Ð?Ð?Ð?Ð?Ð?Ð?rV   r   ztype(write_dep)=)rb  r  r½   rd   r¤   rÓ   rs   r   r&   ÚnextÚiterr^   ÚindexÚsize)rS   rg  Ú	write_deps      rT   rk  zSchedulerNode.can_inplace0  sê   € Ø×ÒÑÔð 	Ø�5ÝÐ?Ð?¨D×,<Ò,<Ñ,>Ô,>Ð?Ñ?Ô?Ñ?Ô?ð 	Ø�5ÝˆtÔÔ&Ñ'Ô'¨1Ò,Ð,µØ•lÔ,ñ2
ô 2
Ð,õ �T $Ô"2Ô"9Ñ:Ô:Ñ;Ô;ˆIÝ˜i­Ô)?Ñ@Ô@ÐWÐWÐBWÅTÈ)Á_Ä_ÐBWÐBWÑWÔWÐ@Ø”> Y¤_Ò4ÐX¸¼È)Ì.Ò9XÐXØˆurV   r  c                óà  — t          ¦   «         }t          | j        t          ¦  «        rÅ| j                             ¦   «         D ]«}|j        dk    rž|j        dk    r“d|j        v r|j        d         dk    s)t          |j	        ¦  «        dk    ra|j	        d         dk    rP| 
                    d|j        v r|j        d         n&t          |j	        ¦  «        dk    r|j	        d	         nd
¦  «         Œ¬|S )NÚcall_methodÚstoreÚmodeÚ
atomic_addé   r   rQ   é   r   rÜ   )r   rs   rE  r-   rE  r1  r   r«   rd   ro   r$  )rS   Úbuffers_store_as_atomic_addrE   s      rT   Ú_get_atomic_add_buffersz%SchedulerNode._get_atomic_add_buffers=  sö   € å7A±|´|Ð#Ý�d”j¥(Ñ+Ô+ð 	Øœ
×,Ò,Ñ.Ô.ð ð �à”G˜}Ò,Ð,Øœ wÒ.Ð.à 4¤;Ð.Ð.°4´;¸vÔ3FÈ,Ò3VÐ3VÝ ¤	™NœN¨aÒ/Ð/°D´I¸a´LÀLÒ4PÐ4Pð 0×3Ò3à! T¤[Ð0Ð0ð œ FÔ+Ð+å.1°$´)©n¬nÀÒ.AÐ.A˜dœi¨œl˜lÀrñô ð øð
 +Ð*rV   )rD   rC   rE   rF  rL   rm   ©NN)rI  rJ  rK  rL  rL   rm   )rP  r‚   rL   rm   )r_  r`  rL   rm   r  r”   )rL   rv  r–   r  )r€  r�  rL   rm   )r€  rv  rL   r„  )r€  rv  rL   rm   )rL   r£   r  r
  )r_   r˜   r™   rš   r®   rH  rZ  r^  rk  rö   rÕ   rÎ  r]  r`  rb  r  rƒ  r‹  r€  r3   ri  rk  r¥  r?  r@  s   @rT   r|  r|  r  sã  ø€ € € € € € Ø,Ð,Ð,Ñ,Ø€O€O�Oðð ð ð ð ð ð RVØBFðð ð ð ð ðD RVØBFð
ð 
ð 
ð 
ð 
ð
ð 
ð 
ð 
ð5ð 5ð 5ð 5ð"ð ð ð ð( ð  ð  ð  ð*ð ð ð ð4ð 4ð 4ð 4ð
ð 
ð 
ð 
ð8ð 8ð 8ð 8ðOð Oð Oð Oð!ð !ð !ð !ð
ð ð ð ð	ð 	ð 	ð 	ð ð
ð 
ð 
ñ „]ð
ðð ð ð ð ð+ð +ð +ñ „]ð+ð +ð +ð +ð +rV   r|  Úgroup_snodec                ó  ‡ — ‰ j         }‰                      t          j                             d„ |D ¦   «         ¦  «        ¦  «         t          ˆ fd„t          j        d„ |D ¦   «         Ž D ¦   «         ¦  «        ‰ j        j        z
  ‰ _	        d S )Nc                ó   — g | ]	}|j         ‘Œ
S r�   )r¤   ©r²   rv  s     rT   r´   z3refresh_group_node_dependencies.<locals>.<listcomp>U  s   € Ð+JÐ+JÐ+J¸a¨A¬MÐ+JÐ+JÐ+JrV   c              3  óR   •K  — | ]!}|j         ‰                     ¦   «         v¯|V — Œ"d S rO   ©rQ   rJ  )r²   rþ   r§  s     €rT   r  z2refresh_group_node_dependencies.<locals>.<genexpr>Y  sH   øè è € ð 
ð 
àØŒx˜{×;Ò;Ñ=Ô=Ð=Ð=ð à=Ð=Ð=Ð=ð
ð 
rV   c                ó   — g | ]	}|j         ‘Œ
S r�   )r¥   rª  s     rT   r´   z3refresh_group_node_dependencies.<locals>.<listcomp>[  s   € Ð)OÐ)OÐ)OÀ1¨!Ô*>Ð)OÐ)OÐ)OrV   )
r·  rú   r   Ú
ReadWritesÚ
merge_listr   Úunionr¤   rÓ   r¥   )r§  r·  s   ` rT   Úrefresh_group_node_dependenciesr±  R  s°   ø€ ØÔ€FØ×ÒÝÔ×*Ò*Ð+JÐ+JÀ6Ð+JÑ+JÔ+JÑKÔKñô ð õ
 	ð 
ð 
ð 
ð 
å!Ô'Ð)OÐ)OÈÐ)OÑ)OÔ)OÐPð
ñ 
ô 
ñ 	
ô 	
ð
 Ô
!Ô
(ñ	)ð Ô"Ð"Ð"rV   rD   rC   r·  úList[BaseSchedulerNode]c                ó–  — t          | t          t          f¦  «        sJ ‚|| _        || _        d | _        t          j        d„ |D ¦   «         Ž | _        t          | ¦  «         t          d„ | j        D ¦   «         ¦  «        | _        t          d„ | j        D ¦   «         ¦  «        | _        d„ |                      ¦   «         D ¦   «         | _        d S )Nc                ó*   — g | ]}|j         ®	|j         ‘ŒS rO   )rº   rª  s     rT   r´   z#init_group_node.<locals>.<listcomp>l  s!   € Ð	AÐ	AÐ	A˜!¨¬Ð)@ˆ!Œ+Ð)@Ð)@Ð)@rV   c              3  ó$   K  — | ]}|j         V — Œd S rO   ©r¦   rª  s     rT   r  z"init_group_node.<locals>.<genexpr>q  ó$   è è € ÐHÐH° ¤ÐHÐHÐHÐHÐHÐHrV   c              3  ó$   K  — | ]}|j         V — Œd S rO   )r§   rª  s     rT   r  z"init_group_node.<locals>.<genexpr>r  r·  rV   c                ó8   — i | ]}|                      ¦   «         |“ŒS r�   r¶   r·   s     rT   r¹   z#init_group_node.<locals>.<dictcomp>s  s/   € ð #ð #ð #Ø #ˆ�Š‰Œ˜ð#ð #ð #rV   )rs   rÐ  ÚGroupedSchedulerNoder·  rD   rE   r   r°  rº   r±  rÈ  r¦   rô  r§   r½   r¿   )r§  rD   r·  s      rT   Úinit_group_noder»  b  sá   € õ
 �kÕ$6Õ8LÐ#MÑNÔNÐNÐNÐNØ€KÔØ%€KÔØ€KÔÝ&Ô,Ø	AÐ	A˜vÐ	AÑ	AÔ	Að€KÔõ $ KÑ0Ô0Ð0åÐHÐH°[Ô5GÐHÑHÔHÑHÔH€KÔÝÐHÐH°[Ô5GÐHÑHÔHÑHÔH€KÔð#ð #Ø'2×'>Ò'>Ñ'@Ô'@ð#ñ #ô #€KÔÐÐrV   c                  óŒ  ‡ — e Zd ZU dZded<   ed5d„¦   «         Zd6d„Zd7ˆ fd„Ze	d8d„¦   «         Z
d8d„Ze	d9d„¦   «         Zd:d„Zd8d„Zd8d„Zd;ˆ fd„Ze	d9d„¦   «         Ze	d9d„¦   «         Zd<d!„Zd8d"„Ze	d=d$„¦   «         Ze	d=d%„¦   «         Ze	d=d&„¦   «         Ze	d>d(„¦   «         Zd?d*„Ze	d=d+„¦   «         Zd@d-„ZdAd0„ZdBd3„Zd8d4„Zˆ xZS )CrÐ  zæ
    This is a "fake" scheduler node that represents a group of scheduler nodes
    that are meant to be fused together. The way it does this is by maintaining
    its unmet dependencies as the union of its constituent nodes.
    r²  r·  r  rF   r  rL   c                óH  — |j         |j         u sJ ‚t          |t          t          f¦  «        sJ ‚t          |t          t          f¦  «        sJ ‚t	          t          j        |                     ¦   «         |                     ¦   «         ¦  «        ¦  «        } | |j         |¦  «        S rO   )rD   rs   r|  rÐ  rŒ   r  r  rE  )rü  r  r  Únodess       rT   ÚfusezFusedSchedulerNode.fuse�  s’   € ð Œ %¤/Ð1Ð1Ð1Ð1Ý˜%¥-Õ1CÐ!DÑEÔEÐEÐEÐEÝ˜%¥-Õ1CÐ!DÑEÔEÐEÐEÐEÝ•Y”_ U§_¢_Ñ%6Ô%6¸¿ºÑ8IÔ8IÑJÔJÑKÔKˆØˆs�5”? EÑ*Ô*Ð*rV   ró   r&   rô   rm   c                ó  — |                       ¦   «         rd S d }| j        D ]p}t          |t          ¦  «        sJ ‚|�Ht	          |¦  «        t	          |j        d         ¦  «        k    rt                               d¦  «          d S |j        d         }Œqd }|€J ‚t          |¦  «        |j	        cxk    r|j	        k    rn n| 
                    |¦  «        }|s/t                               d|                      ¦   «         ¦  «         d S t          xj        dz  c_        t                               d|                      ¦   «         |¦  «         | j        D ].}t          |t          ¦  «        sJ ‚|                     |¦  «         Œ/t          | ¦  «         d S )Nr   z1Can not reorder fused node due to different sizeszODont reordering fused node %s because we can not decide the suitable loop orderr   z-Reorder loops for fused node %s with order %s)rb  r·  rs   r|  ÚtuplerD  rp  r  rd   rm  rn  r\   r    ro  rk  r±  )rS   ró   rô   rq  Úsnoder_  s         rT   rö   z,FusedSchedulerNode.reorder_loops_by_dep_pair‹  s·  € ð ×ÒÑÔð 	àˆFØˆ
Ø”[ð 	)ð 	)ˆEÝ˜e¥]Ñ3Ô3Ð3Ð3Ð3ØÐ%­%°
Ñ*;Ô*;½uÀUÄ\ÐRSÄ_Ñ?UÔ?UÒ*UÐ*UÝ!×'Ò'ØGñô ð ð ��Øœ aœˆJˆJØˆ	àÐ%Ð%Ð%Ýˆz‰?Œ?˜hÔ/ÐEÐEÒEÐE°9Ô3EÒEÐEÐEÐEÐEØ ×;Ò;¸IÑFÔFˆIàð 	Ý×#Ò#ØaØ—’‘”ñô ð ð ˆFÝÐ#Ô# qÑ(Ð#Ô#Ý×ÒØ;¸T¿]º]¹_¼_Èiñ	
ô 	
ð 	
ð ”[ð 	2ð 	2ˆEÝ˜e¥]Ñ3Ô3Ð3Ð3Ð3Ø×&Ò& yÑ1Ô1Ð1Ð1å'¨Ñ-Ô-Ð-Ð-Ð-rV   rD   rC   c                ó²   •— t          ¦   «                              |¦  «         t          | ||¦  «         g | _        t	          |d„ ¬¦  «        j        | _        d S )Nc                óD   — t          |                      ¦   «         ¦  «        S rO   )rM   r]  ru  s    rT   r¬   z-FusedSchedulerNode.__init__.<locals>.<lambda>´  s   € ­s°1·>²>Ñ3CÔ3CÑ/DÔ/D€ rV   rw  )r6  r®   r»  rJ   rô  r¢   ©rS   rD   r·  rñ  s      €rT   r®   zFusedSchedulerNode.__init__°  sS   ø€ Ý‰Œ×Ò˜Ñ#Ô#Ð#Ý˜˜i¨Ñ0Ô0Ð0Ø%'ˆŒ
Ý˜Ð%DÐ%DÐEÑEÔEÔKˆŒ
ˆ
ˆ
rV   rW   c                óJ   — d                      d„ | j        D ¦   «         ¦  «        S )NÚ_c                ó6   — g | ]}|                      ¦   «         ‘ŒS r�   r¶   rª  s     rT   r´   z/FusedSchedulerNode.get_name.<locals>.<listcomp>¸  ó    € Ð;Ð;Ð;¨!˜Ÿš™œÐ;Ð;Ð;rV   ©rt  r·  rR   s    rT   r\   zFusedSchedulerNode.get_name¶  ó%   € à�xŠxÐ;Ð;¨t¬{Ð;Ñ;Ô;Ñ<Ô<Ð<rV   c                ó@   — | j         d                              ¦   «         S ©Nr   ©r·  r\   rR   s    rT   rA  z!FusedSchedulerNode.get_first_nameº  ó   € ØŒ{˜1Œ~×&Ò&Ñ(Ô(Ð(rV   r  c                ó<   — t          j        d„ | j        D ¦   «         Ž S )Nc                ó6   — g | ]}|                      ¦   «         ‘ŒS r�   ©rJ  rª  s     rT   r´   z7FusedSchedulerNode.get_buffer_names.<locals>.<listcomp>¿  ó$   € Ð!LÐ!LÐ!L¸1 !×"4Ò"4Ñ"6Ô"6Ð!LÐ!LÐ!LrV   ©r   r°  r·  rR   s    rT   rJ  z#FusedSchedulerNode.get_buffer_names½  ó!   € åÔÐ!LÐ!LÀÄÐ!LÑ!LÔ!LÐMÐMrV   úList[SchedulerBuffer]c                ól   — g }| j         D ])}|                     |                     ¦   «         ¦  «         Œ*|S rO   ©r·  r&  r½   ©rS   rg   rE   s      rT   r½   zFusedSchedulerNode.get_outputsÁ  ó>   € Ø(*ˆØ”Kð 	.ð 	.ˆDØ�MŠM˜$×*Ò*Ñ,Ô,Ñ-Ô-Ð-Ð-ØˆrV   c                ó.  ‡ — ˆ fd„t          ‰ j        ¦  «        D ¦   «         }‰ j        d         j        }|�'|                     ‰                      ¦   «         ¦  «         t          j        d                     |¦  «                             ¦   «         d¦  «        S )Nc                ór   •— g | ]3\  }}‰                      ¦   «         › d |› d|                     ¦   «         › �‘Œ4S )z.snodes[z] =
)r\   ri   )r²   ÚirE   rS   s      €rT   r´   z6FusedSchedulerNode.debug_str_extra.<locals>.<listcomp>È  sU   ø€ ð 
ð 
ð 
á��4ð �}Š}‰ŒÐBÐB¨ÐBÐB°·²Ñ0@Ô0@ÐBÐBð
ð 
ð 
rV   r   rË   r!  )	Ú	enumerater·  rE   r&  rà   r#  re   rt  rÙ   )rS   ru  rE   s   `  rT   rÕ   z"FusedSchedulerNode.debug_str_extraÇ  s“   ø€ ð
ð 
ð 
ð 
å$ T¤[Ñ1Ô1ð
ñ 
ô 
ˆð Œ{˜1Œ~Ô"ˆØÐØ�LŠL˜×3Ò3Ñ5Ô5Ñ6Ô6Ð6åŒ˜tŸyšy¨Ñ/Ô/×6Ò6Ñ8Ô8¸&ÑAÔAÐArV   c                ó2   — d„ | j         D ¦   «         }| › d|› �S )Nc                ó6   — g | ]}|                      ¦   «         ‘ŒS r�   )rï   rD  s     rT   r´   z6FusedSchedulerNode.debug_str_short.<locals>.<listcomp>Ó  s$   € ÐEÐEÐE°�d×*Ò*Ñ,Ô,ÐEÐEÐErV   z
, snodes: r½  )rS   Ú
snodes_strs     rT   rï   z"FusedSchedulerNode.debug_str_shortÒ  s+   € ØEÐE¸¼ÐEÑEÔEˆ
ØÐ.Ð. *Ð.Ð.Ð.rV   r  r  rø   c                óö   •— t          ¦   «                              ||¦  «         t          ¦   «         }t          | j        ¦  «        D ]2}|                     ||¦  «         |                     |j        ¦  «         Œ3d S rO   )r6  r  r   Úreversedr·  Úupdater»   )rS   r  r  rE   rñ  s       €rT   r  z!FusedSchedulerNode.set_last_usageÖ  s�   ø€ õ
 	‰Œ×ÒÐ2Ð4FÑGÔGÐGõ 0:©|¬|ÐÝ˜Tœ[Ñ)Ô)ð 	8ð 	8ˆDØ×ÒÐ 3Ð5GÑHÔHÐHØ×&Ò& t¤Ñ7Ô7Ð7Ð7ð	8ð 	8rV   c                ó<   — t          j        d„ | j        D ¦   «         Ž S )Nc                ó6   — g | ]}|                      ¦   «         ‘ŒS r�   )r  rª  s     rT   r´   z8FusedSchedulerNode.used_buffer_names.<locals>.<listcomp>å  s$   € Ð!MÐ!MÐ!M¸A !×"5Ò"5Ñ"7Ô"7Ð!MÐ!MÐ!MrV   rÔ  rR   s    rT   r  z$FusedSchedulerNode.used_buffer_namesã  s!   € åÔÐ!MÐ!MÀÄÐ!MÑ!MÔ!MÐNÐNrV   c                ó<   — t          j        d„ | j        D ¦   «         Ž S )Nc                ó6   — g | ]}|                      ¦   «         ‘ŒS r�   )r  rª  s     rT   r´   zCFusedSchedulerNode.used_or_aliased_buffer_names.<locals>.<listcomp>ê  s$   € ÐDÐDÐD°1ˆa×,Ò,Ñ.Ô.ÐDÐDÐDrV   rÔ  rR   s    rT   r  z/FusedSchedulerNode.used_or_aliased_buffer_namesç  s%   € åÔØDÐD¸¼ÐDÑDÔDð
ð 	
rV   rK  c                ó   — | j         S rO   r½  rR   s    rT   rE  zFusedSchedulerNode.get_nodesí  rx  rV   c                óZ   — t          | ¦  «        j        › d|                      ¦   «         › d�S )Nz(nodes=rÃ   rÄ   rR   s    rT   rÅ   zFusedSchedulerNode.__repr__ð  s*   € Ý�t‘*”*Ô%Ð@Ð@¨d¯mªm©o¬oÐ@Ð@Ð@Ð@rV   r‚   c                ó>   — t          d„ | j        D ¦   «         ¦  «        S )Nc              3  ó>   K  — | ]}|                      ¦   «         V — Œd S rO   )r]  rª  s     rT   r  z2FusedSchedulerNode.is_reduction.<locals>.<genexpr>õ  s,   è è € Ð9Ð9¨�1—>’>Ñ#Ô#Ð9Ð9Ð9Ð9Ð9Ð9rV   ©r  r·  rR   s    rT   r]  zFusedSchedulerNode.is_reductionó  s!   € åÐ9Ð9¨T¬[Ð9Ñ9Ô9Ñ9Ô9Ð9rV   c                ó>   — t          d„ | j        D ¦   «         ¦  «        S )Nc              3  ó>   K  — | ]}|                      ¦   «         V — Œd S rO   )r`  rª  s     rT   r  z3FusedSchedulerNode.is_split_scan.<locals>.<genexpr>ù  s,   è è € Ð:Ð:¨�1—?’?Ñ$Ô$Ð:Ð:Ð:Ð:Ð:Ð:rV   rí  rR   s    rT   r`  z FusedSchedulerNode.is_split_scan÷  s!   € åÐ:Ð:¨d¬kÐ:Ñ:Ô:Ñ:Ô:Ð:rV   c                ó>   — t          d„ | j        D ¦   «         ¦  «        S )Nc              3  ó>   K  — | ]}|                      ¦   «         V — Œd S rO   ©rb  rª  s     rT   r  z1FusedSchedulerNode.is_template.<locals>.<genexpr>ý  s*   è è € Ð8Ð8 q�1—=’=‘?”?Ð8Ð8Ð8Ð8Ð8Ð8rV   rí  rR   s    rT   rb  zFusedSchedulerNode.is_templateû  s!   € åÐ8Ð8¨D¬KÐ8Ñ8Ô8Ñ8Ô8Ð8rV   r  c                ón   — | j         D ],}|                     ¦   «         r|                     ¦   «         c S Œ-d S rO   )r·  rb  r  rÀ   s     rT   r  z$FusedSchedulerNode.get_template_nodeÿ  sI   € à”Kð 	0ð 	0ˆDØ×ÒÑ!Ô!ð 0Ø×-Ò-Ñ/Ô/Ð/Ð/Ð/ð0àˆtrV   útorch.devicec                ó   — | j         d         S rÍ  )r¢   rR   s    rT   rT  zFusedSchedulerNode.get_device  s   € ØŒz˜!Œ}ÐrV   c                ó>   — t          d„ | j        D ¦   «         ¦  «        S )Nc              3  ó>   K  — | ]}|                      ¦   «         V — Œd S rO   )r  rª  s     rT   r  z>FusedSchedulerNode.has_aliasing_or_mutation.<locals>.<genexpr>  s.   è è € ÐEÐE°A�1×-Ò-Ñ/Ô/ÐEÐEÐEÐEÐEÐErV   rí  rR   s    rT   r  z+FusedSchedulerNode.has_aliasing_or_mutation	  s!   € åÐEÐE¸¼ÐEÑEÔEÑEÔEÐErV   r÷   c                ó   — t           ‚rO   ©ÚNotImplementedErrorrü   s     rT   rý   z'FusedSchedulerNode.update_mutated_names  ó   € Ý!Ð!rV   rQ   r%   c                ó   — t           ‚rO   rù  )rS   rQ   s     rT   r  zFusedSchedulerNode.add_fake_dep  rû  rV   rg  rh  c                ó   — t           ‚rO   rù  rj  s     rT   rk  zFusedSchedulerNode.can_inplace  rû  rV   c                óž  — |                       ¦   «         }d                     d„ | j        D ¦   «         ¦  «        }t          ¦   «         }|                     |› dt          | ¦  «        j        › d|› d|› dt          | j        j	        ¦  «        › d|› dt          | j
        ¦  «        › d|› d	t          | j        j        | j
        z
  ¦  «        › d|› d
�¦  «         |                     ¦   «         5  |                      ¦   «         D ])}|                     |                     ¦   «         ¦  «         Œ*	 ddd¦  «         n# 1 swxY w Y   |                     d¦  «         	 |                     |                      ¦   «         ¦  «         n,# t"          $ r t$                               dd¬¦  «         Y nw xY w|                     ¦   «                              ¦   «         S )rÇ   rZ   c              3  ó>   K  — | ]}t          |¦  «        j        V — Œd S rO   )r^   r_   rÞ  s     rT   r  z/FusedSchedulerNode.debug_str.<locals>.<genexpr>  s+   è è € ÐFÐF°Q¥ Q¡¤Ô 0ÐFÐFÐFÐFÐFÐFrV   rY   rÈ   rÉ   rÊ   rË   rÌ   rÍ   z.outputs = [
            Nr[   rÎ   TrÏ   )r\   rt  r·  r9   rÑ   r^   r_   rb   r¤   rÓ   r¥   rÔ   re   r½   ri   r]   rÕ   rÖ   r×   rØ   rf   rÙ   )rS   rQ   Únode_typestrr¸   rÚ   s        rT   ri   zFusedSchedulerNode.debug_str  sR  € à�}Š}‰ŒˆØ—x’xÐFÐF¸$¼+ÐFÑFÔFÑFÔFˆÝÑÔˆØ�
Š
àðð Ý	ˆd‰ŒÔ	ðð Ø+ðð àðð å˜Ô)Ô0Ñ1Ô1ðð ð ðð õ % TÔ%<Ñ=Ô=ðð ð ð	ð õ # 4Ô#3Ô#9¸DÔ<SÑ#SÑTÔTð	ð ð
 ðð ð ñ	
ô 	
ð 	
ð �ZŠZ‰\Œ\ð 	,ð 	,Ø×'Ò'Ñ)Ô)ð ,ð ,�Ø—
’
˜3Ÿ=š=™?œ?Ñ+Ô+Ð+Ð+ð,ð	,ð 	,ð 	,ñ 	,ô 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,øøøð 	,ð 	,ð 	,ð 	,ð 	�Š�cÑÔÐð	HØ�JŠJ�t×+Ò+Ñ-Ô-Ñ.Ô.Ð.Ð.øÝð 	Hð 	Hð 	HÝ�KŠKÐ7À$ˆKÑGÔGÐGÐGÐGð	Høøøð �ŠÑ Ô ×'Ò'Ñ)Ô)Ð)s$   Ã(?D4Ä4D8Ä;D8Å'E= Å=&F&Æ%F&©r  rF   r  rF   rL   rÐ  r  ©rD   rC   r·  r²  rL   rm   r”   r
  ©rL   rÖ  r	  r  r–   r  )rL   rô  r  )rQ   r%   rL   rm   r  ) r_   r˜   r™   Ú__doc__rš   Úclassmethodr¿  rö   r®   r3   r\   rA  rJ  r½   rÕ   rï   r  r  r  rE  rÅ   r]  r`  rb  r  rT  r  rý   r  rk  ri   r?  r@  s   @rT   rÐ  rÐ  x  s¾  ø€ € € € € € ðð ð $Ð#Ð#Ñ#àð+ð +ð +ñ „[ð+ð#.ð #.ð #.ð #.ðJLð Lð Lð Lð Lð Lð ð=ð =ð =ñ „]ð=ð)ð )ð )ð )ð ðNð Nð Nñ „]ðNðð ð ð ð	Bð 	Bð 	Bð 	Bð/ð /ð /ð /ð8ð 8ð 8ð 8ð 8ð 8ð ðOð Oð Oñ „]ðOð ð
ð 
ð 
ñ „]ð
ð
ð ð ð ðAð Að Að Að ð:ð :ð :ñ „]ð:ð ð;ð ;ð ;ñ „]ð;ð ð9ð 9ð 9ñ „]ð9ð ðð ð ñ „]ððð ð ð ð ðFð Fð Fñ „]ðFð
"ð "ð "ð "ð"ð "ð "ð "ð"ð "ð "ð "ð*ð *ð *ð *ð *ð *ð *ð *rV   rÐ  c                  ó  ‡ — e Zd ZU dZd,d„Zd-d„Zed.d
„¦   «         Zed/d„¦   «         Z	 	 	 d0d1ˆ fd„Z	ed2d„¦   «         Z
ed3d„¦   «         ZeZded<   ed4d„¦   «         Zed3d „¦   «         Zd5d!„Zd5d"„Zd6d#„Zd7d$„Zd8d&„Zd9d(„Zd:d+„Zˆ xZS );ÚForeachKernelSchedulerNodezš
    This is a schedular node that consists of a set of scheduler nodes that
    has no data dependencies among them and can be executed in parallel.
    ÚproducerrF   rL   r    c                ó¬   — |                      ¦   «         D ]>}|                     ¦   «         | j        v r!| j        |                     ¦   «                  c S Œ?d S rO   )r½   r\   Úread_to_node)rS   r  r¸   s      rT   Úget_consumer_subnode_forz3ForeachKernelSchedulerNode.get_consumer_subnode_for9  s]   € ð ×'Ò'Ñ)Ô)ð 	9ð 	9ˆCØ�|Š|‰~Œ~ Ô!2Ð2Ð2ØÔ(¨¯ª©¬Ô8Ð8Ð8Ð8ð 3ð ˆtrV   Úconsumerc                ót  — t          ¦   «         }|j        j        D ]m}|j        | j        j        vrŒ| j        j        |j                 j                             ¦   «         }|| j        v r | 	                    | j        |         ¦  «         Œnt          |¦  «        dk    rt          t          |¦  «        ¦  «        S d S ©Nr   )Úsetr¤   rÔ   rQ   rD   r}   rG   r\   Úname_to_noder$  rd   r˜  r™  )rS   r  Ú	producersÚrdÚ	node_names        rT   Úget_producer_subnode_forz3ForeachKernelSchedulerNode.get_producer_subnode_forB  s¬   € õ ‘E”Eˆ	ØÔ&Ô,ð 	<ð 	<ˆBØŒw˜dœnÔ8Ð8Ð8ØàœÔ2°2´7Ô;ÔG×PÒPÑRÔRˆIØ˜DÔ-Ð-Ð-Ø—’˜dÔ/°	Ô:Ñ;Ô;Ð;øõ ˆy‰>Œ>˜QÒÐÝ�˜Y™œÑ(Ô(Ð(à�4rV   r‚   c                ó
  ‡— t          ‰|¦  «        }‰                     ¦   «         r´|                     ¦   «         r t          j        t          ‰¦  «        Št          j        t          |¦  «        }t          ‰j        ¦  «        t          |j        ¦  «        k    }|s |d¦  «         |o2t          ˆfd„t          ‰j        |j        ¦  «        D ¦   «         ¦  «        S |                     ¦   «         rz‰ 	                    ¦   «         r |d¦  «         dS t          j        t          |¦  «        }| 
                    ‰¦  «        }|�|j                             ‰|¦  «        S  |d¦  «         dS ‰                     ¦   «         rz| 	                    ¦   «         r |d¦  «         dS t          j        t          ‰¦  «        Š‰                     |¦  «        }|�‰j                             ||¦  «        S  |d¦  «         dS t          d¦  «        ‚)	Nzforeach do not have same lengthc              3  óT   •K  — | ]"\  }}‰j                              ||¦  «        V — Œ#d S rO   )rD   Úcan_fuse)r²   ÚlÚrr  s      €rT   r  z6ForeachKernelSchedulerNode.can_fuse.<locals>.<genexpr>^  sN   øè è € ð )ð )á�A�qð Ô"×+Ò+¨A¨qÑ1Ô1ð)ð )ð )ð )ð )ð )rV   zXcandidate producer is a reduction, foreach ops cannot be fused with reductions currentlyFz5candidate producer is not dep of any foreach consumerzXcandidate consumer is a reduction, foreach ops cannot be fused with reductions currentlyz5candidate consumer has no dep in any foreach producerzXAt least one node passed to ForeachKernelSchedulerNode.can_fuse should be a foreach node)r  rf  ÚtypingÚcastr  rd   r·  Úallrˆ  r]  r  rD   r  r  ÚAssertionError)rü  r  r  ÚwhyÚforeach_matchÚconsumer_subnodeÚproducer_subnodes    `     rT   r  z#ForeachKernelSchedulerNode.can_fuseU  s<  ø€ å˜ (Ñ+Ô+ˆØ×ÒÑ Ô ð &	 X×%8Ò%8Ñ%:Ô%:ð &	Ý”{Õ#=¸xÑHÔHˆHÝ”{Õ#=¸xÑHÔHˆHÝ ¤Ñ0Ô0µC¸¼Ñ4HÔ4HÒHˆMØ ð 7Ø�Ð5Ñ6Ô6Ð6Ø ð ¥Sð )ð )ð )ð )å ¤°´ÑAÔAð)ñ )ô )ñ &ô &ð ð × Ò Ñ"Ô"ð 	Ø×$Ò$Ñ&Ô&ð Ø�Ønñô ð ð �uå”{Õ#=¸xÑHÔHˆHØ'×@Ò@ÀÑJÔJÐØÐ+ØÔ)×2Ò2°8Ð=MÑNÔNÐNàˆCÐGÑHÔHÐHØ�5à× Ò Ñ"Ô"ð 	Ø×$Ò$Ñ&Ô&ð Ø�Ønñô ð ð �uå”{Õ#=¸xÑHÔHˆHØ'×@Ò@ÀÑJÔJÐØÐ+ØÔ)×2Ò2Ð3CÀXÑNÔNÐNàˆCÐGÑHÔHÐHØ�5åØfñ
ô 
ð 	
rV   c                óö  — |                      ¦   «         s|                      ¦   «         sJ ‚|                      ¦   «         r)t          j        t          |¦  «        }|j        }|j        }n(t          j        t          |¦  «        }|j        }|j        }d }d }|                      ¦   «         rn|                      ¦   «         rZt          j        t          |¦  «        }t          j        t          |¦  «        }d„ t          |j        |j        ¦  «        D ¦   «         }�nO|                      ¦   «         rŒt          j        t          |¦  «        }|                     |¦  «        }g }|}d }|j        D ]N}	|	|u r3t           
                    |	|¦  «        }
|
}|                     |
¦  «         Œ9|                     |	¦  «         ŒOn¯|                      ¦   «         rŒt          j        t          |¦  «        }|                     |¦  «        }g }|}d }|j        D ]N}	|	|u r3t           
                    ||	¦  «        }
|
}|                     |
¦  «         Œ9|                     |	¦  «         ŒOnt          d¦  «        ‚ | |j        |||||¬¦  «        S )Nc                óJ   — g | ] \  }}t                                ||¦  «        ‘Œ!S r�   )rÐ  r¿  )r²   r  r  s      rT   r´   z3ForeachKernelSchedulerNode.fuse.<locals>.<listcomp>—  s<   € ð ð ð á�A�qõ #×'Ò'¨¨1Ñ-Ô-ðð ð rV   zTAt least one node passed to ForeachKernelSchedulerNode.fuse should be a foreach node)Úuse_custom_partition_algoÚprev_node_1Úprev_node_2Úenable_autotune)rf  r  r  r  r$  r'  rˆ  r·  r  rÐ  r¿  rŸ  r  r  rD   )rü  r  r  r$  r'  r%  r&  r‹  r!  rE   Únew_noder   s               rT   r¿  zForeachKernelSchedulerNode.fuse„  s½  € ð ×"Ò"Ñ$Ô$Ð=¨×(;Ò(;Ñ(=Ô(=Ð=Ð=Ð=Ø×ÒÑ Ô ð 	7Ý”{Õ#=¸xÑHÔHˆHØ(0Ô(JÐ%Ø&Ô6ˆOˆOå”{Õ#=¸xÑHÔHˆHØ(0Ô(JÐ%Ø&Ô6ˆOØˆØˆà×ÒÑ Ô ð &	 X×%8Ò%8Ñ%:Ô%:ð &	Ý”{Õ#=¸xÑHÔHˆHÝ”{Õ#=¸xÑHÔHˆHðð å ¤°´ÑAÔAðñ ô ˆK‰Kð × Ò Ñ"Ô"ð 	Ý”{Õ#=¸xÑHÔHˆHØ'×@Ò@ÀÑJÔJÐØˆKØ"ˆKØˆKØ œð -ð -�ØÐ+Ð+Ð+Ý1×6Ò6°t¸XÑFÔF�HØ"*�KØ×&Ò& xÑ0Ô0Ð0Ð0à×&Ò& tÑ,Ô,Ð,Ð,ð-ð × Ò Ñ"Ô"ð 	Ý”{Õ#=¸xÑHÔHˆHØ'×@Ò@ÀÑJÔJÐØˆKØ"ˆKØˆKà œð -ð -�ØÐ+Ð+Ð+Ý1×6Ò6°xÀÑFÔF�HØ"*�KØ×&Ò& xÑ0Ô0Ð0Ð0à×&Ò& tÑ,Ô,Ð,Ð,ð-õ !Øfñô ð ð ˆsØÔØØ&?Ø#Ø#Ø+ð
ñ 
ô 
ð 	
rV   NFrD   rC   r·  r²  r$  r%  r&  r'  rm   c                óÄ  •‡ — i ‰ _         i ‰ _        |�|€ht          ¦   «                              ||¦  «         |D ]A}|j        j        D ]}|‰ j         |j        <   Œ|                     ¦   «         D ]}	|‰ j        |	<   ŒŒB�n‡|‰ _        |‰ _	        d ‰ _
        g ‰ _        ‰                      t          j                             |j        |j        g¦  «        ¦  «         t!          ˆ fd„t!          j        |j        |j        ¦  «        D ¦   «         ¦  «        ‰ j        j        z
  ‰ _        t)          |j        |j        g¦  «        ‰ _        t-          |j        |j        g¦  «        ‰ _        |                     ¦   «         rt3          |t4          ¦  «        sJ ‚||}}
nt3          |t4          ¦  «        sJ ‚||}}
|
j        ‰ _        ‰ j                             |j        ¦  «         |
j        ‰ _        |                     ¦   «         D ]}	|‰ j        |	<   Œ|‰ _        |d                              ¦   «         }|sJ ‚|t?          j         d¦  «        fff‰ _!        t!          ¦   «         ‰ _"        |‰ _#        d S )Nc              3  óR   •K  — | ]!}|j         ‰                     ¦   «         v¯|V — Œ"d S rO   r¬  r+  s     €rT   r  z6ForeachKernelSchedulerNode.__init__.<locals>.<genexpr>ç  sL   øè è € ð ð àð ”x t×'<Ò'<Ñ'>Ô'>Ð>Ð>ð	 ð ?Ð>Ð>Ð>ðð rV   r   Úcombo_kernel)$r
  r  r6  r®   r¤   rÔ   rQ   rF  rD   r·  rE   rJ   rú   r   r®  r¯  r   r°  r¥   rÓ   rÈ  r¦   rô  r§   rf  rs   r  rº   rä  r$  rT  r’  ÚExprr¢   r¥  r'  )rS   rD   r·  r$  r%  r&  r'  rE   rŽ  rQ   Úforeach_nodeÚ
other_noderY  rñ  s   `            €rT   r®   z#ForeachKernelSchedulerNode.__init__Å  s¦  øø€ ð ˆÔØˆÔàÐ +Ð"5Ý‰GŒG×Ò˜Y¨Ñ/Ô/Ð/àð 3ð 3�Ø Ô,Ô2ð 8ð 8�DØ37�DÔ% d¤iÑ0Ð0à ×4Ò4Ñ6Ô6ð 3ð 3�DØ.2�DÔ% dÑ+Ð+ð3ñ	3ð 'ˆDŒNØ ˆDŒKØˆDŒIØ)+ˆDŒJà× Ò ÝÔ'×2Ò2Ø Ô,¨kÔ.EÐFñô ñô ð õ ð ð ð ð å)Ô/Ø#Ô6¸Ô8Vñ ô  ðñ ô ñ ô ð Ô"Ô)ñ*ð Ô#õ ! +Ô"7¸Ô9NÐ!OÑPÔPˆDŒNÝ  +Ô"7¸Ô9NÐ!OÑPÔPˆDŒNà×%Ò%Ñ'Ô'ð DÝ! +Õ/IÑJÔJÐJÐJÐJØ+6¸˜j��å! +Õ/IÑJÔJÐJÐJÐJØ+6¸˜j�à)Ô3ˆDŒNØŒN×!Ò! *Ô"6Ñ7Ô7Ð7à ,Ô 9ˆDÔØ"×6Ò6Ñ8Ô8ð 5ð 5�Ø*4�Ô! $Ñ'Ð'à)BˆÔ&Ø˜”×%Ò%Ñ'Ô'ˆØˆˆˆvØ¥¤
¨>Ñ :Ô :Ð<Ð>Ð?ˆŒ
Ý2<±,´,ˆŒØ.ˆÔÐÐrV   r¾  c                ó°  ‡— d„ |D ¦   «         }|r3t                                dt          |¦  «        d„ |D ¦   «         ¦  «         d„ |D ¦   «         }d„ |D ¦   «         }|r(t                                dt          |¦  «        ¦  «         d„ |D ¦   «         }d„ |D ¦   «         Š‰r)t                                d	t          ‰¦  «        h¦  «         ˆfd
„|D ¦   «         }|S )Nc                ó<   — g | ]}t          |t          ¦  «        ¯|‘ŒS r�   )rs   rÍ  rª  s     rT   r´   z?ForeachKernelSchedulerNode.combinable_nodes.<locals>.<listcomp>  s(   € ÐOÐOÐO˜¥j°Õ4MÑ&NÔ&NÐO�!ÐOÐOÐOrV   z/ComboKernels: %d external nodes are filtered %sc                óN   — g | ]"}|j         ®	|j                              ¦   «         ‘Œ#S rO   ©rE   rž  rD  s     rT   r´   z?ForeachKernelSchedulerNode.combinable_nodes.<locals>.<listcomp>  s-   € ÐUÐUÐU¨T¸t¼yÐ?T�”×&Ò&Ñ(Ô(Ð?TÐ?TÐ?TrV   c                óJ   — g | ] }t          |t          t          f¦  «        °|‘Œ!S r�   )rs   r‡  rÍ  rª  s     rT   r´   z?ForeachKernelSchedulerNode.combinable_nodes.<locals>.<listcomp>  s?   € ð 
ð 
ð 
àÝ˜aÕ"8Õ:SÐ!TÑUÔUð
Øð
ð 
ð 
rV   c                ó<   — g | ]}t          |t          ¦  «        ¯|‘ŒS r�   ©rs   r  rª  s     rT   r´   z?ForeachKernelSchedulerNode.combinable_nodes.<locals>.<listcomp>  s8   € ð 
ð 
ð 
Ø­°AÕ7QÑ)RÔ)Rð
Øð
ð 
ð 
rV   z+ComboKernels: %d foreach nodes are filteredc                ó<   — g | ]}t          |t          ¦  «        °|‘ŒS r�   r5  rª  s     rT   r´   z?ForeachKernelSchedulerNode.combinable_nodes.<locals>.<listcomp>  s8   € ð 
ð 
ð 
Ø­Z¸Õ;UÑ-VÔ-Vð
Øð
ð 
ð 
rV   c                ó:   — g | ]}|                      ¦   «         ¯|‘ŒS r�   rò  rª  s     rT   r´   z?ForeachKernelSchedulerNode.combinable_nodes.<locals>.<listcomp>!  s%   € ÐGÐGÐG °q·}²}±´ÐG˜!ÐGÐGÐGrV   z,ComboKernels: %d template nodes are filteredc                ó   •— g | ]}|‰v¯|‘Œ	S r�   r�   )r²   rv  Útemplate_nodess     €rT   r´   z?ForeachKernelSchedulerNode.combinable_nodes.<locals>.<listcomp>&  s#   ø€ ÐOÐOÐO °qÀÐ7NÐ7N˜!Ð7NÐ7NÐ7NrV   )r×   r  rd   )rü  r¾  ÚexternÚfiltered_nodesÚforeach_nodesr9  s        @rT   Úcombinable_nodesz+ForeachKernelSchedulerNode.combinable_nodes	  s<  ø€ ð PÐO˜UÐOÑOÔOˆØð 	Ý�IŠIØAÝ�F‘”ØUÐU°VÐUÑUÔUñô ð ð

ð 
àð
ñ 
ô 
ˆð

ð 
Ø%ð
ñ 
ô 
ˆð ð 	YÝ�IŠIÐCÅSÈÑEWÔEWÑXÔXÐXð
ð 
Ø%ð
ñ 
ô 
ˆð HÐG ^ÐGÑGÔGˆØð 	Ý�IŠIØ>ÅÀ^ÑATÔATÐ@Uñô ð ð PÐOÐOÐO ^ÐOÑOÔOˆØÐrV   úList[List[BaseSchedulerNode]]c           
     óÀ   ‡‡— |                       ¦   «         }g }dŠ|D ]@Š|                     ˆˆfd„t          dt          ‰¦  «        ‰¦  «        D ¦   «         ¦  «         ŒA|S )zS
        Returns a list of lists of nodes that are to be grouped together.
        é   c                ó*   •— g | ]}‰||‰z   …         ‘ŒS r�   r�   )r²   rÝ  Úmax_num_nodesr¾  s     €€rT   r´   zUForeachKernelSchedulerNode._default_group_nodes_for_combo_kernels.<locals>.<listcomp>5  s8   ø€ ð ð ð àð ˜!˜a -Ñ/Ð/Ô0ðð ð rV   r   )Ú_topological_sort_nodesr&  Úrangerd   )rD   Úsorted_nodesÚgrouped_nodesrB  r¾  s      @@rT   Ú&_default_group_nodes_for_combo_kernelszAForeachKernelSchedulerNode._default_group_nodes_for_combo_kernels)  s’   øø€ ð !×8Ò8Ñ:Ô:ˆØˆØˆØ!ð 	ð 	ˆEØ× Ò ðð ð ð ð å" 1¥c¨%¡j¤j°-Ñ@Ô@ðñ ô ñô ð ð ð ÐrV   ú4Callable[[Scheduler], List[List[BaseSchedulerNode]]]Ú!group_algorithm_for_combo_kernelsÚcustom_group_algorithmc                ó   — | t           _        d S rO   ©r  rI  )rJ  s    rT   Ú%set_group_algorithm_for_combo_kernelsz@ForeachKernelSchedulerNode.set_group_algorithm_for_combo_kernelsA  s   € ð
 #õ 	#ÔDÐDÐDrV   c                ó6   — t                                | ¦  «        S rO   rL  ©rD   s    rT   Úgroup_nodes_for_combo_kernelsz8ForeachKernelSchedulerNode.group_nodes_for_combo_kernelsI  s   € õ *×KÒKÈIÑVÔVÐVrV   c                ó   — t           ‚rO   rù  rR   s    rT   r  z#ForeachKernelSchedulerNode.mark_runO  rû  rV   c                ó   — t           ‚rO   rù  rR   s    rT   r€  z"ForeachKernelSchedulerNode.codegenR  rû  rV   c                ó   — dS r<  r�   rR   s    rT   rf  z%ForeachKernelSchedulerNode.is_foreachU  r  rV   c                ó*   — t          | j        ¦  «        S )zeReturns a list of nodes which comprise the combo kernel.
        These nodes may be vertically fused.)rŒ   r·  rR   s    rT   Úget_subkernel_nodesz.ForeachKernelSchedulerNode.get_subkernel_nodesX  s   € õ �D”KÑ Ô Ð rV   rK  c                óx   — t          t          j                             d„ | j        D ¦   «         ¦  «        ¦  «        S )zqReturns all nodes contained in this kernel, unpacking fused nodes
        into their constituent scheduler nodes.c              3  ó>   K  — | ]}|                      ¦   «         V — Œd S rO   )rE  rª  s     rT   r  z7ForeachKernelSchedulerNode.get_nodes.<locals>.<genexpr>`  s*   è è € Ð1UÐ1UÀA°!·+²+±-´-Ð1UÐ1UÐ1UÐ1UÐ1UÐ1UrV   )rŒ   r  r  r‰  r·  rR   s    rT   rE  z$ForeachKernelSchedulerNode.get_nodes]  s3   € õ •I”O×1Ò1Ð1UÐ1UÈÌÐ1UÑ1UÔ1UÑUÔUÑVÔVÐVrV   rW   c                ó@   — | j         d                              ¦   «         S rÍ  )r·  rA  rR   s    rT   rA  z)ForeachKernelSchedulerNode.get_first_nameb  s   € ØŒ{˜1Œ~×,Ò,Ñ.Ô.Ð.rV   r9  r:  c                óz   — t          | || j        j        ¦  «         | j        D ]}|                     |¦  «         Œd S rO   )r<  rD   r}   r·  r=  )rS   r9  rE   s      rT   r=  z/ForeachKernelSchedulerNode.prune_redundant_depse  sO   € õ 	˜dÐ$6¸¼Ô8RÑSÔSÐSà”Kð 	:ð 	:ˆDØ×%Ò%Ð&8Ñ9Ô9Ð9Ð9ð	:ð 	:rV   )r  rF   rL   r    )r  rF   rL   r    ©r  rF   r  rF   rL   r‚   )r  rF   r  rF   rL   r  )NNF)rD   rC   r·  r²  r$  r‚   r%  r    r&  r    r'  r‚   rL   rm   ©r¾  r²  rL   r²  )rD   rC   rL   r>  )rJ  rH  rL   rm   r•   r–   ©rL   r²  r  r”   r  )r_   r˜   r™   r  r  r  r  r  r¿  r®   r=  ÚstaticmethodrG  rI  rš   rM  rP  r  r€  rf  rU  rE  rA  r=  r?  r@  s   @rT   r  r  3  sý  ø€ € € € € € ðð ð
ð ð ð ðð ð ð ð& ð,
ð ,
ð ,
ñ „[ð,
ð\ ð>
ð >
ð >
ñ „[ð>
ðJ 48Ø37Ø %ðB/ð B/ð B/ð B/ð B/ð B/ð B/ðH ðð ð ñ „[ðð> ðð ð ñ „\ðð* 	/ð &ð /ð /ð /ñ /ð ð
ð 
ð 
ñ „\ð
ð ðWð Wð Wñ „\ðWð
"ð "ð "ð "ð"ð "ð "ð "ðð ð ð ð!ð !ð !ð !ð
Wð Wð Wð Wð
/ð /ð /ð /ð:ð :ð :ð :ð :ð :ð :ð :rV   r  c                  ó¸   ‡ — e Zd ZU dZded<   edd„¦   «         Zdˆ fd	„Zdd
„Zdd„Z	e
d d„¦   «         Zd d„Ze
d!d„¦   «         Zd"d„Zd#d„Zed$d„¦   «         Zˆ xZS )%rº  aC  
    This is a "fake" scheduler node that represents a group of scheduler nodes
    that are meant to be *grouped* together (it does not allow another node to be scheduled
    in between its constituent nodes, nor does it allow another node to fuse into any of its constituent nodes).
    The way it does this is by maintaining its unmet dependencies as the union of its constituent nodes.
    Fusion will still happen among the nodes within each GroupedSchedulerNode.
    At codegen time, this scheduler node will be unpacked and codegen is called on each constituent node.
    r²  r·  rL   c                óî   ‡— |d         j         Št          ˆfd„|D ¦   «         ¦  «        sJ ‚ | ‰|¦  «        }|D ]}|‰j        |                     ¦   «         <   Œ|‰j        |                     ¦   «         <   |S )Nr   c              3  ó*   •K  — | ]}|j         ‰u V — Œd S rO   rO  )r²   rE   rD   s     €rT   r  z.GroupedSchedulerNode.create.<locals>.<genexpr>}  s*   øè è € ÐBÐB°4�4”> YÐ.ÐBÐBÐBÐBÐBÐBrV   )rD   r  r9  r\   )rü  r·  Úgrouped_snoderÂ  rD   s       @rT   ÚcreatezGroupedSchedulerNode.createz  s“   ø€ à˜1”IÔ'ˆ	ÝÐBÐBÐBÐB¸6ÐBÑBÔBÑBÔBÐBÐBÐBØ˜˜I vÑ.Ô.ˆØð 	Kð 	KˆEØ=JˆIÔ(¨¯ªÑ)9Ô)9Ñ:Ð:ØANˆ	Ô$ ]×%;Ò%;Ñ%=Ô%=Ñ>ØÐrV   rD   rC   rm   c                ól   •— t          ¦   «                              |¦  «         t          | ||¦  «         d S rO   )r6  r®   r»  rÅ  s      €rT   r®   zGroupedSchedulerNode.__init__„  s3   ø€ Ý‰Œ×Ò˜Ñ#Ô#Ð#Ý˜˜i¨Ñ0Ô0Ð0Ð0Ð0rV   c                óÔ   — | j         D ]#}|| j        j        |                     ¦   «         <   Œ$| j        j        |                      ¦   «         = | j                             | j         ¦  «        S )z�
        Do fusion among nodes within this GroupedSchedulerNode,
        and then unpack this GroupedSchedulerNode into regular nodes.
        )r·  rD   r9  r\   Ú
fuse_nodes)rS   rÂ  s     rT   ÚunpackzGroupedSchedulerNode.unpackˆ  s`   € ð
 ”[ð 	Hð 	HˆEØBGˆDŒNÔ-¨e¯nªnÑ.>Ô.>Ñ?Ð?ØŒNÔ-¨d¯mªm©o¬oÐ>ØŒ~×(Ò(¨¬Ñ5Ô5Ð5rV   Úfake_depr%   c                ó”   — |                       | j                             |¦  «        ¦  «         | j                             |¦  «         d S rO   )rú   r¤   r   r¥   r$  )rS   rg  s     rT   r  z!GroupedSchedulerNode.add_fake_dep’  sD   € Ø×Ò˜TÔ-×7Ò7¸ÑAÔAÑBÔBÐBØÔ×#Ò# HÑ-Ô-Ð-Ð-Ð-rV   rW   c                óJ   — d                      d„ | j        D ¦   «         ¦  «        S )NrÇ  c                ó6   — g | ]}|                      ¦   «         ‘ŒS r�   r¶   rª  s     rT   r´   z1GroupedSchedulerNode.get_name.<locals>.<listcomp>˜  rÉ  rV   rÊ  rR   s    rT   r\   zGroupedSchedulerNode.get_name–  rË  rV   c                ó@   — | j         d                              ¦   «         S rÍ  rÎ  rR   s    rT   rA  z#GroupedSchedulerNode.get_first_nameš  rÏ  rV   r  c                ó<   — t          j        d„ | j        D ¦   «         Ž S )Nc                ó6   — g | ]}|                      ¦   «         ‘ŒS r�   rÒ  rª  s     rT   r´   z9GroupedSchedulerNode.get_buffer_names.<locals>.<listcomp>Ÿ  rÓ  rV   rÔ  rR   s    rT   rJ  z%GroupedSchedulerNode.get_buffer_names�  rÕ  rV   rÖ  c                ól   — g }| j         D ])}|                     |                     ¦   «         ¦  «         Œ*|S rO   rØ  rÙ  s      rT   r½   z GroupedSchedulerNode.get_outputs¡  rÚ  rV   rK  c                ó   — | j         S rO   r½  rR   s    rT   rE  zGroupedSchedulerNode.get_nodes§  rx  rV   r  rF   r  r‚   c                ó   — dS r/  r�   )rü  r  r  s      rT   r  zGroupedSchedulerNode.can_fuseª  s	   € ð ˆurV   )r·  r²  rL   rº  r  r\  )rg  r%   rL   rm   r”   r
  r  r  rZ  )r_   r˜   r™   r  rš   r  rb  r®   rf  r  r3   r\   rA  rJ  r½   rE  r  r?  r@  s   @rT   rº  rº  n  s=  ø€ € € € € € ðð ð $Ð#Ð#Ñ#àðð ð ñ „[ðð1ð 1ð 1ð 1ð 1ð 1ð6ð 6ð 6ð 6ð.ð .ð .ð .ð ð=ð =ð =ñ „]ð=ð)ð )ð )ð )ð ðNð Nð Nñ „]ðNðð ð ð ðð ð ð ð ðð ð ñ „[ðð ð ð ð rV   rº  r�   Ústride_lengthsúList[List[int]]re  r�  Úpriority_idxúTuple[int, ...]ú	List[int]c           
     ó:  ‡ ‡— t           j        d	ˆˆ fd„¦   «         }t          t          t	          t          ‰ d         ¦  «        ¦  «        ¦  «        ¦  «        }t          |¦  «        dk    rˆ fd„|D ¦   «         Š t          j        r|                     |¬¦  «         |S )
z�
    A heuristic to decide loop iteration orders.  This has not been well
    tuned and may be something we should autotune.
    ÚarM   ÚbrL   c                ó”  •‡ ‡— ‰‰          dk    s‰‰         dk    r$t          ‰‰          dk    ‰‰         dk    ¦  «        S ˆ fd„‰D ¦   «         }ˆfd„‰D ¦   «         }t          d„ t          ||¦  «        D ¦   «         ¦  «        }t          d„ t          ||¦  «        D ¦   «         ¦  «        }||k    rdS ||k    rdS t          ‰‰ ¦  «        S )Nr   c                ó:   •— g | ]}t          |‰         ¦  «        ‘ŒS r�   ©Úabs)r²   Úslrw  s     €rT   r´   z6pick_loop_order.<locals>.index_cmp.<locals>.<listcomp>Â  ó#   ø€ Ð<Ð<Ð< r�˜B˜qœE™
œ
Ð<Ð<Ð<rV   c                ó:   •— g | ]}t          |‰         ¦  «        ‘ŒS r�   r{  )r²   r}  rx  s     €rT   r´   z6pick_loop_order.<locals>.index_cmp.<locals>.<listcomp>Ã  r~  rV   c              3  ó4   K  — | ]\  }}|d k    p||k     V — ŒdS rÜ  r�   ©r²   Úsl_aÚsl_bs      rT   r  z5pick_loop_order.<locals>.index_cmp.<locals>.<genexpr>Ç  óD   è è € ð 
ð 
Ù)3¨¨tˆD�AŠIÐ$˜ šð
ð 
ð 
ð 
ð 
ð 
rV   c              3  ó4   K  — | ]\  }}|d k    p||k     V — ŒdS rÜ  r�   r�  s      rT   r  z5pick_loop_order.<locals>.index_cmp.<locals>.<genexpr>Ê  r„  rV   r™  )r4   rÆ  rˆ  )rw  rx  Ústride_len_aÚstride_len_bÚa_firstÚb_firstre  rq  s   ``    €€rT   Ú	index_cmpz"pick_loop_order.<locals>.index_cmpº  s  øøø€ à�Œ8�qŠ=ˆ=˜E !œH¨šM˜Må�u˜Q”x 1’} e¨A¤h°!¢mÑ4Ô4Ð4ð =Ð<Ð<Ð<¨^Ð<Ñ<Ô<ˆØ<Ð<Ð<Ð<¨^Ð<Ñ<Ô<ˆõ ð 
ð 
Ý7:¸<ÈÑ7VÔ7Vð
ñ 
ô 
ñ 
ô 
ˆõ ð 
ð 
Ý7:¸<ÈÑ7VÔ7Vð
ñ 
ô 
ñ 
ô 
ˆð �WÒÐØ�2Ø�WÒÐØ�1õ �1�a‰yŒyÐrV   r   c                ó    •— g | ]
}‰|         ‘ŒS r�   r�   )r²   Úpirq  s     €rT   r´   z#pick_loop_order.<locals>.<listcomp>Ø  s   ø€ ÐDÐDÐD°˜.¨Ô,ÐDÐDÐDrV   rw  )rw  rM   rx  rM   rL   rM   )	Ú	functoolsÚ
cmp_to_keyrŒ   rã  rD  rd   r   Úpick_loop_ordersÚsort)rq  re  rs  rŠ  Úorders   ``   rT   Úpick_loop_orderr’  °  s³   øø€ õ Ôðð ð ð ð ð ñ Ôðõ4 •�%¥ N°1Ô$5Ñ 6Ô 6Ñ7Ô7Ñ8Ô8Ñ9Ô9€EÝ
ˆ<ÑÔ˜1ÒÐàDÐDÐDÐD°|ÐDÑDÔDˆÝÔð "Ø�
Š
�yˆ
Ñ!Ô!Ð!Ø€LrV   c                  óV   — e Zd ZU ded<   dZded<   dZded<   dd	„Zdd„Zdd„Zdd„Z	dS )ÚNodeUserú$Union[BaseSchedulerNode, OutputNode]rE   Fr‚   rk  Úis_weakrL   rM   c                óh   — t          | j                             ¦   «         | j        | j        f¦  «        S rO   )rP   rE   r\   rk  r–  rR   s    rT   rU   zNodeUser.__hash__ç  s*   € Ý�T”Y×'Ò'Ñ)Ô)¨4Ô+;¸T¼\ÐJÑKÔKÐKrV   ÚotherÚobjectc                óÀ   — t          |t          ¦  «        oI|                      ¦   «         |                     ¦   «         k    o| j        |j        k    o| j        |j        k    S rO   )rs   r”  r\   rk  r–  ©rS   r˜  s     rT   Ú__eq__zNodeUser.__eq__ê  sY   € å�u�hÑ'Ô'ð .Ø—’‘” 5§>¢>Ñ#3Ô#3Ò3ð.àÔ  EÔ$5Ò5ð.ð ” ¤Ò-ð		
rV   rW   c                ó4   — | j                              ¦   «         S rO   rk   rR   s    rT   r\   zNodeUser.get_nameò  rl   rV   c                ó~   — | j         |j         u sJ ‚t          | j         | j        o|j        | j        o|j        ¦  «        S rO   )rE   r”  rk  r–  r›  s     rT   r‹   zNodeUser.mergeõ  sH   € ØŒy˜EœJÐ&Ð&Ð&Ð&ÝØŒIØÔÐ2 Ô!2ØŒLÐ*˜Uœ]ñ
ô 
ð 	
rV   Nr“   )r˜  r™  rL   r‚   r”   )r˜  r”  rL   r”  )
r_   r˜   r™   rš   rk  r–  rU   rœ  r\   r‹   r�   rV   rT   r”  r”  Þ  sš   € € € € € € à.Ð.Ð.Ñ.Ø€KÐÐÐÑð €GÐÐÐÑðLð Lð Lð Lð
ð 
ð 
ð 
ð$ð $ð $ð $ð
ð 
ð 
ð 
ð 
ð 
rV   r”  c                  ó   ‡ — e Zd ZU ded<   did„Zdiˆ fd„Zdjd
„Zedkd„¦   «         Zej	        dld„¦   «         Zdmd„Z
dnd„Zdod„Zdmd„Zdmd„Zdmd„Zdpd„Zdqd„Zdrd„Zdmd „Zdmd!„Zdpd"„Zdmd#„Zdsd&„Zdmd'„Zdtd*„Zdud-„Zdpd.„Zdvdwd2„Zdxd3„Zdyd5„Zdud6„Zdud7„Z dud8„Z!dzd;„Z"d{d=„Z#d|d>„Z$dud?„Z%dud@„Z&d}dC„Z'd~dH„Z(ddJ„Z)d{dK„Z*d€dM„Z+d�dP„Z,dmdQ„Z-dmdR„Z.dmdS„Z/d‚dV„Z0dƒdY„Z1d„dZ„Z2d…d[„Z3d†d_„Z4dmd`„Z5dmda„Z6d‡dc„Z7dˆdd„Z8d‰dg„Z9dmdh„Z:ˆ xZ;S )ŠrC   zDict[Dep, int]Ú_Scheduler__dep_size_hint_cacher¾  úList[ir.Operation]rL   rm   c                ó€   — t          d¦  «        5  |                      |¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )NzScheduler.__init__)r   Ú_init©rS   r¾  s     rT   r®   zScheduler.__init__  s‡   € ÝÐ.Ñ/Ô/ð 	ð 	Ø�JŠJ�uÑÔÐð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   �3³7º7c           
     ó^
  •‡ — t          ¦   «                              ¦   «          i ‰ _        ‰ t          j        _        i ‰ _        t          t          ¦  «        ‰ _	        t          ¦   «         ‰ _        t          g t          j        j                             ¦   «         ¢t          j        j                             ¦   «         ¢t          j        j                             ¦   «         ¢¦  «        ‰ _        ˆ fd„|D ¦   «         ‰ _        ‰                      ¦   «          ‰ j                             t          j        j                             ¦   «         ¦  «         ‰ j        D ]}|                     ¦   «          Œ‰                      ¦   «         ‰ _        d„ ‰ j        D ¦   «         ‰ _        d„ ‰ j        D ¦   «         ‰ _        ‰ j                             ¦   «         ‰ _        i ‰ _        i ‰ _        ‰                      ¦   «          ‰                      ‰ j        ¦  «        ‰ _        ‰                      ¦   «          d„ ‰ j        D ¦   «         ‰ _        ‰                       ¦   «          tC          j"        ‰ j        ‰ j        ‰ j        ¦  «        ‰ _        tF          xj$        tK          ‰ j        ¦  «        z  c_$        t          j&         '                    ‰ j        ¦  «         tK          ‰ j        ¦  «        ‰ _(        ‰  )                    ¦   «          ‰                      ‰ j        ¦  «        ‰ _        t          ¦   «         ‰ _*        tV          j,        �tW          j,        ‰ j        ¦  «        ‰ _        ‰  -                    ‰ j        ¦  «        ‰ _        tV          j.        r€ddl/m.}  |‰ j        ‰ j        ‰ j        ta          t          j        j                             ¦   «         ¦  «        ta          t          j         1                    ¦   «         ¦  «        ¦  «        ‰ _        ‰  2                    ¦   «          ‰  3                    ¦   «          tV          j4        rtC          j5        ‰ j        ¦  «        ‰ _        tV          j6        r‰  7                    d ¬¦  «         ‰  8                    ¦   «          ‰  9                    ¦   «          t          j&         :                    ‰ j        ¦  «         t          j&         ;                    ‰ j        ¦  «         ‰  <                    ¦   «          t          ¦   «         ‰ _=        i ‰ _>        t          d¦  «         @                    ˆ fd	„¦  «         d S )
Nc                ó:   •— g | ]}‰                      |¦  «        ‘ŒS r�   )Úcreate_scheduler_node©r²   rß  rS   s     €rT   r´   z#Scheduler._init.<locals>.<listcomp>  s'   ø€ ÐCÐCÐC¸�d×0Ò0°Ñ3Ô3ÐCÐCÐCrV   c                ó8   — i | ]}|                      ¦   «         |“ŒS r�   r¶   rÞ  s     rT   r¹   z#Scheduler._init.<locals>.<dictcomp>"  s/   € ð ;
ð ;
ð ;
Ø !ˆA�JŠJ‰LŒL˜!ð;
ð ;
ð ;
rV   c                óf   — i | ].}|                      ¦   «         D ]}|                     ¦   «         |“ŒŒ/S r�   )r½   r\   )r²   rE   r¸   s      rT   r¹   z#Scheduler._init.<locals>.<dictcomp>%  sO   € ð 8
ð 8
ð 8
Ø$(À$×BRÒBRÑBTÔBTð8
ð 8
Ø;>ˆC�LŠL‰NŒN˜Cð8
ð 8
ð 8
ð 8
rV   c                ó8   — i | ]}|                      ¦   «         |“ŒS r�   r¶   rÞ  s     rT   r¹   z#Scheduler._init.<locals>.<dictcomp>>  s"   € Ð"GÐ"GÐ"G°q 1§:¢:¡<¤<°Ð"GÐ"GÐ"GrV   r   )Úreorder_for_peak_memory)Únum_ck_nodesÚgraph_statsc                 óH   •— ‰ j         ‰ j        t          ‰ j        ¦  «        dœS )N)Úgraph_idÚnum_nodes_before_fusionÚnum_nodes_after_fusion)Úpost_grad_graph_idÚnum_orig_nodesrd   r¾  rR   s   €rT   r¬   z!Scheduler._init.<locals>.<lambda>m  s&   ø€ Ø Ô3Ø+/Ô+>Ý*-¨d¬j©/¬/ðð € rV   )Ar6  r®   r   r>   rv   rD   Úbackendsr˜  Ú_post_grad_graph_counterr³  r   r„  rÑ  ÚkeysÚ	constantsÚtorchbind_constantsr*  r¾  Úupdate_zero_dim_cpu_tensorrä  r
  Úget_donated_buffersr|   r  r}   Úcopyr9  r  Úmutation_renamesÚcompute_dependenciesÚtopological_sort_scheduleÚdead_node_eliminationÚcompute_ancestorsr   Údecide_global_ordering_of_commsr    Úir_nodes_pre_fusionrd   r  Úir_pre_fusionr´  Úcreate_foreach_nodesÚlogged_slow_fusionr   Ú_pre_fusion_custom_passre  r¬  Úmemoryr  Úget_output_namesÚmerge_loopsÚfinalize_multi_template_buffersÚ reorder_for_compute_comm_overlapÚ$reorder_compute_and_comm_for_overlapÚcombo_kernelsÚcreate_combo_kernel_nodesÚprocess_grouped_nodesÚcompute_last_usageÚir_post_fusionÚgraph_diagramÚdebug_draw_graphÚbuffer_names_to_freeÚorigin_to_indexr   Úadd_row)rS   r¾  rE   r¬  rñ  s   `   €rT   r£  zScheduler._init  s‘  øø€ Ý‰Œ×ÒÑÔÐØ%'ˆÔ"Ø �ŒÔØ<>ˆŒÝ"&Õ'?Ñ"@Ô"@ˆÔå5?±\´\ˆÔ!Ý&0ðÝ”Ô%×*Ò*Ñ,Ô,ðå”Ô"×'Ò'Ñ)Ô)ðõ ”Ô,×1Ò1Ñ3Ô3ðñ'
ô '
ˆÔ#ð DÐCÐCÐC¸UÐCÑCÔCˆŒ
Ø×'Ò'Ñ)Ô)Ð)àÔ#×*Ò*­1¬7Ô+<×+AÒ+AÑ+CÔ+CÑDÔDÐDØ”Jð 	ð 	ˆDØ�OŠOÑÔÐÐð ×$Ò$Ñ&Ô&ð 	Ô#ð;
ð ;
Ø%)¤Zð;
ñ ;
ô ;
ˆÔð8
ð 8
Ø,0¬Jð8
ñ 8
ô 8
ˆÔð AEÔ@Q×@VÒ@VÑ@XÔ@XˆÔð 35ˆÔð 13ˆÔà×!Ò!Ñ#Ô#Ð#Ø×3Ò3°D´JÑ?Ô?ˆŒ
Ø×"Ò"Ñ$Ô$Ð$Ø"GÐ"G¸D¼JÐ"GÑ"GÔ"GˆÔØ×ÒÑ Ô Ð ÝÔ:ØŒJØÔØÔ#ñ
ô 
ˆŒ
õ 	Ð#Ô#¥s¨4¬:¡¤Ñ6Ð#Ô#Ý	Œ×Ò˜dœjÑ)Ô)Ð)Ý! $¤*™oœoˆÔØ×!Ò!Ñ#Ô#Ð#Ø×3Ò3°D´JÑ?Ô?ˆŒ
Ý?I¹|¼|ˆÔÝÔ)Ð5ÝÔ7¸¼
ÑCÔCˆDŒJØ—_’_ T¤ZÑ0Ô0ˆŒ
ÝÔ)ð 		Ø7Ð7Ð7Ð7Ð7Ð7à0Ð0Ø”
ØÔ ØÔ'Ý•A”GÔ(×-Ò-Ñ/Ô/Ñ0Ô0Ý•A”G×,Ò,Ñ.Ô.Ñ/Ô/ñô ˆDŒJð 	×ÒÑÔÐØ×,Ò,Ñ.Ô.Ð.ÝÔ2ð 	PÝÔCÀDÄJÑOÔOˆDŒJÝÔð 	>Ø×*Ò*¸Ð*Ñ=Ô=Ð=Ø×"Ò"Ñ$Ô$Ð$Ø×ÒÑ!Ô!Ð!Ý	Œ×Ò˜tœzÑ*Ô*Ð*Ý	Œ×Ò˜dœjÑ)Ô)Ð)Ø×ÒÑÔÐõ 6@±\´\ˆÔ!ð :<ˆÔå˜Ñ'Ô'×/Ò/ðð ð ð ñ	
ô 	
ð 	
ð 	
ð 	
rV   ú!Dict[str, SchedulerDonatedBuffer]c                óä   — i }t           j        j        D ][}t          t           j        j        |         t          j        ¦  «        r*t          | t           j        j        |         d ¬¦  «        ||<   Œ\|S )N)rG   )r>   rv   Úgraph_inputs_originalrs   r   ÚDonatedBufferrŸ   )rS   Úname_to_donated_bufrQ   s      rT   r»  zScheduler.get_donated_bufferst  sq   € Ø ÐÝ”GÔ1ð 	ð 	ˆDÝ�!œ'Ô7¸Ô=½rÔ?OÑPÔPð Ý,BØÝ”GÔ1°$Ô7Ø $ð-ñ -ô -Ð# DÑ)øð
 #Ð"rV   rR  c                ó$   — t           j        j        S rO   ©r>   rv   Úcurrent_devicerR   s    rT   rß  zScheduler.current_device  s   € åŒwÔ%Ð%rV   rY  c                ó(   — |t           j        _        d S rO   rÞ  rX  s     rT   rß  zScheduler.current_deviceƒ  s   € à!'�ŒÔÐÐrV   c                ó‚   — t           j                             dd¦  «        dk    rddlm}  || j        d¬¦  «         dS dS )z,Generate an image of the graph for debuggingÚINDUCTOR_WRITE_SCHEDULER_GRAPHNÚ1r   )Údraw_buffersT)Úprint_graph)ÚosÚenvironr  r  rä  r¾  )rS   rä  s     rT   rÔ  zScheduler.debug_draw_graph‡  sV   € åŒ:�>Š>Ð:¸DÑAÔAÀSÒHÐHØ+Ð+Ð+Ð+Ð+Ð+àˆL˜œ°Ð6Ñ6Ô6Ð6Ð6Ð6ð IÐHrV   ÚlabelrW   c                óÄ   — t                                t          j        ¦  «        r9t                                d|¦  «         | j        D ]}|                     ¦   «          Œd S d S )Nz%s:)r×   ÚisEnabledForÚloggingÚINFOrñ   r¾  rò   )rS   rè  rE   s      rT   Údebug_print_nodeszScheduler.debug_print_nodesŽ  sh   € Ý×Ò�GœLÑ)Ô)ð 	#Ý�HŠH�U˜EÑ"Ô"Ð"Øœ
ð #ð #�Ø× Ò Ñ"Ô"Ð"Ð"ð	#ð 	#ð#ð #rV   rE   r¯   rF   c                ód  — |                      ¦   «         €
J d¦   «         ‚|                     ¦   «         rt          | |¦  «        S t          |t          j        t          j        f¦  «        rt          | |¦  «        S t          |t          j        ¦  «        rt          | |¦  «        S t          |¦  «        ‚)Nz2All nodes passed to scheduling must have an origin)rž  Úis_no_opr‡  rs   r   r)   rQ  r|  ré  rÍ  rú  rÀ   s     rT   r§  zScheduler.create_scheduler_node”  s¤   € à×ÒÑÔÐ*Ð*Ø?ñ +Ô*Ð*à�=Š=‰?Œ?ð 	,Ý)¨$°Ñ5Ô5Ð5Ý˜�rÔ0µ"Ô2CÐDÑEÔEð 	,Ý   tÑ,Ô,Ð,Ý˜�bœoÑ.Ô.ð 	,Ý,¨T°4Ñ8Ô8Ð8å% dÑ+Ô+Ð+rV   c                óò  ‡ ‡‡— t          ¦   «         Šg }‰ j                             ¦   «         Št          j        j                             ¦   «         D ]~}ˆˆ fd„|D ¦   «         }|sŒ‰                     |¦  «         ˆ fd„|D ¦   «         }t          j	        dk    }t          ‰ |d|¬¦  «        }|                     |¦  «         |D ]}|‰ j        |<   ŒŒˆfd„‰ j        D ¦   «         t          |¦  «        z   ‰ _        d S )Nc                ó\   •— g | ](}|‰v ¯t          ‰j        |         t          ¦  «        °&|‘Œ)S r�   )rs   r  r‡  )r²   rQ   Úkept_node_namesrS   s     €€rT   r´   z2Scheduler.create_foreach_nodes.<locals>.<listcomp>§  sI   ø€ ð ð ð àØ˜?Ð*Ð*Ý" 4Ô#4°TÔ#:Õ<RÑSÔSð +ð à*Ð*Ð*rV   c                ó*   •— g | ]}‰j         |         ‘ŒS r�   )r  )r²   rQ   rS   s     €rT   r´   z2Scheduler.create_foreach_nodes.<locals>.<listcomp>²  s!   ø€ Ð@Ð@Ð@°$�dÔ'¨Ô-Ð@Ð@Ð@rV   r   F©r$  r'  c                ó@   •— g | ]}|                      ¦   «         ‰v¯|‘ŒS r�   r¶   )r²   rE   Úremoved_node_namess     €rT   r´   z2Scheduler.create_foreach_nodes.<locals>.<listcomp>Á  s3   ø€ ð 
ð 
ð 
Ø¨4¯=ª=©?¬?ÐBTÐ+TÐ+TˆDÐ+TÐ+TÐ+TrV   )r   r9  r·  r>   rv   Úlistsr�   rä  r   Úcombo_kernels_autotuner  rŸ  r¾  rŒ   )	rS   Úfe_nodesÚnamesr·  r'  Úfe_noderQ   rò  rö  s	   `      @@rT   rÅ  zScheduler.create_foreach_nodes¡  sQ  øøø€ Ý.8©l¬lÐØˆØÔ1×6Ò6Ñ8Ô8ˆå”W”]×)Ò)Ñ+Ô+ð 	8ð 	8ˆEðð ð ð ð à!ðñ ô ˆEð ð àà×%Ò% eÑ,Ô,Ð,Ø@Ð@Ð@Ð@¸%Ð@Ñ@Ô@ˆFå$Ô;¸aÒ?ˆOÝ0ØØØ*/Ø /ð	ñ ô ˆGð �OŠO˜GÑ$Ô$Ð$àð 8ð 8�Ø07�Ô'¨Ñ-Ð-ð8ð
ð 
ð 
ð 
Ø!œZð
ñ 
ô 
å�‰NŒNñˆŒ
ˆ
ˆ
rV   c                ó  ‡ ‡‡‡‡— t          d¦  «        } G ˆfd„dt          |         ¦  «        Št          j        ‰¦  «        Š‰ j        D ]­}|                     ¦   «         D ]–}|                     ¦   «         }|                     ¦   «         D ]k}|‰v rJ|‰v rF‰|         }‰|         }||z   }‰                     ¦   «         D ]}	‰|	         |u s
‰|	         |u r|‰|	<   ŒŒP|‰v r‰|         ‰|<   Œ`‰|         ‰|<   ŒlŒ—Œ®d ˆˆ fd„Š	 	 d!d"ˆˆfd„}
i }t          j
        j                             ¦   «         D ].\  }}t          |t          j        ¦  «        r|j        D ]}d||<   ŒŒ/‰ j        D �]ó}t"                               d|j        ¦  «         |j        €J ‚t)          |j                             ¦   «         d„ ¬¦  «        }|D ]9}t          |t          j        ¦  «        sJ ‚||vr|                     ¦   «         ||<   Œ:t)          |j                             ¦   «         d„ ¬¦  «        }|D ]u}||v sJ |› d|› �¦   «         ‚||         x}�V‰ j        |                              ¦   «         D ]6}|                     t5          |                     ¦   «         ¦  «        ¦  «         Œ7Œvt7          |j        j        ¦  «        dk    rEt=          t?          |j        j        ¦  «        ¦  «        x}rt          |t@          ¦  «        r|j!        }nd}|                     ¦   «         D �]@}t7          | "                    ¦   «         ¦  «        dk    sJ ‚| "                    ¦   «         D �] } ‰|¦  «        } |
||¦  «         |                     t5          ||¬¦  «        ¦  «         ‰|         j        D ]´}|                     ¦   «         |                     ¦   «         k    rŒ-t          |j        tF          ¦  «        sJ ‚|j         $                    ¦   «         D ]Q} ‰|¦  «        }|                     tK          ||                     ¦   «         ¬¦  «        ¦  «          |
||d¬¦  «         ŒRŒµ�Œ�ŒB|j        j&        D ]<}t          |tJ          ¦  «        s% |
|j'        || (                    |¦  «        ¦  «         Œ=| )                    ‰ j*        ¦  «         |                     ¦   «         D ]�}| "                    ¦   «         D ]x}|                     ¦   «         ‰ j*         ‰|¦  «        <   |                     ¦   «         ‰ j*        |<   ‰ j+         ,                    ||¦  «        ‰ j+        |                     ¦   «         <   ŒyŒ��Œõt          j
         -                    ¦   «         D ]C}t"                               d|¦  «          |
|t]          t5          |¦  «        ¦  «        ¦  «         ŒDt          j
        j/        D ]¬}|                     ¦   «         D ]•}||v s!J |› d|                     ¦   «         › �¦   «         ‚||         x}rd‰ j        |          $                    ¦   «         D ]D}t"                               d||¦  «          |
|t]          t5          |¦  «        ¦  «        ¦  «         ŒEŒ–Œ­‰ j*        D ]™}|t          j
        j        v rK |
|t]          t5          |¦  «        ¦  «        ¦  «         t          j
        j0         1                    |¦  «         Œ`|t          j
        j2        v r& |
|t]          t5          |¦  «        ¦  «        ¦  «         Œšd„ tg          t          j
        j                             ¦   «         ¦  «        D ¦   «         Šˆfd„t          j
        j0        D ¦   «         t          j
        _4        ‰ j        D ]K}|                     ¦   «         D ]4}| 5                    ‰|                     ¦   «                  j        ¦  «         Œ5ŒL‰ j6        D ]-}‰ j6        |          5                    ‰|         j        ¦  «         Œ.dS )#zi
        Create dependency edges between nodes, handling aliasing and
        mutation properly.
        ÚTc                  ó6   •— e Zd ZdZ	 	 ddd	„Zdd„Zdˆ fd„ZdS )ú1Scheduler.compute_dependencies.<locals>.DedupListan  
            This data structure behaves like a list except it makes sure the
            elements remain unique.
            Normally one could use a OrderedSet/dict for this purpose however
            the list in question gets elements appended as it is being
            iterated over which means that we need to keep the list
            semantics.
            NÚitemsúOptional[List[T]]Ú
membershipúOptional[OrderedSet[T]]rL   rm   c                óB   — |pg | _         |pt          ¦   «         | _        d S rO   )r   r   r  )rS   r   r  s      rT   r®   z:Scheduler.compute_dependencies.<locals>.DedupList.__init__×  s#   € ð
 #˜[ b�”
Ø",Ð"<µ
±´�”��rV   Ú	node_userrý  c                ó„   — || j         v rd S | j                             |¦  «         | j                              |¦  «         d S rO   )r  r   rŸ  r$  )rS   r  s     rT   rŸ  z8Scheduler.compute_dependencies.<locals>.DedupList.appendß  sF   € Ø ¤Ð/Ð/Ø�FØ”
×!Ò! )Ñ,Ô,Ð,Ø”×#Ò# IÑ.Ô.Ð.Ð.Ð.rV   r˜  úDedupList[T]c                ó’   •‡ — t          j        ‰ j        |j        ¦  «        }‰ j        ˆ fd„|j        D ¦   «         z   } ‰||¦  «        S )Nc                ó&   •— g | ]}|‰j         v¯|‘ŒS r�   )r  )r²   rv  rS   s     €rT   r´   zMScheduler.compute_dependencies.<locals>.DedupList.__add__.<locals>.<listcomp>ç  s,   ø€ ð *ð *ð *Ø¨a°t´Ð.FÐ.F�AÐ.FÐ.FÐ.FrV   )r   r°  r  r   )rS   r˜  Únew_membershipÚ	new_itemsÚ	DedupLists   `   €rT   Ú__add__z9Scheduler.compute_dependencies.<locals>.DedupList.__add__å  sc   øø€ Ý!+Ô!1°$´/À5ÔCSÑ!TÔ!T�Ø œJð *ð *ð *ð *Ø$œ{ð*ñ *ô *ñ �	ð !�y ¨NÑ;Ô;Ð;rV   r¦  )r   r  r  r  rL   rm   )r  rý  rL   rm   )r˜  r  rL   r  )r_   r˜   r™   r  r®   rŸ  r  )r  s   €rT   r  rÿ  Í  sr   ø€ € € € € ðð ð ,0Ø6:ð=ð =ð =ð =ð =ð/ð /ð /ð /ð<ð <ð <ð <ð <ð <ð <ð <rV   r  rß  rW   rL   c                óF   •— | ‰j         v r ‰‰j         |          ¦  «        S | S rO   )r½  )rß  rû   rS   s    €€rT   rû   z.Scheduler.compute_dependencies.<locals>.rename  s.   ø€ Ø�DÔ)Ð)Ð)Ø�v˜dÔ3°AÔ6Ñ7Ô7Ð7ØˆHrV   FÚused_by_nameÚ	user_noder•  rk  r‚   r–  rm   c                ón   •— ‰ ‰| ¦  «                                       t          |||¦  «        ¦  «         d S rO   )rŸ  r”  )r  r  rk  r–  Úname_to_usersrû   s       €€rT   Úadd_userz0Scheduler.compute_dependencies.<locals>.add_user  sE   ø€ ð ˜&˜& Ñ.Ô.Ô/×6Ò6Ý˜ K°Ñ9Ô9ñô ð ð ð rV   Nzscheduling %sc                ó   — | j         S rO   r  ru  s    rT   r¬   z0Scheduler.compute_dependencies.<locals>.<lambda>'  ó   € ÀAÄF€ rV   rw  c                ó   — | j         S rO   r  ru  s    rT   r¬   z0Scheduler.compute_dependencies.<locals>.<lambda>2  r  rV   z not in r   )r   )Úmutating_bufT)r–  zscheduling output %sz+scheduling output %s for unbacked symint %sc                ó   — i | ]\  }}||“Œ	S r�   r�   )r²   rš  rQ   s      rT   r¹   z2Scheduler.compute_dependencies.<locals>.<dictcomp>‡  s+   € ð 
ð 
ð 
Ù'˜E 4ˆD�%ð
ð 
ð 
rV   c                ó    •— g | ]
}‰|         ‘ŒS r�   r�   )r²   rQ   Ú	inp_namess     €rT   r´   z2Scheduler.compute_dependencies.<locals>.<listcomp>Š  s*   ø€ ð &
ð &
ð &
Ø $ˆI�dŒOð&
ð &
ð &
rV   )rß  rW   rL   rW   )FF)
r  rW   r  r•  rk  r‚   r–  r‚   rL   rm   )7r   r
   rÏ  r   r¾  r½   r\   ra   r·  r>   rv   rÑ  r   rs   r’  r,  Úfree_symbolsr×   r  rE   rƒ  Úget_unbacked_symbol_defsÚSymbolÚget_unbacked_symbol_usesr  r  r'   rd   r¤   rÓ   r˜  r™  r&   r   rc   rF   rJ  r(   rÔ   rQ   rk  rý   r½  r  r  rÉ  r†   Úgraph_outputsÚmutated_inputsr$  r¸  rÞ  Úmutated_input_idxsrŽ   r|   ) rS   rý  rE   Úbuf1Ú	buf1_nameÚ	buf2_nameÚlist1Úlist2Úcombinedrx  r  Úunbacked_symbol_to_origin_noderQ   ÚvalÚfsÚunbacked_symbol_defsr¬  Úunbacked_symbol_usesr  r¸   rþ   Ú	node_modeÚalt_namerh   Ú
other_namerŽ  rO  rÚ   r  r  r  rû   s    `                           @@@@rT   r¾  zScheduler.compute_dependenciesÅ  s“	  øøøøø€ õ �C‰LŒLˆð	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<� œ
ñ 	<ô 	<ð 	<õ> @KÔ?VØñ@
ô @
ˆð ”Jð 	Lð 	LˆDØ×(Ò(Ñ*Ô*ð Lð L�Ø ŸMšM™OœO�	Ø!%×!1Ò!1Ñ!3Ô!3ð Lð L�IØ  MÐ1Ð1°iÀ=Ð6PÐ6Pà -¨iÔ 8˜Ø -¨iÔ 8˜Ø#(¨5¡=˜Ø#0×#5Ò#5Ñ#7Ô#7ð >ð >˜Cà -¨cÔ 2°eÐ ;Ð ;Ø#0°Ô#5¸Ð#>Ð#>à5= ¨cÑ 2øð>ð # mÐ3Ð3Ø3@ÀÔ3K˜ iÑ0Ð0à3@ÀÔ3K˜ iÑ0Ð0ðLðLð&	ð 	ð 	ð 	ð 	ð 	ð 	ð !&Ø!ð		ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð MOÐ&õ
 œÔ-×3Ò3Ñ5Ô5ð 	>ð 	>‰IˆD�#Ý˜#�uœzÑ*Ô*ð >ØÔ*ð >ð >�BØ9=Ð2°2Ñ6Ð6øà”Jð J	Hñ J	HˆDÝ�IŠI�o t¤yÑ1Ô1Ð1ð ”9Ð(Ð(Ð(Ý#)Ø”	×2Ò2Ñ4Ô4Ð:JÐ:Jð$ñ $ô $Ð ð *ð Hð H�Ý! !¥U¤\Ñ2Ô2Ð2Ð2Ð2ð Ð:Ð:Ð:Ø8<¿º¹¼Ð2°1Ñ5øå#)Ø”	×2Ò2Ñ4Ô4Ð:JÐ:Jð$ñ $ô $Ð ð *ð Cð C�àÐ7Ð7Ð7Ð7ØÐAÐAÐ!?ÐAÐAñ 8Ô7Ð7à7¸Ô:Ð:�AÐGØ#Ô0°Ô3×?Ò?ÑAÔAð Cð C˜Ø×)Ò)­'°#·,²,±.´.Ñ*AÔ*AÑBÔBÐBÐBøõ �DÔ$Ô+Ñ,Ô,°Ò1Ð1Ý ¥ dÔ&6Ô&=Ñ!>Ô!>Ñ?Ô?Ð?�Sð 2å˜s¥IÑ.Ô.ð 2ð  œH�	�	à �	ð ×'Ò'Ñ)Ô)ð Eñ E�å˜3×,Ò,Ñ.Ô.Ñ/Ô/°1Ò4Ð4Ð4Ð4Ø #× 1Ò 1Ñ 3Ô 3ð Eñ E�HØ%˜v hÑ/Ô/�Hà�H˜X tÑ,Ô,Ð,Ø×%Ò%¥g¨h¸YÐ&GÑ&GÔ&GÑHÔHÐHØ -¨hÔ 7Ô =ð Eð E˜ØŸ=š=™?œ?¨d¯mªm©o¬oÒ=Ð=Ø$å)¨$¬)Õ5FÑGÔGÐGÐGÐGØ*.¬)×*DÒ*DÑ*FÔ*Fð Eð E˜Jà)/¨°
Ñ);Ô);˜JØ ×-Ò-Ý '¨
ÀÇÂÁÄÐ PÑ PÔ Pñô ð ð %˜H Z°¸tÐDÑDÔDÐDÐDðEñEñEð& Ô(Ô.ð Fð F�Ý! $­Ñ0Ô0ð FØ�H˜TœY¨¨d×.>Ò.>¸tÑ.DÔ.DÑEÔEÐEøà×%Ò% dÔ&;Ñ<Ô<Ð<ð ×'Ò'Ñ)Ô)ð Hð H�Ø #× 1Ò 1Ñ 3Ô 3ð Hð H�HØ>A¿lºl¹n¼n�DÔ)¨&¨&°Ñ*:Ô*:Ñ;Ø69·l²l±n´n�DÔ)¨(Ñ3ð Ô/×3Ò3°H¸hÑGÔGð Ô+ØŸš™œñð ðHñHõ œ×0Ò0Ñ2Ô2ð 	>ð 	>ˆHÝ�IŠIÐ,¨hÑ7Ô7Ð7ØˆH�X�z­'°(Ñ*;Ô*;Ñ<Ô<Ñ=Ô=Ð=Ð=õ ”7Ô(ð 
	Jð 
	JˆCØ×1Ò1Ñ3Ô3ð 	Jð 	J�àÐ7Ð7Ð7Ð7ØÐHÐHÐ!?×!DÒ!DÑ!FÔ!FÐHÐHñ 8Ô7Ð7à6°qÔ9Ð9�1ð JØ$(Ô$5°aÔ$8×$IÒ$IÑ$KÔ$Kð Jð J˜ÝŸ	š	ØIÈ8ÐUVñô ð ð !˜ ­:µg¸hÑ6GÔ6GÑ+HÔ+HÑIÔIÐIÐIøð	Jð Ô)ð 	:ð 	:ˆDØ•q”wÔ+Ð+Ð+Ø�˜�z­'°$©-¬-Ñ8Ô8Ñ9Ô9Ð9Ý”Ô&×*Ò*¨4Ñ0Ô0Ð0Ð0Ø�œÔ*Ð*Ð*à�˜�z­'°$©-¬-Ñ8Ô8Ñ9Ô9Ð9øð
ð 
Ý+4µQ´WÔ5I×5NÒ5NÑ5PÔ5PÑ+QÔ+Qð
ñ 
ô 
ˆ	ð&
ð &
ð &
ð &
Ý()¬Ô(>ð&
ñ &
ô &
�ŒÔ"ð
 ”Jð 	Cð 	CˆDØ×'Ò'Ñ)Ô)ð Cð C�Ø—’˜m¨C¯LªL©N¬NÔ;ÔAÑBÔBÐBÐBðCð Ô/ð 	Sð 	SˆDØÔ'¨Ô-×7Ò7¸ÀdÔ8KÔ8QÑRÔRÐRÐRð	Sð 	SrV   c                óÜ  ‡‡— g }t          | j        ¦  «        D �]’Šdd„Šd}‰                     ¦   «         D ]Š}t          ˆfd„|j        D ¦   «         ¦  «        }|rdt
                               d|                     ¦   «         ¦  «         t          j	        j
                             |                     ¦   «         ¦  «         Œˆd	}Œ‹‰                     ¦   «          o| }|s|                     ‰¦  «         ŒØt
                               d
‰                     ¦   «         ¦  «         t          j	        j                             ‰                     ¦   «         ¦  «         ‰j        j        D ]J}|j        | j        v r:| j        |j                 j        }ˆfd„|D ¦   «         | j        |j                 _        ŒK�Œ”t'          t          |¦  «        ¦  «        | _        | j        D ]Š‰                     ¦   «          ŒdS )z0
        Remove any nodes without users
        rh   r”  rL   r‚   c                óZ   — | j         p$|                      ¦   «         t          j        j        v S rO   )r–  r\   r>   rv   r0  )rh   s    rT   Úcan_eliminate_userz;Scheduler.dead_node_elimination.<locals>.can_eliminate_user   s!   € Ø”|ÐT t§}¢}¡¤½!¼'Ô:TÐ'TÐTrV   Fc              3  ó.   •K  — | ]} ‰|¦  «        V — Œd S rO   r�   )r²   Úur2  s     €rT   r  z2Scheduler.dead_node_elimination.<locals>.<genexpr>¥  s/   øè è € Ð#MÐ#M¸aÐ$6Ð$6°qÑ$9Ô$9Ð#MÐ#MÐ#MÐ#MÐ#MÐ#MrV   zremoved dead buffer: %sTzremoved dead operation: %sc                ór   •— g | ]3}|j                              ¦   «         ‰                     ¦   «         k    ¯1|‘Œ4S r�   rk   )r²   r4  rE   s     €rT   r´   z3Scheduler.dead_node_elimination.<locals>.<listcomp>·  s>   ø€ ð =ð =ð =Ø"#°´·²Ñ0AÔ0AÀTÇ]Â]Á_Ä_Ò0TÐ0T˜AÐ0TÐ0TÐ0TrV   N)rh   r”  rL   r‚   )rã  r¾  r½   r  rJ   r×   r  r\   r>   rv   r…  r$  rm  rŸ  r0  r¤   rÔ   rQ   r}   rŒ   r8  )	rS   Úupdated_nodesÚactive_buffersr¸   Úcan_eliminaterŽ  rJ   r2  rE   s	          @@rT   rÀ  zScheduler.dead_node_elimination–  s
  øø€ ð ˆÝ˜TœZÑ(Ô(ð 	ñ 	ˆDðUð Uð Uð Uð #ˆNØ×'Ò'Ñ)Ô)ð *ð *�Ý #Ð#MÐ#MÐ#MÐ#MÀ3Ä9Ð#MÑ#MÔ#MÑ MÔ M�Ø ð *Ý—I’IÐ7¸¿º¹¼ÑHÔHÐHÝ”GÔ+×/Ò/°·²±´Ñ?Ô?Ð?Ð?à%)�N�Nà $× 5Ò 5Ñ 7Ô 7Ð7ÐNÀÐ<NˆMà ð Ø×$Ò$ TÑ*Ô*Ð*Ð*õ —	’	Ð6¸¿º¹¼ÑHÔHÐHÝ”Ô*×.Ò.¨t¯}ª}©¬Ñ?Ô?Ð?Ø Ô,Ô2ð ð �DØ”y DÔ$4Ð4Ð4Ø $Ô 0°´Ô ;Ô A˜ð=ð =ð =ð =Ø',ð=ñ =ô =˜Ô(¨¬Ô3Ô9øñõ �( =Ñ1Ô1Ñ2Ô2ˆŒ
ð ”Jð 	#ð 	#ˆDØ× Ò Ñ"Ô"Ð"Ð"ð	#ð 	#rV   r²  c                ó¾   ‡‡‡‡— t          ¦   «         Št          ¦   «         Šg Šdˆˆˆˆfd„Š|D ]}|                     ¦   «         D ]}|‰|<   ŒŒ|D ]} ‰|¦  «         Œ‰S )z?
        Ensure nodes is in topologically sorted order
        rß  rF   rL   rm   c                óÜ   •— | ‰vrf‰                      | ¦  «         t          | j        d„ ¬¦  «        D ]"}|j        ‰vrŒ ‰‰|j                 ¦  «         Œ#‰                     | ¦  «         d S d S )Nc                ó   — | j         S rO   r  )Úds    rT   r¬   zDScheduler.topological_sort_schedule.<locals>.visit.<locals>.<lambda>Í  s   € ÀaÄf€ rV   rw  )r$  rƒ  r¥   rQ   rŸ  )rß  rþ   r  rg   ÚseenÚvisits     €€€€rT   r>  z2Scheduler.topological_sort_schedule.<locals>.visitÊ  s‡   ø€ Ø˜ˆ}ˆ}Ø—’˜‘”�Ý! !Ô"6Ð<LÐ<LÐMÑMÔMð 2ð 2�Cà”x |Ð3Ð3Ø Ø�E˜, s¤xÔ0Ñ1Ô1Ð1Ð1Ø—’˜aÑ Ô Ð Ð Ð ð ˆ}rV   )rß  rF   rL   rm   )r   r‡  rJ  )rS   r¾  rE   rQ   r  rg   r=  r>  s       @@@@rT   r¿  z#Scheduler.topological_sort_scheduleÀ  s­   øøøø€ õ /9©l¬lˆÝ59±V´VˆØ*,ˆð	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð ð 	*ð 	*ˆDØ×-Ò-Ñ/Ô/ð *ð *�Ø%)�˜TÑ"Ð"ð*àð 	ð 	ˆDØˆE�$‰KŒKˆKˆKØˆrV   rÂ  c                óL  ‡ — t          ¦   «         }t          |t          t          t          t
          f¦  «        r%|j        D ]}|                     |j        ¦  «         Œn t          dt          |¦  «        › d�¦  «        ‚ˆ fd„|D ¦   «         }t          ˆ fd„|D ¦   «         ¦  «        S )Nz+get_unmet_dep_nodes is not implemented for ú.c              3  ó<   •K  — | ]}‰j         |         j        V — Œd S rO   )r}   rG   r+  s     €rT   r  z1Scheduler._get_unmet_dep_nodes.<locals>.<genexpr>ì  s.   øè è € ÐQÐQ¸s˜Ô)¨#Ô.Ô:ÐQÐQÐQÐQÐQÐQrV   c                óN   •— h | ]!}‰j         |                     ¦   «                  ’Œ"S r�   )r9  r\   r¨  s     €rT   rs  z1Scheduler._get_unmet_dep_nodes.<locals>.<setcomp>í  s)   ø€ ÐRÐRÐR¸q�TÔ,¨Q¯ZªZ©\¬\Ô:ÐRÐRÐRrV   )r  rs   r|  rÍ  r‡  rÐ  r¥   r$  rQ   ÚRuntimeErrorr^   rŒ   )rS   rÂ  Ú
unmet_depsrþ   Úunmet_dep_opss   `    rT   Ú_get_unmet_dep_nodeszScheduler._get_unmet_dep_nodesÛ  sÉ   ø€ Ý‘U”Uˆ
ÝØåÝ)Ý&Ý"ð	ñ
ô 
ð 	ð Ô/ð )ð )�Ø—’˜sœxÑ(Ô(Ð(Ð(ð)õ ØL½dÀ5¹k¼kÐLÐLÐLñô ð ð RÐQÐQÐQÀjÐQÑQÔQˆÝÐRÐRÐRÐRÀMÐRÑRÔRÑSÔSÐSrV   r>  c                ób  — g }t                                | j        d¦  «        }i }| j        D ]^}|                      |¦  «        }t	          |¦  «        ||<   |D ]2}|                     |g ¦  «        }|                     |¦  «         |||<   Œ3Œ_d„ |                     ¦   «         D ¦   «         }|rx|                     |¦  «         |D ]@}	|                     |	g ¦  «        D ]}
||
xx         dz  cc<   Œ|                     |	¦  «         ŒAd„ |                     ¦   «         D ¦   «         }|°x|r
J d¦   «         ‚|S )zU
        Sort nodes by their topological order, return a list of node lists.
        r   c                ó$   — g | ]\  }}|d k    ¯|‘ŒS ©r   r�   ©r²   rß  Úvs      rT   r´   z5Scheduler._topological_sort_nodes.<locals>.<listcomp>þ  s!   € Ð@Ð@Ð@¡  1¸¸aº¸˜!¸¸¸rV   r   c                ó$   — g | ]\  }}|d k    ¯|‘ŒS rI  r�   rJ  s      rT   r´   z5Scheduler._topological_sort_nodes.<locals>.<listcomp>	  s!   € ÐDÐDÐD¡D A q¸QÀ!ºV¸V˜a¸V¸V¸VrV   zTopological sort failed!)	r‡  Úfromkeysr¾  rF  rd   r  rŸ  r   r#  )rS   r‘  r¾  ÚchildrenrE   r'  rþ   ÚcÚzero_deg_nodesrß  rh   s              rT   rC  z!Scheduler._topological_sort_nodesï  sf  € ð ˆÝ—’˜dœj¨!Ñ,Ô,ˆØ#%ˆØ”Jð 	"ð 	"ˆDØ×,Ò,¨TÑ2Ô2ˆDÝ˜d™)œ)ˆE�$‰KØð "ð "�Ø—L’L  bÑ)Ô)�Ø—’˜‘”�Ø !�˜‘�ð"ð
 AÐ@¨¯ª©¬Ð@Ñ@Ô@ˆØð 	EØ�LŠL˜Ñ(Ô(Ð(Ø#ð ð �Ø$ŸLšL¨¨BÑ/Ô/ð %ð %�DØ˜$�K�K”K 1Ñ$�K�K‘K�KØ—	’	˜!‘”��ØDÐD¨E¯KªK©M¬MÐDÑDÔDˆNð ð 	Eð Ð4Ð4Ð4Ñ4Ô4ˆyØˆrV   c                ól  — i }| j         D ]�}t          ¦   «         }|j        D ]K}| j        |j                 j                             ¦   «         }|                     |¦  «         |||         z  }ŒL|||                     ¦   «         <   ||_        Œ‚t          | j         ¦  «        D ]\  }}||_
        ||_        ŒdS )z.
        Populate each node.ancestors
        N)r¾  r   r¥   r}   rQ   rG   r\   r$  rº   rÞ  r¦   r§   )rS   Úname_to_ancestorsrE   rº   rþ   Údep_node_namer‘  s          rT   rÁ  zScheduler.compute_ancestors		  sË   € ð
 9;ÐØ”Jð 	'ð 	'ˆDÝ)3©¬ˆIØÔ.ð >ð >�Ø $Ô 0°´Ô :Ô F× OÒ OÑ QÔ Q�Ø—’˜mÑ,Ô,Ð,ØÐ.¨}Ô=Ñ=�	�	Ø1:Ð˜dŸmšm™oœoÑ.Ø&ˆDŒNˆNå$ T¤ZÑ0Ô0ð 	#ð 	#‰KˆE�4Ø"ˆDŒNØ"ˆDŒNˆNð	#ð 	#rV   c                óÂ  — | j         D ]Ö}t          j        sŒt          |t          t
          f¦  «        r$|                     ¦   «         st          j        dk    rŒP|                     ¦   «         D ]q}t          |t          ¦  «        r| 	                    ¦   «         rŒ,|j
                             ¦   «         |_
        |j
        j        |_        |                     d¬¦  «         ŒrŒ×d S )NÚhalideTrO  )r¾  r   rV  rs   r|  rÐ  r;   Úcpu_backendrE  rb  rE  rÊ  re  rD  r^  )rS   rE   rÂ  s      rT   rÊ  zScheduler.merge_loops	  sé   € Ø”Jð 	;ð 	;ˆDÝÔ4ð Øõ ˜d¥]Õ4FÐ$GÑHÔHð Ø—K’K‘M”MðÝ&,Ô&8¸HÒ&DÐ&DàØŸšÑ)Ô)ð ;ð ;�å! %­Ñ7Ô7ð ¸5×;LÒ;LÑ;NÔ;Nð Øà#œk×5Ò5Ñ7Ô7�”Ø$œ{Ô0�”ð
 ×*Ò*°TÐ*Ñ:Ô:Ð:Ð:ð;ð	;ð 	;rV   c                ó¸  — t          d¦  «        5  t          d¦  «        D ] }t          |¦  «        }t                               d|dz   |¦  «         |                      |¦  «        }t          |¦  «        }t                               d|dz   ||¦  «         ||k    s|dk    r t                               d|dz   ¦  «          nŒ¡|cddd¦  «         S # 1 swxY w Y   dS )zB
        Combine eligible nodes into FusedSchedulerNodes.
        zScheduler.fused_nodesé
   z/===== attempting fusion (%d/10): %d nodes =====r   z=completed fusion round (%d/10): fused %d nodes into %d nodes
z+===== fusion complete (%d iterations) =====N)r   rD  rd   r  r  Úfuse_nodes_once)rS   r¾  rÝ  Úold_lenÚnew_lens        rT   re  zScheduler.fuse_nodes=	  sK  € õ Ð1Ñ2Ô2ð 	ð 	Ý˜2‘Y”Yð ð �Ý˜e™*œ*�Ý× Ò ØEØ˜‘EØñô ð ð
 ×,Ò,¨UÑ3Ô3�Ý˜e™*œ*�Ý× Ò ØTØ˜‘EØØñ	ô ð ð ˜gÒ%Ð%¨°Aª¨Ý×$Ò$ØEÀqÈ1Áuñô ð ð �Eð	 *6ð
 ð+	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   �B2CÃCÃCc                óª   — g }| j         D ]A}|                     t          |t          ¦  «        r|                     ¦   «         n|g¦  «         ŒB|| _         dS )zA
        Unpack GroupedSchedulerNode into regular nodes.
        N)r¾  r&  rs   rº  rf  )rS   Ú	new_nodesrE   s      rT   rÐ  zScheduler.process_grouped_nodesX	  se   € ð .0ˆ	Ø”Jð 	ð 	ˆDØ×ÒÝ!+¨DÕ2FÑ!GÔ!GÐS�—’‘”�ÈdÈVñô ð ð ð ˆŒ
ˆ
ˆ
rV   rK  úTuple[float, str]c                ó  — t          |¦  «        dk    sJ ‚|d                              ¦   «         }|| _        |                      |¦  «        }t	          d¦  «        5  |                     |¦  «        cddd¦  «         S # 1 swxY w Y   dS )úƒ
        Benchmark fused list of nodes and return the execution time
        in milliseconds on randomly generated inputs.
        r   Úbenchmark_fused_nodesN)rd   rT  rß  rT  r   ra  )rS   r¾  rY  Úbackends       rT   ra  zScheduler.benchmark_fused_nodesc	  sË   € õ �5‰zŒz˜AŠ~ˆ~ˆ~ˆ~Ø�q”×$Ò$Ñ&Ô&ˆØ$ˆÔØ×"Ò" 6Ñ*Ô*ˆÝÐ1Ñ2Ô2ð 	8ð 	8Ø×0Ò0°Ñ7Ô7ð	8ð 	8ð 	8ð 	8ñ 	8ô 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8øøøð 	8ð 	8ð 	8ð 	8ð 	8ð 	8s   ÁA=Á=BÂBc                ót  — d	d„}t          | j        ¦  «        D �]\  }}t          |t          ¦  «        �rt          |j        t
          j        ¦  «        �rá|j        }t          j        j	        s| 
                    ¦   «         \  }}n#t          d„ |j        D ¦   «         d ¦  «        }|€J ‚t          |t          j        j        j        ¦  «        r|j                             |¦  «         ŒÎ|                     ¦   «         }|j        }t          |t
          j        ¦  «        sJ ‚|j        }	t          |	t
          j        ¦  «        sJ ‚|j        |	_         |||	¦  «         |                      |	¦  «        }
|
| j        |<   |
| j        |                     ¦   «         <   |
| j        |                     ¦   «         <   t5          |
                     ¦   «         |                     ¦   «         ¦  «        D ]-\  }}|| j        |                     ¦   «         <   |j        |_        Œ.|j        |
_        |j        |
_        |j         |
_         �Œd S )
NÚ	orig_nodeúir.MultiTemplateBufferr(  úir.OperationBufferrL   rm   c                óz  — |                      ¦   «         }|                       ¦   «         }t          |t          ¦  «        rt          |t          ¦  «        sJ ‚|                     ¦   «         }|                      ¦   «         }t          |t          ¦  «        rt          |t          ¦  «        sJ ‚t          j        j        |= ||_        t          j        j        |= ||_	        t          j        j
                             | ¦  «        }t          j        j
                             |¦  «         |t          j        j
        |<   |t          j        j        |<   t          j        j                             | ¦  «        }t          j        j                             |¦  «         |t          j        j        |<   |t          j        j        |<   d S rO   )r\   rs   rW   r?  r>   rv   r%  rQ   Ú
name_to_opÚoperation_nameÚbuffersrš  ÚremoveÚ
operations)rd  r(  Úreplaced_buf_nameÚorig_buf_nameÚreplaced_op_nameÚorig_op_nameÚorigs          rT   Úreplace_operation_bufferzKScheduler.finalize_multi_template_buffers.<locals>.replace_operation_bufferr	  sd  € ð !)× 1Ò 1Ñ 3Ô 3ÐØ%×.Ò.Ñ0Ô0ˆMÝ˜m­SÑ1Ô1ÐXµjÐARÕTWÑ6XÔ6XÐXÐXÐXà'×:Ò:Ñ<Ô<ÐØ$×7Ò7Ñ9Ô9ˆLÝ˜l­CÑ0Ô0ÐVµZÐ@PÕRUÑ5VÔ5VÐVÐVÐVå”Ô&Ð'8Ð9Ø)ˆHŒMå”Ô"Ð#3Ð4Ø&2ˆHÔ#å”7”?×(Ò(¨Ñ3Ô3ˆDÝŒGŒO×"Ò" 8Ñ,Ô,Ð,Ø$,�AŒGŒO˜DÑ!Ø4<�AŒGÔ" =Ñ1å”7Ô%×+Ò+¨IÑ6Ô6ˆDÝŒGÔ×%Ò% hÑ/Ô/Ð/Ø'/�AŒGÔ˜tÑ$Ø/7�AŒGÔ˜|Ñ,Ð,Ð,rV   c              3  ób   K  — | ]*}t          |t          j        j        j        ¦  «        ¯&|V — Œ+d S rO   )rs   rå   ræ   Úselect_algorithmÚExternKernelCaller)r²   Útimings     rT   r  z<Scheduler.finalize_multi_template_buffers.<locals>.<genexpr>–	  sT   è è € ð ð à &Ý)Ø &Ý %¤Ô @Ô Sñ ô  ðØ"ðð ð ð ð ð rV   )rd  re  r(  rf  rL   rm   )!rÞ  r¾  rs   r|  rE   r   ÚMultiTemplateBufferr   Útest_configsÚ%force_extern_kernel_in_multi_templateÚget_min_choicer˜  Úchoice_timingsrå   ræ   ÚTritonTemplateCallerBaseÚfinalize_as_triton_callerÚoutput_noderâ   Ú
StorageBoxÚOperationBufferr`   r§  r  r\   r9  rˆ  r½   r}   rJ   r¦   r§   r»   )rS   rr  rÝ  rE   Ú
multi_nodeÚmin_node_unfusedrÇ  Úout_tensorboxÚout_storageÚ
out_bufferÚnew_scheduler_nodeÚnew_outÚold_outs                rT   rË  z)Scheduler.finalize_multi_template_buffersq	  s^  € ð	8ð 	8ð 	8ð 	8õ6 ! ¤Ñ,Ô,ð 2	@ñ 2	@‰GˆAˆtÝ˜$¥Ñ.Ô.ñ 1@µ:Ø”	�2Ô1ñ4ô 4ñ 1@ð "œY�
ÝÔ*ÔPð 8Ø*4×*CÒ*CÑ*EÔ*EÑ'Ð$ a aå'+ðð à*4Ô*Cðñ ô ð ñ
(ô 
(Ð$ð ,Ð7Ð7Ð7åØ$Ý”OÔ&Ô?ñô ð ð ”I×7Ò7Ð8HÑIÔIÐIØà 0× <Ò <Ñ >Ô >�Ø+Ô0�Ý! +­r¬}Ñ=Ô=Ð=Ð=Ð=Ø(Ô-�
Ý! *­bÔ.@ÑAÔAÐAÐAÐAà$.Ô$5�
Ô!Ø(Ð(¨°ZÑ@Ô@Ð@Ø%)×%?Ò%?À
Ñ%KÔ%KÐ"à 2�”
˜1‘Ø5G�Ô! $§-¢-¡/¤/Ñ2Ø;M�Ô'¨¯ª©¬Ñ8å(+Ø&×2Ò2Ñ4Ô4°d×6FÒ6FÑ6HÔ6Hñ)ô )ð 2ð 2Ñ$�G˜Wð <C�DÔ$ W×%5Ò%5Ñ%7Ô%7Ñ8Ø$+¤M�G”M�Mà/3¬~Ð"Ô,Ø/3¬~Ð"Ô,Ø04´Ð"Ô-ùðe2	@ð 2	@rV   Ú	node_listr‚   c                ó4   — t          d„ |D ¦   «         ¦  «        S )Nc              3  ó°   K  — | ]Q}t          |j        d ¦  «        o7|j        duo.t          |j        j        d¦  «        o|j        j        j        dk    V — ŒRdS )râ   NÚscatter_moder¡  )ry   rE   râ   rŒ  rÞ  s     rT   r  z,Scheduler._any_atomic_add.<locals>.<genexpr>Â	  s   è è € ð 
ð 
ð
 õ	 �A”F˜FÑ#Ô#ð 9Ø”˜dÐ"ð9å˜œœ ^Ñ4Ô4ð9ð ””Ô(¨LÒ8ð	
ð 
ð 
ð 
ð 
ð 
rV   )r  ©rS   r‰  s     rT   Ú_any_atomic_addzScheduler._any_atomic_addÁ	  s2   € Ýð 
ð 
ð
 ð
ñ 
ô 
ñ 
ô 
ð 	
rV   r  r  c                ó|  ‡‡‡‡‡‡‡‡— ‰                      ¦   «         o+t          ‰                     ¦   «         t          j        ¦  «        }t
          j        s|sdS ‰                      ¦   «         r,t          ‰                     ¦   «         t          j        ¦  «        r(‰                     ¦   «         s‰                     ¦   «         rdS ‰ 	                    ¦   «         }|d          
                    ¦   «         }|sJ ‚|j        dk    rdS ‰ 	                    ¦   «         }t          t          j        ||¦  «        ¦  «        }|                      |¦  «        rdS ddlm} t%          ‰‰¦  «        }	dˆˆfd„}
t          ‰t&          ¦  «        �rkt          ‰j        t          j        ¦  «        �rK‰j        }|j        }|                     ¦   «         \  }Š|                      |¦  «        \  ŠŠt1          d¦  «        }d}d}t3          |                     ¦   «         d„ ¬¦  «        D ] \  }}t          |t6          j        j        j        ¦  «        sŒ*|‰‰z   k    r nl|dz  }|t
          j        k    r nU‰j                             |¦  «        5  |                      |¦  «        \  Š}‰|k     r‰}|}ddd¦  «         n# 1 swxY w Y   Œ¡ |
|‰‰¦  «         |‰‰z   k     r|�‰j                              |¦  «         dS dS 	 |                      |¦  «        \  ŠŠtC          j"        ‰¦  «        r |	d¦  «         dS |                      |¦  «        \  ŠŠtC          j"        ‰¦  «        r |	d¦  «         dS |                      |¦  «        \  ŠŠtC          j"        ‰¦  «        r |	d¦  «         dS n%# |$ r}dtG          |¦  «        v rY d}~dS ‚ d}~ww xY w |
‰‰‰¦  «         tI          d¦  «        rZ‰‰‰z   k    rQ‰‰f| j%        vrF| j%         &                    ‰‰f¦  «         tO          d¦  «         (                    ˆˆˆˆˆˆfd„¦  «         ‰‰‰z   k     S )ú‡
        If config.benchmark_fusion is False, always return True.
        Otherwise, return True if fusion can brings speedup.
        Tr   rW  ©ÚCompilationErrorÚms_fusedrÕ  Úms1Úms2rL   rm   c           
     óÂ  •— t                                t          j        ¦  «        r¹| ||z   k     rXt                                d‰                     ¦   «         ‰                     ¦   «         t          ||z   | z  d›¦  «        ¦  «         d S t                                d‰                     ¦   «         ‰                     ¦   «         t          | ||z   z  d›¦  «        ¦  «         d S d S )Nz9can fuse (benchmark): fusing %s with %s cause %sx speedupú.3fz=cannot fuse (benchmark): fusing %s with %s cause %sx slowdown)r  rê  rë  ÚDEBUGr  rJ  r0   r1   )r“  r”  r•  r  r  s      €€rT   Ú
log_fusionz/Scheduler.speedup_by_fusion.<locals>.log_fusionö	  sð   ø€ Ý×&Ò&¥w¤}Ñ5Ô5ð Ø˜c C™iÒ'Ð'Ý×$Ò$ØSØ×.Ò.Ñ0Ô0Ø×.Ò.Ñ0Ô0Ý" s¨S¡y°HÑ&<Ð#BÐ#BÑCÔCñ	ô ð ð ð õ ×$Ò$ØWØ×.Ò.Ñ0Ô0Ø×.Ò.Ñ0Ô0Ý  H°°c±	Ñ$:Ð!@Ð!@ÑAÔAñ	ô ð ð ð ðð rV   ÚinfNc                ó   — | d         S r  r�   ru  s    rT   r¬   z-Scheduler.speedup_by_fusion.<locals>.<lambda>
  s
   € °a¸´d€ rV   rw  r   Fz%register spilling of the first kernelz&register spilling of the second kernelz%register spilling of the fused kernelúLoop-carried variableÚslow_fusionc            	     ó$   •— ‰‰ ‰‰‰‰‰‰ ‰z   z  dœS )N)Úkernel1_pathÚkernel1_latencyÚkernel2_pathÚkernel2_latencyÚfused_kernel_pathÚfused_kernel_latencyÚslow_down_ratior�   )r”  r•  r“  Úpath1Úpath2Ú
path_fuseds   €€€€€€rT   r¬   z-Scheduler.speedup_by_fusion.<locals>.<lambda>Q
  s-   ø€ Ø$)Ø'*Ø$)Ø'*Ø)3Ø,4Ø'/°3¸±9Ñ'=ðð € rV   )r“  rÕ  r”  rÕ  r•  rÕ  rL   rm   ))rb  rs   r  r   rw  r   Úbenchmark_fusionÚTritonTemplateBufferrf  rE  rT  r^   rŒ   r  r  rŽ  Útriton.compiler.errorsr’  r  r|  rE   r{  rz  ra  rÕ  rƒ  r   rå   ræ   r|  Ú max_epilogue_benchmarked_choicesÚswap_as_triton_callerr}  ÚmathÚisinfrW   r   rÆ  r$  r   r×  )rS   r  r  Úis_multi_templateÚnode_list_1rY  Únode_list_2Únode_list_fusedr’  r  r™  r�  r{  rÇ  Úmin_ms_fusedÚms_fused_choiceÚtriton_choicesÚchoiceÚunfused_timerõ  r”  r•  r“  r¦  r§  r¨  s    ``                 @@@@@@rT   Úspeedup_by_fusionzScheduler.speedup_by_fusionÊ	  sF  øøøøøøøø€ ð "×-Ò-Ñ/Ô/ð 
µJØ×#Ò#Ñ%Ô%¥rÔ'=ñ5
ô 5
Ðõ Ô&ð 	Ð/@ð 	Ø�4ð ×ÒÑÔð	å˜u×6Ò6Ñ8Ô8½"Ô:QÑRÔRð	ð ×ÒÑ!Ô!ð	ð ×ÒÑ!Ô!ð		ð �4à—o’oÑ'Ô'ˆØ˜Q”×*Ò*Ñ,Ô,ˆØˆˆˆvð Œ;˜%ÒÐØ�4à—o’oÑ'Ô'ˆÝ�yœ¨{¸KÑHÔHÑIÔIˆð
 ×Ò Ñ0Ô0ð 	Ø�4à;Ð;Ð;Ð;Ð;Ð;å˜˜uÑ%Ô%ˆð	ð 	ð 	ð 	ð 	ð 	ð 	õ" �e�]Ñ+Ô+ñ @	µ
ØŒJ�Ô.ñ1
ô 1
ñ @	ð œˆJØ'Ô6ˆNà×.Ò.Ñ0Ô0‰FˆAˆsØ×3Ò3°KÑ@Ô@‰JˆC�å  ™<œ<ˆLØ"ˆOàˆNå(.Ø×$Ò$Ñ&Ô&¨N¨Nð)ñ )ô )ð 1ð 1Ñ$�˜õ " &­%¬/Ô*<Ô*UÑVÔVð Øà 3¨¡9Ò,Ð,Ø�Eà !Ñ#�Ø!¥FÔ$KÒKÐKØ�Eð ”Z×5Ò5°fÑ=Ô=ð 1ð 1Ø"&×"<Ò"<¸_Ñ"MÔ"M‘K�H˜aà ,Ò.Ð.Ø'/˜Ø*0˜ð1ð 1ð 1ñ 1ô 1ð 1ð 1ð 1ð 1ð 1ð 1øøøð 1ð 1ð 1ð 1øð ˆJ�| S¨#Ñ.Ô.Ð.ð ˜s S™yÒ)Ð)¨oÐ.IØ”
×4Ò4°_ÑEÔEÐEØ�tà�uðØ!×7Ò7¸ÑDÔD‘
��UÝ”:˜c‘?”?ð !Ø�CÐ?Ñ@Ô@Ð@Ø ˜5Ø!×7Ò7¸ÑDÔD‘
��UÝ”:˜c‘?”?ð !Ø�CÐ@ÑAÔAÐAØ ˜5Ø'+×'AÒ'AÀ/Ñ'RÔ'RÑ$�˜*Ý”:˜hÑ'Ô'ð !Ø�CÐ?Ñ@Ô@Ð@Ø ˜5ð!øð $ð ð ð à*­c°!©f¬fÐ4Ð4Ø˜4˜4˜4˜4˜4àøøøøðøøøð 	ˆ
�8˜S #Ñ&Ô&Ð&å# MÑ2Ô2ð	à˜C #™IÒ%Ð%Ø˜� dÔ&=Ð=Ð=àÔ#×'Ò'¨°¨Ñ7Ô7Ð7Ý˜]Ñ+Ô+×3Ò3ðð ð ð ð ð ð ð ð ñ
ô 
ð 
ð ˜# ™)Ò#Ð#s<   É<#J+Ê+J/	Ê2J/	Ë.7N Ì'7N Í 7N ÎN<ÎN7Î6N7Î7N<c                óª  ‡— t          |¦  «        }t                               t          j        ¦  «        rNt                               d¦  «         |D ]1}t                               d|                     ¦   «         z   ¦  «         Œ2|                      |¦  «        D �]}\  }}| j        | 	                    ¦   «                  }| j        | 	                    ¦   «                  }|  
                    ||¦  «        �r"|                      ||¦  «        �s|                      ||¦  «        sŒ‰t                               d|                     ¦   «         |                     ¦   «         ¦  «         |                     ¦   «         }|                      |¦  «                             ||¦  «        Š|                     |¦  «         |                     |¦  «         |                     ‰¦  «         | j                             ˆfd„‰                     ¦   «         D ¦   «         ¦  «         �Œt+          |d„ ¬¦  «        }|                      |¦  «        }|                      |¦  «         |S )a  
        Combine eligible nodes into FusedSchedulerNodes.

        This relies on two key functions to control the logic:
            - self.can_fuse(): checks if a fusion is legal
            - self.score_fusion(): assigns priority to a given fusion
        zfuse_nodes_once, candidates:z  zfusing %s with %sc                ó:   •— i | ]}|                      ¦   «         ‰“ŒS r�   r¶   )r²   rß  Únode3s     €rT   r¹   z-Scheduler.fuse_nodes_once.<locals>.<dictcomp>
  s#   ø€ ÐDÐDÐD¨Q�Q—Z’Z‘\”\ 5ÐDÐDÐDrV   c                ó   — | j         S rO   r¶  ru  s    rT   r¬   z+Scheduler.fuse_nodes_once.<locals>.<lambda>�
  s   € °!´+€ rV   rw  )r   r  rê  rë  r˜  r  rï   Úget_possible_fusionsr9  rA  r  Úwill_fusion_create_cycler¹  r\   rT  rT  r¿  rk  r$  rä  rE  rƒ  r¿  r=  )rS   r¾  r‹  rE   r  r  rY  r¼  s          @rT   rY  zScheduler.fuse_nodes_once]
  s?  ø€ õ ! Ñ'Ô'ˆÝ×"Ò"¥7¤=Ñ1Ô1ð 	@Ý×ÒÐ;Ñ<Ô<Ð<Ø#ð @ð @�Ý× Ò  ¨×(<Ò(<Ñ(>Ô(>Ñ!>Ñ?Ô?Ð?Ð?Ø ×5Ò5°eÑ<Ô<ð 	ñ 	‰LˆE�5ØÔ+¨E×,@Ò,@Ñ,BÔ,BÔCˆEØÔ+¨E×,@Ò,@Ñ,BÔ,BÔCˆEØ�}Š}˜U EÑ*Ô*ñ °4×3PÒ3PØ�uñ4ô 4ñ ð ×-Ò-¨e°UÑ;Ô;ð ØÝ× Ò Ø'¨¯ªÑ)9Ô)9¸5¿>º>Ñ;KÔ;Kñô ð ð
 ×)Ò)Ñ+Ô+�Ø×(Ò(¨Ñ0Ô0×5Ò5°e¸UÑCÔC�Ø×"Ò" 5Ñ)Ô)Ð)Ø×"Ò" 5Ñ)Ô)Ð)Ø—’ Ñ&Ô&Ð&ØÔ'×.Ò.ØDÐDÐDÐD°%·/²/Ñ2CÔ2CÐDÑDÔDñô ð ùõ �{Ð(=Ð(=Ð>Ñ>Ô>ˆØ×.Ò.¨uÑ5Ô5ˆØ×!Ò! %Ñ(Ô(Ð(ØˆrV   Nr­  úOptional[int]c                óF  ‡	— t          | j        ¦  «        }d}t          | j        ¦  «        }t                               d|¦  «         t          t                               | ¦  «        ¦  «        D �]2\  }}t                               |¦  «        }t          |¦  «        dk     rŒ4|�||k    r nö|  	                    |¦  «        st                               d|¦  «         Œo|dz  }t          j        dk    }t          |d         j        |d|¬¦  «        Š	t                               d	t          |¦  «        |¦  «         |D ]}|                     |¦  «         Œ|                     ‰	¦  «         | j                             ˆ	fd
„‰	                     ¦   «         D ¦   «         ¦  «         �Œ4t'          |d„ ¬¦  «        | _        |                      | j        ¦  «        | _        t                               d||t          | j        ¦  «        ¦  «         |                      | j        ¦  «         dS )z'
        Groups parallel nodes
        r   z2ComboKernels: Generating with num_ck_nodes = %d...r£  Nz)ComboKernels: Not speeding up %d-th groupr   Trô  z0ComboKernels: Combining %d nodes for %d-th groupc                ó:   •— i | ]}|                      ¦   «         ‰“ŒS r�   r¶   )r²   rß  r§  s     €rT   r¹   z7Scheduler.create_combo_kernel_nodes.<locals>.<dictcomp>ª
  s#   ø€ ÐLÐLÐL¨q�—’‘”˜{ÐLÐLÐLrV   c                ó   — | j         S rO   r¶  ru  s    rT   r¬   z5Scheduler.create_combo_kernel_nodes.<locals>.<lambda>¬
  s   € °q´{€ rV   rw  zEGenerated ComboKernel nodes: %d ComboKernels, totally %d -> %d nodels)r  r¾  rd   r×   r  rÞ  r  rP  r=  Úspeedup_by_combo_kernelr   rø  rD   rñ   rk  r$  r9  rä  rE  rƒ  r¿  r=  )
rS   r­  r‹  ÚcountÚnum_nodes_origÚnumr‰  r'  rE   r§  s
            @rT   rÏ  z#Scheduler.create_combo_kernel_nodes†
  s-  ø€ õ ˜$œ*‘o”oˆØˆÝ˜TœZ™œˆÝ�	Š	ÐFÈÑUÔUÐUÝ'Ý&×DÒDÀTÑJÔJñ
ô 
ð 	ñ 	‰NˆC�õ 3×CÒCÀIÑNÔNˆIÝ�9‰~Œ~ Ò!Ð!ØØÐ'¨E°LÒ,@Ð,@Ø�Ø×/Ò/°	Ñ:Ô:ð Ý—	’	ÐEÀsÑKÔKÐKØØ�Q‰JˆEÝ$Ô;¸aÒ?ˆOÝ4Ø˜!”Ô&ØØ*.Ø /ð	ñ ô ˆKõ �HŠHØBÝ�I‘”Øñô ð ð
 "ð )ð )�Ø×"Ò" 4Ñ(Ô(Ð(Ð(Ø�OŠO˜KÑ(Ô(Ð(ØÔ#×*Ò*ØLÐLÐLÐL°K×4IÒ4IÑ4KÔ4KÐLÑLÔLñô ð ñ õ ˜KÐ-BÐ-BÐCÑCÔCˆŒ
Ø×3Ò3°D´JÑ?Ô?ˆŒ
Ý�ŠØSØØÝ�”
‰OŒOñ		
ô 	
ð 	
ð 	×!Ò! $¤*Ñ-Ô-Ð-Ð-Ð-rV   c                óD   — |D ]}|                      | j        ¦  «         Œd S rO   )r=  r9  )rS   r¾  rE   s      rT   r=  zScheduler.prune_redundant_deps¶
  s5   € Øð 	?ð 	?ˆDØ×%Ò% dÔ&=Ñ>Ô>Ð>Ð>ð	?ð 	?rV   ú1List[Tuple[BaseSchedulerNode, BaseSchedulerNode]]c                óò  ‡ ‡	‡
— g Š	t          ¦   «         Š
dˆ	ˆ
ˆ fd„}t          j        t          ¦  «        }|D ]J}‰                      |¦  «        rŒ|                     ¦   «         D ]}||                              |¦  «         ŒŒK|                     ¦   «         D ]} ||¦  «         Œt          j	        rnt          j        t          ¦  «        }|D ]0}t          |dd¦  «        }|r||                              |¦  «         Œ1|                     ¦   «         D ]} ||¦  «         Œ‰                      ‰	¦  «        Š	‰	                     ‰ j        d¬	¦  «         t                               d
t!          ‰	¦  «        ¦  «         ‰	S )z^
        Helper to find all legal fusion opportunities, sorted by self.score_fusion()
        r¾  r²  rL   rm   c                ó�  •— t          | ¦  «        D ]´\  }}| |dz   d …         D ]¡}||f}|‰v rŒ‰                     |¦  «         ‰                     ||¦  «        r‰                     |¦  «         ŒL|                     ¦   «         s|                     ¦   «         r-‰                     ||¦  «        r‰                     ||f¦  «         Œ¢Œµd S r  )rÞ  r$  r  rŸ  rb  rf  )r¾  Únode1_indexr  r  rx  Úpossible_fusionsr=  rS   s        €€€rT   Úcheck_all_pairsz7Scheduler.get_possible_fusions.<locals>.check_all_pairsÃ
  s  ø€ Ý&/°Ñ&6Ô&6ð @ð @Ñ"�˜UØ" ;°¡?Ð#4Ð#4Ô5ð @ð @�EØ  %˜.�CØ˜d�{�{Ø Ø—H’H˜S‘M”M�Mà—}’} U¨EÑ2Ô2ð @Ø(×/Ò/°Ñ4Ô4Ð4Ð4Ø×+Ò+Ñ-Ô-ð @°×1AÒ1AÑ1CÔ1Cð @ÈÏÊØ˜uñJô Jð @ð )×/Ò/°¸°Ñ?Ô?Ð?øð@ð@ð @rV   r¢   NT)rx  Úreversezfound %d possible fusions©r¾  r²  rL   rm   )r   rÏ  r   rŒ   Úunfusable_noder  rŸ  r�   r   Úaggressive_fusionrÒ   Ú*get_possible_fusions_with_highest_priorityr�  Úscore_fusion_keyr  r  rd   )rS   r¾  rÎ  Úbuffer_names_groupingrE   r¸   Únode_groupingÚgroup_groupingr¢   rÍ  r=  s   `        @@rT   r¾  zScheduler.get_possible_fusionsº
  sÓ  øøø€ ð ÐÝHRÉÌˆð	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@õ  !,Ô 7½Ñ =Ô =ÐØð 	8ð 	8ˆDØ×"Ò" 4Ñ(Ô(ð ØØ×-Ò-Ñ/Ô/ð 8ð 8�Ø% cÔ*×1Ò1°$Ñ7Ô7Ð7Ð7ð8à2×9Ò9Ñ;Ô;ð 	+ð 	+ˆMØˆO˜MÑ*Ô*Ð*Ð*åÔ#ð 	/Ý(Ô4µTÑ:Ô:ˆNØð 7ð 7�Ý  g¨tÑ4Ô4�Øð 7Ø" 5Ô)×0Ò0°Ñ6Ô6Ð6øØ!/×!6Ò!6Ñ!8Ô!8ð /ð /�Ø� Ñ.Ô.Ð.Ð.à×JÒJØñ
ô 
Ðð 	×Ò $Ô"7ÀÐÑFÔFÐFÝ×ÒÐ4µcÐ:JÑ6KÔ6KÑLÔLÐLØÐrV   c                óÜ  ‡ ‡‡‡‡— t          ¦   «         Šdˆˆˆˆ ˆfd„Š|                     ¦   «         j                             ¦   «         |                     ¦   «         j                             ¦   «         z  Š|j        j                             ¦   «         |j        j                             ¦   «         z  ‰z
  Št          ˆˆ fd„‰D ¦   «         ¦  «        }|r t          ||¦  «        d¦  «         |S )	z~
        Finds whether there's a path from node1 to node2 (or vice-versa)
        caused indirectly by other fusions.
        rE   rF   rL   r‚   c                ó,  •— t          | t          ¦  «        r}| ‰vry‰                     | ¦  «         |                      ¦   «                              ‰¦  «        rdS t          ‰| j        z  ¦  «        p#t          ˆˆfd„| j        ‰z
  D ¦   «         ¦  «        S dS )NFc              3  óD   •K  — | ]} ‰‰j         |         ¦  «        V — Œd S rO   ©r9  ©r²   rß  Ú
found_pathrS   s     €€rT   r  zIScheduler.will_fusion_create_cycle.<locals>.found_path.<locals>.<genexpr>  sQ   øè è € ð Hð Hàð #˜
 4Ô#:¸1Ô#=Ñ>Ô>ðHð Hð Hð Hð Hð HrV   )rs   rÐ  r$  rF  Úissubsetr‚   rº   r  )rE   Úcombined_ancestorsÚcombined_namesrÝ  rS   Úvisiteds    €€€€€rT   rÝ  z6Scheduler.will_fusion_create_cycle.<locals>.found_pathö
  sÊ   ø€ å˜$Õ 2Ñ3Ô3ð ¸ÀGÐ8KÐ8KØ—’˜DÑ!Ô!Ð!Ø×+Ò+Ñ-Ô-×6Ò6Ð7IÑJÔJð ð !˜5õ   °´Ñ ?Ñ@Ô@ð ÅCð Hð Hð Hð Hð Hà!%¤Ð2DÑ!DðHñ Hô Hñ Eô Eð ð �5rV   c              3  óD   •K  — | ]} ‰‰j         |         ¦  «        V — Œd S rO   rÛ  rÜ  s     €€rT   r  z5Scheduler.will_fusion_create_cycle.<locals>.<genexpr>  s5   øè è € ÐWÐW¸q�J�J˜tÔ6°qÔ9Ñ:Ô:ÐWÐWÐWÐWÐWÐWrV   zwill create cycle©rE   rF   rL   r‚   )r  rF  Ú_dictr·  rº   r  r  )rS   r  r  Úcyclerß  rà  rÝ  rá  s   `   @@@@rT   r¿  z"Scheduler.will_fusion_create_cycleì
  s  øøøøø€ õ ,/©5¬5ˆð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð2 ×%Ò%Ñ'Ô'Ô-×2Ò2Ñ4Ô4Ø×'Ò'Ñ)Ô)Ô/×4Ò4Ñ6Ô6ñ7ð 	ð
 ŒOÔ!×&Ò&Ñ(Ô(¨5¬?Ô+@×+EÒ+EÑ+GÔ+GÑGØñÐõ ÐWÐWÐWÐWÐWÐDVÐWÑWÔWÑWÔWˆØð 	9Ø#�I�e˜UÑ#Ô#Ð$7Ñ8Ô8Ð8ØˆrV   c                ó”  ‡ ‡— ddl mŠ dˆ fd„} ||¦  «        } ||¦  «        }ˆfd„|D ¦   «         }ˆfd	„|D ¦   «         }|                     |¦  «        }d
}	|D ]-}
	 |	t          |
d         ¦  «        z  }	Œ# t          $ r Y  dS w xY w‰                      ||¦  «        }t          j        j         	                    |	d|z  ¦  «        rdS dS )aó  
        Return true if fusing the two nodes can potentially increasing peak memory.

        The implementation is more like a heuristic since we don't really know if we are at peak
        or not when trying to fuse these two ndoes. The order of nodes may change later which makes the
        peak memory estimation hard.

        Here is how we decide the LOWER BOUND of extra memory allocation if we fuse these 2 nodes:
        1. find all buffers read by each node with a single user. These buffers are supposed to
           be reused if we don't fuses these 2 nodes
        2. find the intersection of these buffers for the two node and sum the total buffer size.
           If we don't fuse these two nodes, we can at lease avoid this much memory allocation.
           Note that the extra memory allocation is not necessarily causing peak memory increase.
           This is just a heuristic.

        We return true only if the saving for fusion can not trade off the extra memory allocation.
        r   ro  rE   rF   rL   úList[ir.Buffer]c                ó  •— g }| j         j        D ]n}‰j                             |j        ¦  «        }|rKt          |j        ¦  «        dk    r3|j                             ¦   «         r| 	                    |j        ¦  «         Œo|S r  )
r¤   rÔ   r}   r  rQ   rd   rJ   rE   Úhas_tensor_outputrŸ  )rE   r³   r  r¸   rS   s       €rT   Ú_find_single_user_inputszKScheduler.can_fusion_increase_peak_memory.<locals>._find_single_user_inputs1  s~   ø€ ð ˆFØÔ&Ô,ð ,ð ,�ØÔ&×*Ò*¨2¬7Ñ3Ô3�Øð ,�3˜sœy™>œ>¨QÒ.Ð.°3´8×3MÒ3MÑ3OÔ3OÐ.Ø—M’M #¤(Ñ+Ô+Ð+øØˆMrV   c                ó&   •— h | ]} ‰|¦  «        ’ŒS r�   r�   ©r²   r¸   rp  s     €rT   rs  z<Scheduler.can_fusion_increase_peak_memory.<locals>.<setcomp>?  ó%   ø€ ÐIÐIÐI°CÐ*Ð*¨3Ñ/Ô/ÐIÐIÐIrV   c                ó&   •— h | ]} ‰|¦  «        ’ŒS r�   r�   rì  s     €rT   rs  z<Scheduler.can_fusion_increase_peak_memory.<locals>.<setcomp>@  rí  rV   r   r£  Fé    T)rE   rF   rL   rç  )
r{  rp  ÚintersectionrM   ræ  Úscore_fusion_memoryr>   rv   r±  Ústatically_known_gt)rS   r  r  rê  Úlhs_dep_nodesÚrhs_dep_nodesÚlhs_reuse_keysÚrhs_reuse_keysÚcommon_reuse_keysÚmemory_overheadrx  Ú	bw_savingrp  s   `           @rT   Úcan_fusion_increase_peak_memoryz)Scheduler.can_fusion_increase_peak_memory  s5  øø€ ð* 	6Ð5Ð5Ð5Ð5Ð5ð	ð 	ð 	ð 	ð 	ð 	ð 1Ð0°Ñ7Ô7ˆØ0Ð0°Ñ7Ô7ˆàIÐIÐIÐI¸=ÐIÑIÔIˆØIÐIÐIÐI¸=ÐIÑIÔIˆà*×7Ò7¸ÑGÔGÐàˆØ$ð 	ð 	ˆCðØ¥3 s¨1¤v¡;¤;Ñ.��øÝð ð ð à�u�u�uðøøøð ×,Ò,¨U°EÑ:Ô:ˆ	õ Œ7Ô×/Ò/°ÀÀiÁÑPÔPð 	Ø�4Øˆus   ÁA6Á6
BÂBc                ó–   — t          t          |j        |j        z
  ¦  «        t          |j        |j        z
  ¦  «        ¦  «        }|dk    S )aB  
        This function prevents fusion for nodes that can increase memory
        footprint. This problem is more common in horizontal fusion, where nodes
        that are far apart in the original order get fused, lengthening the live
        intervals of tensors. This is very evident in models with activation
        checkpointing, where the recomputed nodes from different checkpointed
        regions get fused and significantly increase the memory footprint.

        The current attempt is a quick, possibly hacky, heuristic to prevent the
        fusion of nodes that are far away in the original order.

        A better but difficult to implement heurisitic would be to use live
        intervals of the buffers, find region of peak pressure in the original
        program and prevent fusion that crosses that peak region. We might need
        special care or good approximation in this implementation, as fusion of
        node changes live intervals, and re-computing live intervals and peak
        memory after each fusion can introduce large compilation overhead.
        é@   )rô  r|  r¦   r§   )rS   r  r  Úproximity_scores       rT   Úare_long_distant_nodesz Scheduler.are_long_distant_nodesS  sH   € õ* Ý�” %¤/Ñ1Ñ2Ô2Ý�” %¤/Ñ1Ñ2Ô2ñ
ô 
ˆð  Ò#Ð#rV   Úcommon_buf_namesúTuple[str, ...]c                óÜ  — i }d„ |j                              ¦   «         D ¦   «         }d„ |j                              ¦   «         D ¦   «         }|D �]’}t          j                             |¦  «        }||         }	||         }
|	                     ¦   «         |
                     ¦   «         k    r0d|	                     ¦   «         › d|
                     ¦   «         › �||<   ŒŒt          |	j        ¦  «        t          |
j        ¦  «        k    rd||<   Œ¼t          |	t          ¦  «        rt          |
t          ¦  «        s'dt          |	¦  «        › dt          |
¦  «        › �||<   �Œ|	                     ¦   «         }|
                     ¦   «         }||k    rd|› d|› �||<   �ŒH|	                     ¦   «         |
                     ¦   «         k    rd|	› d|
› �||<   �Œd	|	› d|
› d
|j        › �||<   �Œ”t          |¦  «        S )z}
        Try to decide reasons why fusion fail due to no shared memory even though
        there are common buffers.
        c                ó   — i | ]
}|j         |“ŒS r�   r  r  s     rT   r¹   z7Scheduler.decide_fusion_fail_reason.<locals>.<dictcomp>y  ó   € ÐXÐXÐX¨C˜#œ( CÐXÐXÐXrV   c                ó   — i | ]
}|j         |“ŒS r�   r  r  s     rT   r¹   z7Scheduler.decide_fusion_fail_reason.<locals>.<dictcomp>z  r  rV   zdifferent numel: z v.s. Ú	broadcastznot MemoryDep: zdifferent offset: zMismatch loop orders: zUnknown reason: z
. Layout: )r¤   rs  r>   rv   rÃ  rÝ  r=   r›  rs   r&   r^   Ú
get_offsetÚnormalize_with_stride_orderr`   rW   )rS   r  r  rÿ  ÚreasonsÚnode1_name2depÚnode2_name2deprO  r¸   Úlhs_depÚrhs_depÚlhs_offÚrhs_offs                rT   Údecide_fusion_fail_reasonz#Scheduler.decide_fusion_fail_reasonn  sF  € ð ˆØXÐX°5Ô3D×3UÒ3UÑ3WÔ3WÐXÑXÔXˆØXÐX°5Ô3D×3UÒ3UÑ3WÔ3WÐXÑXÔXˆà(ð )	Rñ )	RˆHÝ”'×$Ò$ XÑ.Ô.ˆCØ$ XÔ.ˆGØ$ XÔ.ˆGà× Ò Ñ"Ô" g×&7Ò&7Ñ&9Ô&9Ò9Ð9ð Y¨×(9Ò(9Ñ(;Ô(;ÐXÐXÀ7×CTÒCTÑCVÔCVÐXÐXð Øñð õ ˜Wœ\Ñ*Ô*­m¸G¼LÑ.IÔ.IÒIÐIØ$/�˜Ñ!Øå˜g¥yÑ1Ô1ð ½ÀGÍYÑ9WÔ9Wð ð K¥d¨7¡m¤mÐJÐJ½4À¹=¼=ÐJÐJð Øññ à×(Ò(Ñ*Ô*ˆGØ×(Ò(Ñ*Ô*ˆGØ˜'Ò!Ð!ð %R¸Ð$QÐ$QÈÐ$QÐ$Q�˜Ñ!Ùð ×3Ò3Ñ5Ô5Ø×6Ò6Ñ8Ô8ò9ð 9ð %V¸WÐ$UÐ$UÈGÐ$UÐ$U�˜Ñ!Ùð
 R 7ÐQÐQ°'ÐQÐQÀSÄZÐQÐQð Øññ õ �7‰|Œ|ÐrV   rM   c                óÄ  — t           j        rt          d„ ||fD ¦   «         ¦  «        rdS |j                             ¦   «         }|j                             ¦   «         }||z  }|sdS d„ |j                             ¦   «         D ¦   «         }d„ |j                             ¦   «         D ¦   «         }g }|D ]Š}	||	         }
||	         }|
                     ¦   «         |                     ¦   «         k    rN|                     t          j	        j
                             |
                     ¦   «         d¬¦  «        |
|f¦  «         Œ‹t          |¦  «        dk    rdS t          |d„ ¬¦  «        \  }}
}|
j        |j        k    rA|
                     ¦   «         |                     ¦   «         k    r|                      |
¦  «        S dS |                     ¦   «         s|                     |
|¦  «         nk|                     ¦   «         s|                     ||
¦  «         n@t(                               d|                     ¦   «         |                     ¦   «         ¦  «         |                      ||¦  «        S )	zð
        Right now just greedily reorder the loop of node1 to be compatible with node2,
        but ideally we should have some heuristics to reorder the loop for node2
        to be compatibile with node1 if that's more efficient.
        c              3  ó>   K  — | ]}|                      ¦   «         V — Œd S rO   )rZ  rÞ  s     rT   r  z>Scheduler.shared_data_after_reordering_loop.<locals>.<genexpr>´  s;   è è € ð 8
ð 8
ØˆA�HŠH‰JŒJð8
ð 8
ð 8
ð 8
ð 8
ð 8
rV   r   c                ó   — i | ]
}|j         |“ŒS r�   r  r  s     rT   r¹   z?Scheduler.shared_data_after_reordering_loop.<locals>.<dictcomp>À  r  rV   c                ó   — i | ]
}|j         |“ŒS r�   r  r  s     rT   r¹   z?Scheduler.shared_data_after_reordering_loop.<locals>.<dictcomp>Á  r  rV   r¯  c                ó   — | d         S rÍ  r�   ru  s    rT   r¬   z=Scheduler.shared_data_after_reordering_loop.<locals>.<lambda>Ø  s
   € ÀÀ!Ä€ rV   rw  z?Don't reorder loops since both nodes are reductions: %s v.s. %s)r   rV  r  r¤   Úbuffer_namesrs  r  rŸ  r>   rv   r±  r²  rÝ  rd   rô  rm  rP  Údep_size_hintr]  rö   rp  r  r\   rñ  )rS   r  r  Únode1_buffer_namesÚnode2_buffer_namesÚcommon_buffer_namesr	  r
  Ú
candidatesÚbuffer_namer  r  Únumels                rT   Ú!shared_data_after_reordering_loopz+Scheduler.shared_data_after_reordering_loop©  s›  € õ Ô0ð 	µCð 8
ð 8
Ø!&¨ ð8
ñ 8
ô 8
ñ 5
ô 5
ð 	ð �1à"Ô.×;Ò;Ñ=Ô=ÐØ"Ô.×;Ò;Ñ=Ô=Ðà0Ð3EÑEÐØ"ð 	Ø�1àXÐX°5Ô3D×3UÒ3UÑ3WÔ3WÐXÑXÔXˆØXÐX°5Ô3D×3UÒ3UÑ3WÔ3WÐXÑXÔXˆð ˆ
Ø.ð 	ð 	ˆKØ$ [Ô1ˆGØ$ [Ô1ˆGà×3Ò3Ñ5Ô5Ø×6Ò6Ñ8Ô8ò9ð 9ð ×!Ò!åœÔ(×2Ò2°7×3DÒ3DÑ3FÔ3FÐQRÐ2ÑSÔSØØðñô ð øõ ˆz‰?Œ?˜aÒÐØ�1õ #& j°n°nÐ"EÑ"EÔ"EÑˆˆw˜àÔ˜wÔ/Ò/Ð/ð
 × Ò Ñ"Ô" g×&7Ò&7Ñ&9Ô&9Ò9Ð9Ø×)Ò)¨'Ñ2Ô2Ð2Ø�1ð ×!Ò!Ñ#Ô#ð 		Ø×+Ò+¨G°WÑ=Ô=Ð=Ð=Ø×#Ò#Ñ%Ô%ð 	Ø×+Ò+¨G°WÑ=Ô=Ð=Ð=å×#Ò#ØQØ—’Ñ Ô Ø—’Ñ Ô ñô ð ð ×'Ò'¨¨uÑ5Ô5Ð5rV   c                ód   — t          |t          t          f¦  «        o|                     ¦   «          S )z>
        Is this node unfusable under any conditions.
        )rs   rÍ  r‡  rb  rÀ   s     rT   rÑ  zScheduler.unfusable_nodeñ  s4   € õ
 �tÕ7Õ9OÐPÑQÔQð 'Ø×$Ò$Ñ&Ô&Ð&ð	
rV   c                ó  — ||u rdS t          ||¦  «        }t          |t          ¦  «        st          |t          ¦  «        r |d¦  «         dS t          |t          t          f¦  «        r!|                     ¦   «         s |d¦  «         dS t          |t          t          f¦  «        r!|                     ¦   «         s |d¦  «         dS |                     ¦   «         |j        z  r |d¦  «         dS |                     ¦   «         r |d¦  «         dS |                     ¦   «         rA|                     ¦   «         s | 	                    ¦   «         st          j        s |d¦  «         dS |                     ¦   «         t          j        j        z  s&|                     ¦   «         t          j        j        z  r |d¦  «         dS |                     ¦   «         }|                     ¦   «         }||k    r |d	||¦  «         dS ~|                      ||¦  «        }|d
k    r|                      ||¦  «        }t&                               t*          j        ¦  «        rAt&                               d|                     ¦   «         |                     ¦   «         |¦  «         t          j                             | |||¦  «        sdS |                     ¦   «         |j        z  ra|                      ||¦  «        oJt          j                             | |||¦  «        o(|                      |¦  «                             ||¦  «        S t          j                             | |||¦  «        o(|                      |¦  «                             ||¦  «        S )zj
        Determine if it is possible to combine node1 and node2 into a
        single fused node.
        Fz/grouped node must not be fused with other nodesznode1 is extern or nopznode2 is extern or nopznode1 must go before node2z!templates can only fuse epiloguesztemplate epilogue not satisfiedz#fusion for buffer explicit disabledzdevice mismatch (%s vs %s)r   z%s and %s has %s shared data)r  rs   rº  rÍ  r‡  rb  rF  rº   r  r]  r   Úepilogue_fusionrJ  r>   rv   Úno_fuse_buffer_namesrT  rñ  r  rp  rê  rë  r˜  r  r\   Úchoicesr  Úcan_fuse_verticalrT  Úcan_fuse_horizontal)rS   r  r  r  rY  Údevice2Úshared_data_scores          rT   r  zScheduler.can_fuseú  s¿  € ð �Eˆ>ˆ>Ø�5å˜˜uÑ%Ô%ˆå�eÕ1Ñ2Ô2ð 	µjØÕ'ñ7
ô 7
ð 	ð ˆCÐAÑBÔBÐBØ�5å�uÕ8Õ:PÐQÑRÔRð	à×%Ò%Ñ'Ô'ð	ð ˆCÐ(Ñ)Ô)Ð)Ø�5å�uÕ8Õ:PÐQÑRÔRð	à×%Ò%Ñ'Ô'ð	ð ˆCÐ(Ñ)Ô)Ð)Ø�5à×$Ò$Ñ&Ô&¨¬Ñ8ð 	ØˆCÐ,Ñ-Ô-Ð-Ø�5à×ÒÑÔð 	ØˆCÐ3Ñ4Ô4Ð4Ø�5Ø×ÒÑÔð 	Ø×*Ò*Ñ,Ô,ð	à×!Ò!Ñ#Ô#ð	õ Ô)ð	ð
 ˆCÐ1Ñ2Ô2Ð2Ø�5à×"Ò"Ñ$Ô$¥q¤wÔ'CÑCð 	Ø×"Ò"Ñ$Ô$¥q¤wÔ'CÑCð	ð ˆCÐ5Ñ6Ô6Ð6Ø�5à×!Ò!Ñ#Ô#ˆØ×"Ò"Ñ$Ô$ˆØ�WÒÐØˆCÐ,¨f°gÑ>Ô>Ð>Ø�5Øà ×4Ò4°U¸EÑBÔBÐØ Ò!Ð!Ø $× FÒ FÀuÈeÑ TÔ TÐå×)Ò)­'¬-Ñ8Ô8ð 	Ý×#Ò#Ø.Ø—’Ñ Ô Ø—’Ñ Ô Ø!ñ	ô ð õ Œy×!Ò! $¨¨uÐ6GÑHÔHð 	Ø�5à×$Ò$Ñ&Ô&¨¬Ñ8ð 
	Mð ×&Ò& u¨eÑ4Ô4ð MÝ”I×/Ò/°°e¸UÐDUÑVÔVðMà×$Ò$ VÑ,Ô,×>Ò>¸uÀeÑLÔLðõ ”9×0Ò0Ø�e˜UÐ$5ñô ð Mà×"Ò" 6Ñ*Ô*×>Ò>¸uÀeÑLÔLðMrV   c                óö  — |                      ¦   «         }t          ||¦  «        }t          t          ¦  «        }|j        D ]o}| j                             |j        |j        ¦  «        }t          |t          ¦  «        r|  
                    |||¦  «        rŒT||                              |¦  «         Œp|j        j        D ]‚}t          |t          ¦  «        sŒ|                     | j                             |j        |j        ¦  «        ¦  «        }	|	r0|	D ]-}
|                      |
|¦  «        r|	                     |
¦  «         Œ.Œƒt#          d„ t$          j                             |                     ¦   «         ¦  «        D ¦   «         ¦  «        }||z  r |d¦  «         dS |                     ¦   «         }|D ]I}| j        |         j                             ¦   «         }|| j        |         j        z  r |d¦  «          dS ŒJdS )a  
        Check if it is legal to fuse a consumer (node2) into a producer (node1).

        We can fuse them if all the reads of node2 either match
        corresponding writes in node1, or are written by nodes that can
        be scheduled before the fusion of node1 and node2.
        c                ó   — g | ]	}|j         ‘Œ
S r�   r  r  s     rT   r´   z/Scheduler.can_fuse_vertical.<locals>.<listcomp>n  s*   € ð ð ð àð ”ðð ð rV   zmemory deps did not matchFz(intermediate nodes between node1 & node2T)rJ  r  r   rŒ   r¥   r½  r  rQ   rs   r(   Úfusable_weak_deprŸ  r¤   rÓ   r&   Úfusable_read_and_writerk  r   r  r  r‰  r�   rF  r}   rG   r\   r9  rº   )rS   r  r  Únode1_buf_namesr  Úremaining_deps_by_namerþ   rQ   ÚcdÚ	remainingr  Úremaining_depsÚnode1_op_namesr-  s                 rT   r#  zScheduler.can_fuse_verticalN  s5  € ð  ×0Ò0Ñ2Ô2ˆÝ˜˜uÑ%Ô%ˆÝ7BÅ4Ñ7HÔ7HÐàÔ+ð 	5ð 	5ˆCØÔ(×,Ò,¨S¬X°s´xÑ@Ô@ˆDÝ˜#�wÑ'Ô'ð ¨D×,AÒ,AÀ#ÀuÈeÑ,TÔ,Tð ØØ" 4Ô(×/Ò/°Ñ4Ô4Ð4Ð4àÔ#Ô*ð 		-ð 		-ˆBÝ˜b¥)Ñ,Ô,ð ØØ.×2Ò2ØÔ%×)Ò)¨"¬'°2´7Ñ;Ô;ñô ˆIð ð -Ø#ð -ð -�BØ×2Ò2°2°rÑ:Ô:ð -Ø!×(Ò(¨Ñ,Ô,Ð,øøå#ðð å$œ?×8Ò8Ø*×1Ò1Ñ3Ô3ñô ðñ ô ñ
ô 
ˆð ˜OÑ+ð 	ð
 ˆCÐ+Ñ,Ô,Ð,Ø�5à×2Ò2Ñ4Ô4ˆØ"ð 	ð 	ˆDØÔ& tÔ,Ô8×AÒAÑCÔCˆGØ Ô 7¸Ô @Ô JÑJð Ø�Ð>Ñ?Ô?Ð?Ø�u�uðð ˆtrV   Úweak_depr(   c                ó¦  ‡‡‡— ‰j         |                     ¦   «         vrdS ˆfd„|j        j        D ¦   «         }t	          |¦  «        dk    rdS |d         Št          ‰t          ¦  «        sJ ‚t          ‰j        t          j
        ¦  «        rdS | j        ‰j                 Šˆfd„|j        j        D ¦   «         }t          ˆfd„|D ¦   «         ¦  «        S )NFc                ó4   •— g | ]}|j         ‰j        k    ¯|‘ŒS r�   )rQ   r  )r²   Úwriter1  s     €rT   r´   z.Scheduler.fusable_weak_dep.<locals>.<listcomp>�  s3   ø€ ð 
ð 
ð 
àØŒz˜XÔ2Ò2Ð2ð à2Ð2Ð2rV   r   r   c                ó*   •— g | ]}|j         ‰k    ¯|‘ŒS r�   r  )r²   rŽ  Ú	real_names     €rT   r´   z.Scheduler.fusable_weak_dep.<locals>.<listcomp>�  s,   ø€ ð 
ð 
ð 
Ø¸¼	ÀYÒ8NÐ8NˆDÐ8NÐ8NÐ8NrV   c              3  óÂ   •K  — | ]Y}t          |t          ¦  «        o?t          |j        t          j        ¦  «         o|j        ‰j        k    o|j        ‰j        k    V — ŒZd S rO   )rs   r&   r   rš  r   ÚTMPr›  )r²   rŽ  r4  s     €rT   r  z-Scheduler.fusable_weak_dep.<locals>.<genexpr>   s€   øè è € ð 
ð 
ð
 õ	 �t�YÑ'Ô'ð (Ý'¨¬
µD´HÑ=Ô=Ð=ð(à”
˜eœkÒ)ð(ð ”	˜UœZÒ'ð	
ð 
ð 
ð 
ð 
ð 
rV   )rQ   rJ  r¤   rÓ   rd   rs   r&   r   rš  r   r8  r  r  rÔ   r  )rS   r1  r  r  Úmutating_writesÚrelevant_readsr6  r4  s    `    @@rT   r)  zScheduler.fusable_weak_dep‡  s"  øøø€ ð Œ= × 6Ò 6Ñ 8Ô 8Ð8Ð8Ø�5ð
ð 
ð 
ð 
àÔ*Ô1ð
ñ 
ô 
ˆõ
 ˆÑÔ 1Ò$Ð$Ø�5Ø Ô"ˆÝ˜%¥Ñ+Ô+Ð+Ð+Ð+å˜uœ{­D¬HÑ5Ô5ð 	Ø�5àÔ+¨HÔ,AÔBˆ	ð
ð 
ð 
ð 
Ø"Ô.Ô4ð
ñ 
ô 
ˆõ ð 
ð 
ð 
ð 
ð
 'ð
ñ 
ô 
ñ 
ô 
ð 	
rV   rŽ  r%   r4  r&   c                ó^  — t          |t          ¦  «        �r| j                             |j        |j        ¦  «        }||j        k    s>t          |j        t          j        ¦  «        st          |j        t          j        ¦  «        rdS t          j
        r8|j        |j        k    r(|                     ¦   «         }|                     ¦   «         }|j        |j        k    oSt          |j        ¦  «        t          |j        ¦  «        k    o)|j        d t          |j        ¦  «        …         |j        k    S t          |t          ¦  «        ri| j                             |j        |j        ¦  «        }| j                             |j        |j        ¦  «        }|j        |j        k    r|j        �||k    rdS dS r„   )rs   r&   r½  r  rQ   r   rš  r   r8  r   rV  rm  rP  rd   r›  r'   r   )rS   rŽ  r4  Ú	read_nameÚ
write_names        rT   r*  z Scheduler.fusable_read_and_write¬  sw  € Ý�d�IÑ&Ô&ñ 	ØÔ-×1Ò1°$´)¸T¼YÑGÔGˆIð ˜UœZÒ'Ð'Ý& t¤zµ4´8Ñ<Ô<ð (å& u¤{µD´HÑ=Ô=ð (ð �uåÔ0ð *°T´]ÀeÄnÒ5TÐ5Tð —~’~Ñ'Ô'�ØŸšÑ)Ô)�ð ”
˜eœkÒ)ð ?Ý˜œ	‘N”N¥c¨%¬*¡o¤oÒ5ð?à”IÐ/¥ E¤J¡¤Ð/Ô0°E´JÒ>ðõ
 ˜�gÑ&Ô&ð 	ØÔ-×1Ò1°$´)¸T¼YÑGÔGˆIØÔ.×2Ò2°5´:¸u¼zÑJÔJˆJà”	˜UœZÒ'Ð'Ø”JÐ*Ø Ò+Ð+à�tØˆurV   rþ   c                óÀ   — d}|| j         vrE	 |                     ¦   «         s|                     ¦   «         }n# t          $ r Y nw xY w|| j         |<   n| j         |         }|S rÍ  )r   Úhas_unbacked_symbolsÚnumbytes_hintÚKeyError)rS   rþ   Úress      rT   r  zScheduler.dep_size_hintÎ  s†   € ØˆØ�dÔ0Ð0Ð0ðØ×/Ò/Ñ1Ô1ð .Ø×+Ò+Ñ-Ô-�CøøÝð ð ð ð �ð	øøøð
 /2ˆDÔ& sÑ+Ð+àÔ,¨SÔ1ˆCØˆ
s   �(6 ¶
AÁAc                óP  ‡ ‡— t          |j        j        ¦  «        t          |j        j        ¦  «        z   }t          |j        j        ¦  «        t          ‰j        j        ¦  «        z   }t	          ||¦  «        dz  t          ||¦  «        k    rL||k    r|}‰}|Šˆfd„|j        j        |j        j        z  D ¦   «         }t          ˆ fd„|D ¦   «         ¦  «        S |j        j        |j        j        z  ‰j        j        ‰j        j        z  z  }t          ˆ fd„|D ¦   «         ¦  «        S )zn
        The first term in our fusion score that estimates number of saved
        memory operations.
        r   c                óL   •— g | ] }|‰j         j        v s|‰j         j        v ¯|‘Œ!S r�   )r¤   rÔ   rÓ   )r²   rþ   r  s     €rT   r´   z1Scheduler.score_fusion_memory.<locals>.<listcomp>ï  sD   ø€ ð ð ð àØ˜%Ô+Ô1Ð1Ð1°S¸EÔ<MÔ<TÐ5TÐ5Tð à5TÐ5TÐ5TrV   c              3  óB   •K  — | ]}‰                      |¦  «        V — Œd S rO   ©r  r+  s     €rT   r  z0Scheduler.score_fusion_memory.<locals>.<genexpr>õ  s1   øè è € Ð?Ð?°3�t×)Ò)¨#Ñ.Ô.Ð?Ð?Ð?Ð?Ð?Ð?rV   c              3  óB   •K  — | ]}‰                      |¦  «        V — Œd S rO   rF  r+  s     €rT   r  z0Scheduler.score_fusion_memory.<locals>.<genexpr>ú  s1   øè è € ÐIÐI¨s�4×%Ò% cÑ*Ô*ÐIÐIÐIÐIÐIÐIrV   )rd   r¤   rÔ   rÓ   rô  rÈ  rÆ  )rS   r  r  Únode1_dep_lenÚnode2_dep_lenÚtmpr'  Úcommon_memory_depss   ` `     rT   rñ  zScheduler.score_fusion_memoryÞ  sF  øø€ õ ˜EÔ-Ô3Ñ4Ô4µs¸5Ô;LÔ;SÑ7TÔ7TÑTˆÝ˜EÔ-Ô3Ñ4Ô4µs¸5Ô;LÔ;SÑ7TÔ7TÑTˆõ ˆ}˜mÑ,Ô,¨qÑ0µ3°}ÀmÑ3TÔ3TÒTÐTØ˜}Ò,Ð,Ø�Ø�Ø�ðð ð ð à Ô,Ô2°UÔ5FÔ5MÑMðñ ô ˆDõ Ð?Ð?Ð?Ð?¸$Ð?Ñ?Ô?Ñ?Ô?Ð?à#Ô/Ô5¸Ô8IÔ8PÑPØÔÔ# eÔ&7Ô&>Ñ>ñ
Ðõ ÐIÐIÐIÐIÐ6HÐIÑIÔIÑIÔIÐIrV   rÍ  c                ó$  — t          |¦  «        dk    r|S i }|D ]¥\  }}|                     ¦   «         |                     ¦   «         k    sJ ‚|                     ¦   «         }t          |                      |¦  «                             ||¦  «        ¦  «        }||vr	||fg||<   Œˆ||                              ||f¦  «         Œ¦t          |                     ¦   «         t          j	        d¦  «        ¬¦  «        d         }t          |¦  «        dk    sJ ‚|S )Nr   rw  r   )
rd   rT  rM   rT  Úget_fusion_pair_priorityrŸ  rÈ  r   ÚoperatorÚ
itemgetter)rS   rÍ  Ú"possible_fusions_group_by_priorityr  r  rY  Úfusion_pair_priorityÚ&possible_fusions_with_highest_prioritys           rT   rÓ  z4Scheduler.get_possible_fusions_with_highest_priorityü  sY  € õ
 ÐÑ Ô  AÒ%Ð%Ø#Ð#ð ð 	+ð -ð 	ð 	‰LˆE�5Ø×#Ò#Ñ%Ô%¨×)9Ò)9Ñ);Ô);Ò;Ð;Ð;Ð;Ø×%Ò%Ñ'Ô'ˆFÝ#&Ø× Ò  Ñ(Ô(×AÒAÀ%ÈÑOÔOñ$ô $Ð ð $Ð+MÐMÐMà˜E�NðLÐ2Ð3GÑHÐHð 3Ð3GÔH×OÒOØ˜E�Nñô ð ð õ 25Ø.×4Ò4Ñ6Ô6½HÔ<OÐPQÑ<RÔ<Rð2
ñ 2
ô 2
à
ô2Ð.õ Ð9Ñ:Ô:¸QÒ>Ð>Ð>Ð>Ø5Ð5rV   ú+Tuple[BaseSchedulerNode, BaseSchedulerNode]r   c                ó0   — t          j        j        | g|¢R Ž S )z-
        Shim for list.sort(key=...)
        )r>   r"  Úscore_fusionr¤  s     rT   rÔ  zScheduler.score_fusion_key  s   € õ ŒyÔ% dÐ3¨UÐ3Ð3Ð3Ð3rV   c                óô   — t          t          j                             ¦   «         ¦  «        }t	          | j        ¦  «        D ]7}|                     || j        ¦  «         |                     |j	        ¦  «         Œ8dS )zg
        Populate node.last_usage recursively (also for the nodes within a FusedSchedulerNode)
        N)
r   r>   rv   rÉ  rã  r¾  r  r  rä  r»   )rS   r  rE   s      rT   rÑ  zScheduler.compute_last_usage$  sv   € õ
 0:½!¼'×:RÒ:RÑ:TÔ:TÑ/UÔ/UÐå˜TœZÑ(Ô(ð 	8ð 	8ˆDØ×ÒÐ 3°TÔ5LÑMÔMÐMØ×&Ò& t¤Ñ7Ô7Ð7Ð7ð	8ð 	8rV   c                óp  — t          | j        t          j        j        z
  t          j        j        j        z
  ¦  «        D ]Þ}|| j        v rK| j        |         }|                     ¦   «         r)t          j        j         	                    |j
        ¦  «         ŒV|t          j        j        v rut          j        j        |         j        }t          |t          j        ¦  «        r|                     ¦   «         sJ ‚t          j        j         	                    |j        ¦  «         Œß| j                             ¦   «          dS )z*Free any buffers that are no longer neededN)rƒ  rÕ  r>   rv   r…  rw   Úfreedr}   rˆ   Úcodegen_freerE   rÑ  râ   rs   r   r  Úis_input_bufferÚclear)rS   rQ   r¸   Ústorages       rT   Úfree_bufferszScheduler.free_buffers/  s  € åØÔ%ÝŒgÔ%ñ&åŒgÔ"Ô(ñ)ñ
ô 
ð 	@ð 	@ˆDð
 �tÔ'Ð'Ð'ØÔ& tÔ,�Ø—<’<‘>”>ð @Ý”GÔ(×5Ò5°c´hÑ?Ô?Ð?øØ�œÔ-Ð-Ð-Ýœ'Ô.¨tÔ4Ô9�Ý! '­2¬=Ñ9Ô9ÐW¸g×>UÒ>UÑ>WÔ>WÐWÐWÐWÝ”Ô$×1Ò1°'´,Ñ?Ô?Ð?øàÔ!×'Ò'Ñ)Ô)Ð)Ð)Ð)rV   c                óŽ   — | j                              ¦   «         D ]}|                     ¦   «          Œ|                      ¦   «          d S rO   )rµ  r�   Úflushr]  )rS   rb  s     rT   r_  zScheduler.flushA  sF   € Ø”}×+Ò+Ñ-Ô-ð 	ð 	ˆGØ�MŠM‰OŒOˆOˆOØ×ÒÑÔÐÐÐrV   Úscheduler_noderÍ  c                ó  — t          |t          ¦  «        sJ ‚t          d         dxx         dz  cc<   t          j        t          d¬¦  «        ¦  «        5  |                     ¦   «          |                     ¦   «          d d d ¦  «         n# 1 swxY w Y   |j        }t          |t          j
        ¦  «        sJ dt          |¦  «        ›�¦   «         ‚|                     t          j        j        ¦  «         |                      ¦   «          d S )NÚinductorÚextern_callsr   F)Úincrease_kernel_countztype(node)=)rs   rÍ  r   r>   Úset_kernel_handlerr#   r‘  r  rE   r   ré  r^   r€  rv   rw   r]  )rS   r`  rE   s      rT   Úcodegen_extern_callzScheduler.codegen_extern_callF  s9  € Ý˜.Õ*CÑDÔDÐDÐDÐDõ
 	�Ô˜^Ð,Ð,Ô,°Ñ1Ð,Ð,Ñ,ÝÔ!¥&¸uÐ"EÑ"EÔ"EÑFÔFð 	&ð 	&Ø×0Ò0Ñ2Ô2Ð2Ø×#Ò#Ñ%Ô%Ð%ð	&ð 	&ð 	&ñ 	&ô 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&øøøð 	&ð 	&ð 	&ð 	&ð Ô"ˆÝ˜$¥¤Ñ0Ô0ÐBÐBÐ2BµT¸$±Z´ZÐ2BÐ2BÑBÔBÐ0Ø�Š•Q”WÔ)Ñ*Ô*Ð*Ø×ÒÑÔÐÐÐs   Á)B
Â
BÂBrô  ÚBaseSchedulingc                ó  — t          |j        ¦  «        r|j        €J |› d�¦   «         ‚t          j                             |¦  «         t          |j        ¦  «        }|€t          d|j        › �¦  «        ‚t          ¦   «         s|j        dk    rQt          j
                             |¦  «        x}j        dk     r't          d|j        › d|j        › d|j        › �¦  «        ‚t          |j        ¦  «        rt          d¦  «        ‚ || ¦  «        S )	Nz( should have been normalized in loweringzUnsupported device type: Úcudaé   zFound zº which is too old to be supported by the triton GPU compiler, which is used as the backend. Triton only supports devices of CUDA Capability >= 7.0, but your device is of CUDA capability r@  z·Cannot find a working triton installation. Either the package is not installed or it is too old. More information on installing Triton can be found at https://github.com/openai/triton)r;   r^   rš  r>   rv   Úadd_device_infor"   rC  r   rå   ri  Úget_device_propertiesÚmajorrQ   Úminor)rS   rY  Údevice_schedulingÚdevice_propss       rT   Úcreate_backendzScheduler.create_backendU  sU  € å�v”{Ñ#Ô#ð	?Ø'-¤|Ð'?Ð'?ØÐ>Ð>Ð>ñ (@Ô'?Ð?å	Œ×Ò Ñ'Ô'Ð'å5°f´kÑBÔBÐØÐ$ÝÐH¸6¼;ÐHÐHÑIÔIÐIå‰|Œ|ð 	à”˜vÒ%Ð%Ý%*¤Z×%EÒ%EÀfÑ%MÔ%MÐM�\ÔTÐWXÒXÐXå"ð T˜\Ô.ð  Tð  Tð  kwô  k}ð  Tð  Tð  @Lô  @Rð  Tð  Tñô ð õ ˜œÑ$Ô$ð Ý"ð Nñô ð ð !Ð  Ñ&Ô&Ð&rV   c                óp   — |€J ‚|| j         vr|                      |¦  «        | j         |<   | j         |         S rO   )rµ  rq  rX  s     rT   rT  zScheduler.get_backendn  sB   € ØÐ!Ð!Ð!Ø˜œÐ&Ð&Ø$(×$7Ò$7¸Ñ$?Ô$?ˆDŒM˜&Ñ!ØŒ}˜VÔ$Ð$rV   c                ó4  ‡ ‡— d	ˆ fd„Šˆfd„|                      ¦   «         D ¦   «         }t          |                     ¦   «         ¦  «        }|rLt          |t	          j        d¦  «        ¬¦  «        \  }}t          j        j         	                    |¦  «         d S d S )
Nrß  útorch.fx.NoderL   rM   c                ó¦   •— | ‰j         vr;‰j                              d„ t          | j        j        ¦  «        D ¦   «         ¦  «         ‰j         |          S )Nc                ó   — i | ]\  }}||“Œ	S r�   r�   )r²   rÝ  rß  s      rT   r¹   z>Scheduler.enter_context.<locals>.get_order.<locals>.<dictcomp>w  s   € Ð,WÐ,WÐ,W±d°a¸¨Q°Ð,WÐ,WÐ,WrV   )rÖ  rä  rÞ  rv   r¾  )rß  rS   s    €rT   Ú	get_orderz*Scheduler.enter_context.<locals>.get_orderu  sQ   ø€ Ø˜Ô,Ð,Ð,ØÔ$×+Ò+Ð,WÐ,W½iÈÌÌÑ>VÔ>VÐ,WÑ,WÔ,WÑXÔXÐXØÔ'¨Ô*Ð*rV   c                ór   •— i | ]3}|j         ®	|j                              ¦   «         D ]} ‰|¦  «        |fd “ŒŒ4S rO   r2  )r²   rß  rõ  rw  s      €rT   r¹   z+Scheduler.enter_context.<locals>.<dictcomp>{  sY   ø€ ð 
ð 
ð 
àØŒvÐ!Ø”V×'Ò'Ñ)Ô)ð "Ð!Øð ˆY�q‰\Œ\˜1Ð˜tà!Ð!Ð!Ð!rV   r   rw  )rß  rt  rL   rM   )
rE  rŒ   r·  rô  rN  rO  r>   rv   rw   Úenter_context)rS   rE   r¥  rÇ  Úlastrw  s   `    @rT   ry  zScheduler.enter_contextt  s½   øø€ ð	+ð 	+ð 	+ð 	+ð 	+ð 	+ð
ð 
ð 
ð 
à—^’^Ñ%Ô%ð
ñ 
ô 
ˆõ �w—|’|‘~”~Ñ&Ô&ˆØð 	5Ý˜'¥xÔ':¸1Ñ'=Ô'=Ð>Ñ>Ô>‰GˆAˆtÝŒGÔ ×.Ò.¨tÑ4Ô4Ð4Ð4Ð4ð	5ð 	5rV   rQ   Úfused_node_namesr  c                ó¨   ‡— 	 | j         |         j        }n# t          $ r Y dS w xY wt          ˆfd„|D ¦   «         ¦  «        o|| j        vo|| j        vS )NFc              3  óR   •K  — | ]!}|j         p|                     ¦   «         ‰v V — Œ"d S rO   )r–  r\   )r²   rh   r{  s     €rT   r  zAScheduler.can_buffer_be_removed_through_fusion.<locals>.<genexpr>Ž  s8   øè è € ÐVÐVÈ�”ÐC §¢¡¤Ð3CÐ CÐVÐVÐVÐVÐVÐVrV   )r}   rJ   rA  r  r½  r  )rS   rQ   r{  rJ   s     ` rT   Ú$can_buffer_be_removed_through_fusionz.Scheduler.can_buffer_be_removed_through_fusion†  s„   ø€ ð	ØÔ$ TÔ*Ô0ˆEˆEøÝð 	ð 	ð 	Ø�5�5ð	øøøõ ÐVÐVÐVÐVÐPUÐVÑVÔVÑVÔVð 4Ø˜DÔ1Ð1ð4à˜DÔ3Ð3ð	
s   ƒ –
$£$c                ó|   — t          d¦  «        5  |                      ¦   «         cd d d ¦  «         S # 1 swxY w Y   d S )NzScheduler.codegen)r   Ú_codegenrR   s    rT   r€  zScheduler.codegen“  s€   € ÝÐ-Ñ.Ô.ð 	#ð 	#Ø—=’=‘?”?ð	#ð 	#ð 	#ð 	#ñ 	#ô 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#øøøð 	#ð 	#ð 	#ð 	#ð 	#ð 	#s   �1±5¸5c                ó   — t           j        r dd l}t          j        ¦   «         }t          ¦   «         }t          |¦  «        D ]k}|j        dk    r|j        |j	        j
        j        k    r nC|j        |j        f}||vsJ d|j        › d|j        › d�¦   «         ‚|                     |¦  «         Œld | _        | j        D �]z}t                                t$          j        ¦  «        r†	 t                                d|                     ¦   «         |                     ¦   «         ¦  «         nD# t.          $ r7}t                                d|                     ¦   «         ¦  «         Y d }~nd }~ww xY w|                      |¦  «         |                     ¦   «         x}rê|| j        k    s(|                     ¦   «         s|                     ¦   «         r|                      ¦   «          || j        k    r˜| j        r<t;          | j        j        ¦  «        r#t>          j         j!         "                    ¦   «          || _        t;          |j        ¦  «        r:|j#        €
J d¦   «         ‚t>          j         j!         $                    |j#        ¦  «         | j%         &                    |j'        ¦  «         |                     ¦   «         rA| (                    ¦   «         ^}}	|  )                    |¦  «         *                    ||	¦  «         �nN|                     ¦   «         r1tW          j,        tZ          |¦  «        }|  .                    |¦  «         �n	| /                    ¦   «         r…tW          j,        t`          |¦  «        }|  )                    |¦  «        }
d	d
l1m2} d	dl3m4} tk          |
||f¦  «        r|
}ntm          dt=          | ¦  «        ›�¦  «        ‚| 7                    |¦  «         nptk          |tp          tr          f¦  «        r)|  )                    |¦  «         :                    |¦  «         n+tk          |tv          ¦  «        sJ ‚| <                    ¦   «          t           j=        j>        r'|  )                    |¦  «         ?                    ¦   «          | j@         &                    | A                    ¦   «         ¦  «         | jB         &                    | C                    ¦   «         ¦  «         tk          |tv          ¦  «        sQ|                     ¦   «         }|�;|  )                    |¦  «         D                    ¦   «         r|                      ¦   «          �Œ|| j        r<t;          | j        j        ¦  «        r#t>          j         j!         "                    ¦   «          |                      ¦   «          d S )Nr   Ú_compile_innerzDuplicate stack frame ú:zs; did you add a decorator to one of the functions in this stack trace?  If so, try using a context manager instead.z5Generating code for node %s with estimated runtime %fz6Generating code for node %s with estimated runtime 0.0zdevice should have an indexr   )ÚCUDACombinedSchedulingrb  ztype(self)=)Er   Ú"check_stack_no_cycles_TESTING_ONLYÚtorch._dynamo.convert_frameÚ	tracebackÚextract_stackr  rã  rQ   ÚfilenameÚ_dynamoÚconvert_frameÚ__file__Úlinenor$  rß  r¾  r×   rê  rë  r˜  r  r\   r  rÖ   ry  rT  rd  rb  r_  r5   r^   r>   rv   rw   Úcodegen_device_guard_exitrš  Úcodegen_device_guard_enterrÕ  rä  r»   rE  rT  Úcodegen_templater  r  rÍ  rf  rf  r  Ú codegen.cuda_combined_schedulingr„  rf  rc  rs   r  Úcodegen_combo_kernelrÐ  r|  Úcodegen_noder‡  r  ÚtritonÚdebug_sync_kernelÚcodegen_syncr*  rJ  r„  rF  Úready_to_flush)rS   rå   Ústackr=  Úframerx  rE   rõ  rY  ÚepilogueÚbackend_r„  rc  rb  s                 rT   r€  zScheduler._codegen—  so  € ÝÔ4ð 	Ø.Ð.Ð.Ð.åÔ+Ñ-Ô-ˆEÝ‘5”5ˆDÝ! %™œð ð �ð ”JÐ"2Ò2Ð2Øœ¨%¬-Ô*EÔ*NÒNÐNà�EØ”~ u¤|Ð4�Ø $���ðJ¨U¬^ð Jð J¸e¼lð Jð Jð Jñ '”�ð
 —’˜‘”��à"ˆÔØ”Jð C	!ñ C	!ˆDÝ×Ò¥¤Ñ.Ô.ð ð
Ý—I’IØOØŸš™œØ×2Ò2Ñ4Ô4ñô ð ð øõ
 !ð ð ð Ý—I’IØPØŸš™œñô ð ð ð ð ð ð øøøøðøøøð ×Ò˜tÑ$Ô$Ð$àŸšÑ*Ô*Ð*ˆvð Và˜dÔ1Ò1Ð1Ø—~’~Ñ'Ô'ð 2à×'Ò'Ñ)Ô)ð 2ð —J’J‘L”L�LØ˜TÔ0Ò0Ð0ØÔ*ð IÕ/@ØÔ+Ô0ñ0ô 0ð Iõ œÔ,×FÒFÑHÔHÐHØ*0�DÔ'Ý(¨¬Ñ5Ô5ð VØ%œ|Ð7Ð7Ð9VÑ7Ô7Ð7ÝœÔ,×GÒGÈÌÑUÔUÐUàÔ%×,Ò,¨T¬_Ñ=Ô=Ð=à×ÒÑ!Ô!ð  Ø"&§.¢.Ñ"2Ô"2���xØ× Ò  Ñ(Ô(×9Ò9¸$ÀÑIÔIÐIÑIØ—’Ñ!Ô!ð  Ý”{Õ#<¸dÑCÔC�Ø×(Ò(¨Ñ.Ô.Ð.Ñ.Ø—’Ñ"Ô"ð  Ý”{Õ#=¸tÑDÔD�Ø×+Ò+¨FÑ3Ô3�ØTÐTÐTÐTÐTÐTØ8Ð8Ð8Ð8Ð8Ð8å˜h¨Ð9OÐ(PÑQÔQð ;Ø&�G�Gå(Ð)9­D°©J¬JÐ)9Ð)9Ñ:Ô:Ð:Ø×,Ò,¨TÑ2Ô2Ð2Ð2Ý˜DÕ#5µ}Ð"EÑFÔFð  Ø× Ò  Ñ(Ô(×5Ò5°dÑ;Ô;Ð;Ð;å! $Õ(>Ñ?Ô?Ð?Ð?Ð?Ø—’‘”�åŒ}Ô.ð 8Ø× Ò  Ñ(Ô(×5Ò5Ñ7Ô7Ð7àÔ'×.Ò.¨t×/DÒ/DÑ/FÔ/FÑGÔGÐGØÔ%×,Ò,¨T×-EÒ-EÑ-GÔ-GÑHÔHÐHå˜dÕ$:Ñ;Ô;ð !ØŸšÑ*Ô*�ØÐ%¨$×*:Ò*:¸6Ñ*BÔ*B×*QÒ*QÑ*SÔ*SÐ%Ø—J’J‘L”L�LùàÔð 	=Õ#4°TÔ5HÔ5MÑ#NÔ#Nð 	=õ ŒGÔ ×:Ò:Ñ<Ô<Ð<à�
Š
‰Œˆˆˆs   Ã#A D$Ä$
E%Ä.-E Å E%úTuple[float, float, str]c                óÂ   — |d                               ¦   «         }| t          j        _        || _        |€J ‚|                      |¦  «        }|                     |¦  «        S )r`  r   )rT  r>   rv   rD   rß  rT  Úbenchmark_combo_kernel)rS   r‰  rY  rb  s       rT   rž  z Scheduler.benchmark_combo_kernelù  s^   € ð ˜1”×(Ò(Ñ*Ô*ˆØ �ŒÔØ$ˆÔØÐ!Ð!Ð!Ø×"Ò" 6Ñ*Ô*ˆØ×-Ò-¨iÑ8Ô8Ð8rV   c                óz  — t           j        sdS |}|d                              ¦   «         }|�|j        dk    rdS ddlm} dg }}t          |¦  «        D ]î\  }}|                     ¦   «         }	|                      |	¦  «        rt           
                    d¦  «         	 |                      |	¦  «        \  }
}t          j        |
¦  «        rt           
                    d|¦  «          d	S n@# |$ r8}d
t          |¦  «        v r!t           
                    d¦  «         Y d}~ dS ‚ d}~ww xY w||
z  }|                     |¦  «         Œï	 |                      |¦  «        \  }}}n?# |$ r7}d
t          |¦  «        v r t           
                    d¦  «         Y d}~dS ‚ d}~ww xY w||z
  dk     p|dk     }t                               t"          j        ¦  «        rc||k    s|r.t           
                    dt'          ||z  d›¦  «        ¦  «         n-t           
                    dt)          ||z  d›¦  «        ¦  «         ||z
  |k     p|S )r�  Tr   NrW  r‘  g        z<ComboKernel: benchmarking may not accurate due to atomic_addz;ComboKernel benchmark: register spilling of %d-th subkernelFrœ  zCComboKernel benchmark: return True because of loop-carried variableg333333Ó?z/can fuse (benchmark): fusing causes %sx speedupr—  z3cannot fuse (benchmark): fusing causes %sx slowdown)r   rž  rT  r^   r«  r’  rÞ  rE  rŽ  r  r  ra  r®  r¯  rW   rŸ  rê  rë  r˜  r0   r1   )rS   r¾  Úsubkernel_nodesrY  r’  r”  Ú
path1_listrÝ  rÂ  r‰  ÚmsÚpathrõ  r•  Ú	ms2_cloneÚ
path2_listÚsmall_kernels                    rT   rÄ  z!Scheduler.speedup_by_combo_kernel  sÓ  € õ
 Ô,ð 	Ø�4àˆØ  Ô#×.Ò.Ñ0Ô0ˆð ˆ>˜Vœ[¨EÒ1Ð1Ø�4à;Ð;Ð;Ð;Ð;Ð;à˜rˆZˆÝ! /Ñ2Ô2ð 	$ð 	$‰HˆAˆuØŸšÑ)Ô)ˆIð ×#Ò# IÑ.Ô.ð Ý× Ò ØRñô ð ðØ×5Ò5°iÑ@Ô@‘��DÝ”:˜b‘>”>ð !Ý×$Ò$ØUØñô ð ð !˜5˜5ð!øð $ð ð ð à*­c°!©f¬fÐ4Ð4Ý×$Ò$Ø]ñô ð ð  ˜4˜4˜4˜4˜4˜4àøøøøðøøøð �2‰IˆCØ×Ò˜dÑ#Ô#Ð#Ð#ð
	Ø)-×)DÒ)DÀ_Ñ)UÔ)UÑ&ˆC�˜J˜JøØð 	ð 	ð 	à&­#¨a©&¬&Ð0Ð0Ý× Ò ØYñô ð ð �t�t�t�t�tàøøøøð	øøøð ˜Y‘¨Ò,Ð9°°c²	ˆÝ×"Ò"¥7¤=Ñ1Ô1ð 
	Ø�SŠyˆy˜LˆyÝ× Ò ØEÝ #¨¡)Ð1Ð1Ñ2Ô2ñô ð ð õ
 × Ò ØIÝ  c¡	Ð/Ð/Ñ0Ô0ñô ð ð
 �Y‰ Ò$Ð4¨Ð4s=   ÂAC'Ã'D$Ã,+DÄDÄD$ÅE ÅFÅ"+FÆFÆFrO  ú	ir.Layoutc                ó`   — | j         |         }|j        €J ‚|j                             ¦   «         S rO   )r}   rE   Ú
get_layout)rS   rO  r¸   s      rT   Úget_buffer_layoutzScheduler.get_buffer_layoutR  s1   € ØÔ˜xÔ(ˆØŒxÐ#Ð#Ð#ØŒx×"Ò"Ñ$Ô$Ð$rV   c                ó’  — | j         D ]¾}|                     ¦   «         r¨|j        j        D ]›}t          j        j                             |j        ¦  «        }|rnt          |¦  «        dk    r[t          |j        t          ¦  «        sA|                     ¦   «         g k    r)t          j        j                             |j        ¦  «         ŒœŒ¿d S rV  )r¾  r;   r¤   rÔ   r>   rv   r%  r  rQ   r*   rs   r`   r,   ré   Úzero_dim_cpu_tensor_listr$  )rS   rE   rŽ  r’  s       rT   rº  z$Scheduler.update_zero_dim_cpu_tensorW  sÆ   € Ø”Jð 
	Hð 
	HˆDØ�{Š{‰}Œ}ð 	HØ Ô,Ô2ð Hð H�DÝœWÔ3×7Ò7¸¼	ÑBÔB�FàðHå+¨FÑ3Ô3°uÒ<Ð<Ý *¨6¬=Õ:KÑ LÔ Lð =à"ŸOšOÑ-Ô-°Ò3Ð3åœÔ8×<Ò<¸T¼YÑGÔGÐGøøð
	Hð 
	HrV   )r¾  r¡  rL   rm   )rL   rØ  r  )rY  rR  rL   rm   r•   )rè  rW   rL   rm   )rE   r¯   rL   rF   r[  )rÂ  rF   rL   r²  )rL   r>  ©r¾  rK  rL   r^  )r‰  rK  rL   r‚   ©r  rF   r  rF   rL   r‚   rO   )r­  rÀ  rL   rm   rÐ  )r¾  r²  rL   rÉ  )r  rF   r  rF   rÿ  r   rL   rW   ©r  rF   r  rF   rL   rM   rã  )r1  r(   r  rF   r  rF   rL   r‚   )rŽ  r%   r4  r&   rL   r‚   )rþ   r%   rL   rM   )rÍ  rÉ  rL   rÉ  )r¾  rS  rL   r   )r`  rÍ  rL   rm   )rY  rô  rL   rg  )rY  rR  rL   rg  )rE   rF   rL   rm   )rQ   rW   r{  r  rL   r‚   ©r‰  rK  rL   rœ  )r¾  r²  rL   r‚   )rO  rW   rL   r§  )<r_   r˜   r™   rš   r®   r£  r»  Úpropertyrß  ÚsetterrÔ  rí  r§  rÅ  r¾  rÀ  r¿  rF  rC  rÁ  rÊ  re  rÐ  ra  rË  rŽ  r¹  rY  rÏ  r=  r¾  r¿  rú  rþ  r  r  rÑ  r  r#  r)  r*  r  rñ  rÓ  rÔ  rÑ  r]  r_  rf  rq  rT  ry  r~  r€  r€  rž  rÄ  rª  rº  r?  r@  s   @rT   rC   rC     sã  ø€ € € € € € Ø)Ð)Ð)Ñ)ðð ð ð ðj
ð j
ð j
ð j
ð j
ð j
ðX	#ð 	#ð 	#ð 	#ð ð&ð &ð &ñ „Xð&ð Ôð(ð (ð (ñ Ôð(ð7ð 7ð 7ð 7ð#ð #ð #ð #ð,ð ,ð ,ð ,ð"ð "ð "ð "ðHOSð OSð OSð OSðb(#ð (#ð (#ð (#ðTð ð ð ð6Tð Tð Tð Tð(ð ð ð ð4#ð #ð #ð #ð&;ð ;ð ;ð ;ðBð ð ð ð6	ð 	ð 	ð 	ð8ð 8ð 8ð 8ðN@ð N@ð N@ð N@ð`
ð 
ð 
ð 
ðQ$ð Q$ð Q$ð Q$ðf'ð 'ð 'ð 'ðR..ð ..ð ..ð ..ð ..ð`?ð ?ð ?ð ?ð0 ð 0 ð 0 ð 0 ðd,ð ,ð ,ð ,ð\7ð 7ð 7ð 7ðr$ð $ð $ð $ð69ð 9ð 9ð 9ðvF6ð F6ð F6ð F6ðP
ð 
ð 
ð 
ðRMð RMð RMð RMðh7ð 7ð 7ð 7ðr
ð 
ð 
ð 
ðJ ð  ð  ð  ðDð ð ð ð Jð Jð Jð Jð<6ð 6ð 6ð 6ð@4ð 4ð 4ð 4ð	8ð 	8ð 	8ð 	8ð*ð *ð *ð *ð$ð ð ð ð
ð ð ð ð'ð 'ð 'ð 'ð2%ð %ð %ð %ð5ð 5ð 5ð 5ð$
ð 
ð 
ð 
ð#ð #ð #ð #ð`ð `ð `ð `ðD9ð 9ð 9ð 9ðI5ð I5ð I5ð I5ðV%ð %ð %ð %ð
Hð Hð Hð Hð Hð Hð Hð HrV   c                  ó†   — e Zd Zed'd„¦   «         Zd(d
„Zd(d„Zd)d„Zd*d„Zd+d„Z	d,d„Z
d-d„Zd.d„Zd-d„Zd/d „Zd0d"„Zd1d%„Zd&S )2rg  rY  rô  rL   úSequence[BackendFeature]c                ó   — dS )z0Return a set of .codegen.common.BackendFeature()r�   r�   )rü  rY  s     rT   Úget_backend_featuresz#BaseScheduling.get_backend_featuresf  s	   € ð ˆrrV   r  rF   r  r‚   c                ó   — t           ‚)zO
        Check whether node1 and node2 can be vertically fused or not.
        rù  r  s      rT   r#  z BaseScheduling.can_fuse_verticalk  ó
   € õ "Ð!rV   c                ó   — t           ‚)zQ
        Check whether node1 and node2 can be horizontally fused or not.
        rù  r  s      rT   r$  z"BaseScheduling.can_fuse_horizontals  r¸  rV   rÐ  c                ó¾   — |                      ¦   «         s|                      ¦   «         rt                               ||¦  «        S t                               ||¦  «        S )z 
        Fuse two nodes
        )rf  r  r¿  rÐ  r  s      rT   r¿  zBaseScheduling.fuse{  sW   € ð ×ÒÑÔð 	9 ×!1Ò!1Ñ!3Ô!3ð 	9Ý-×2Ò2°5¸%Ñ@Ô@Ð@å%×*Ò*¨5°%Ñ8Ô8Ð8rV   re  rv  ú"Tuple[Tuple[sympy.Expr, ...], ...]c                ó   — t           ‚)z[
        Process the iteration sizes in case a transformation needs to be applied.
        rù  )rS   re  s     rT   rU  zBaseScheduling.group_fn†  r¸  rV   Útemplate_nodeÚepilogue_nodesrK  úOptional[str]c                ó   — t           ‚)zã
        Given a template node, generate a kernel.

        This function is only available for triton now. If the third-party backend behaves as a sub-class
        of TritonScheduling, it can override it or reuse it.
        rù  )rS   r½  r¾  s      rT   r�  zBaseScheduling.codegen_templateŽ  s
   € õ "Ð!rV   rE   ú(Union[FusedSchedulerNode, SchedulerNode]rm   c                ó   — t           ‚)zD
        Generate a kernel given a list of pre-fused nodes.
        rù  rÀ   s     rT   r“  zBaseScheduling.codegen_node›  ó
   € õ "Ð!rV   c                ó   — t           ‚)zt
        Generate synchronization code for the kernel. This method depends on the hardware characteristics.
        rù  rR   s    rT   r–  zBaseScheduling.codegen_sync¡  rÃ  rV   c                ó   — dS )z•
        Check whether the backend is requesting the scheduler to flush the generated kernel.
        If not supported, please return False.
        Fr�   rR   s    rT   r—  zBaseScheduling.ready_to_flush§  s	   € ð
 ˆurV   c                ó   — t           ‚)z]
        Flush the generated kernel and python wrapper code to the source code file.
        rù  rR   s    rT   r_  zBaseScheduling.flush®  rÃ  rV   r¾  r^  c                ó   — t           ‚)r`  rù  r¤  s     rT   ra  z$BaseScheduling.benchmark_fused_nodes´  ó
   € õ "Ð!rV   rM   c                ó   — dS )zŒ
        Return an unsigned integer which represents the priority of this fusion pair.
        The smaller is with higher priority.
        r   r�   r  s      rT   rM  z'BaseScheduling.get_fusion_pair_priority½  s	   € ð ˆqrV   r‰  rœ  c                ó   — t           ‚)z¡
        Benchmark the list of nodes to combine and return the execution time
        and memory copy time in milliseconds on randomly generated inputs.
        rù  r�  s     rT   rž  z%BaseScheduling.benchmark_combo_kernelÆ  rÈ  rV   N)rY  rô  rL   r´  r®  r  )re  rv  rL   r»  )r½  rF   r¾  rK  rL   r¿  )rE   rÁ  rL   rm   r•   r–   r­  r¯  r°  )r_   r˜   r™   r  r¶  r#  r$  r¿  rU  r�  r“  r–  r—  r_  ra  rM  rž  r�   rV   rT   rg  rg  e  s"  € € € € € Øðð ð ñ „[ðð"ð "ð "ð "ð"ð "ð "ð "ð	9ð 	9ð 	9ð 	9ð"ð "ð "ð "ð"ð "ð "ð "ð"ð "ð "ð "ð"ð "ð "ð "ðð ð ð ð"ð "ð "ð "ð"ð "ð "ð "ðð ð ð ð"ð "ð "ð "ð "ð "rV   rg  )r  r   rL   rW   )rE   rF   r9  r:  r}   r*  rL   rm   )r§  rF   rL   rm   )r§  rF   rD   rC   r·  r²  rL   rm   )r�   )rq  rr  re  r�  rs  rt  rL   ru  )~Ú
__future__r   rÏ  r›   r�  r  rë  r®  rN  ræ  r"  r#  r‡  r  r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r’  rå   Útorch._inductor.async_compileÚtorch._dynamo.utilsr   r   Útorch._inductor.metricsr   r   Ú%torch.fx.experimental.symbolic_shapesr   Útorch.utils._ordered_setr   Útorch.utils._sympy.symbolr   r   Útorch.utils._tritonr   rÜ   r   r   r   r   r    Úcodegen.commonr!   r"   r#   Úcomm_analysisr$   r%   r&   r'   r(   r)   r*   r+   r,   Ú	loop_bodyr-   rÈ  r.   r/   Úruntime.runtime_utilsr0   r1   r±  r2   Úutilsr3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   Úvirtualizedr>   Ú	getLoggerr_   r×   Ú_loggingÚgetArtifactLoggerr  rp  Ú	dataclassrB   rŸ   rF   r  rb   r†   r<  ÚopsÚatenÚconvolutionÚmmÚbmmÚaddmmrê  rÍ  r‡  r|  r±  r»  rÐ  r  rº  r’  r”  rÅ  r¶  rC   rg  r�   rV   rT   ú<module>rã     s3  ðà "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø €€€Ø €€€Ø 	€	€	€	Ø €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð  €€€à €€€Ø $Ð $Ð $Ð $Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø MÐ MÐ MÐ MÐ MÐ MÐ MÐ MØ GÐ GÐ GÐ GÐ GÐ GØ /Ð /Ð /Ð /Ð /Ð /Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø *Ð *Ð *Ð *Ð *Ð *à 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MØ ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ø OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OØ Ð Ð Ð Ð Ð Ø JÐ JÐ JÐ JÐ JÐ JÐ JÐ JØ 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø &Ð &Ð &Ð &Ð &Ð &ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð Ð Ð Ð Ð Ð ð €gÔ˜Ñ!Ô!€ØŒ^×-Ò-¨h¸ÑAÔA€
Ø”N×4Ò4°X¸ÑOÔOÐ ð Ôð^.ð ^.ð ^.ð ^.ð ^.ñ ^.ô ^.ñ Ôð^.ðB Ôð4ð 4ð 4ð 4ð 4˜_ñ 4ô 4ñ Ôð4ðD	ð D	ð D	ð D	ð D	ñ D	ô D	ð D	ðN
ð 
ð 
ð 
ð 
ñ 
ô 
ð 
ð,ð ð ð ðð ð ð ð ñ ô ð ð &Kð &Kð &Kð &KðV #(¤)¤.Ô"<ØœœÔ*Øœ)œ.Ô,Ø!œIœNÔ0ð	ð Ð ðWð Wð Wð Wð WÐ 1ñ Wô Wð Wð"5ð 5ð 5ð 5ð 5Ð.ñ 5ô 5ð 5ð]+ð ]+ð ]+ð ]+ð ]+Ð%ñ ]+ô ]+ð ]+ð@ð ð ð ð ð ð ð ð,x*ð x*ð x*ð x*ð x*Ð*ñ x*ô x*ð x*ðvx:ð x:ð x:ð x:ð x:Ð!3ñ x:ô x:ð x:ðv	?ð ?ð ?ð ?ð ?Ð,ñ ?ô ?ð ?ðJ %'ð+ð +ð +ð +ð +ð\ Ôð
ð 
ð 
ð 
ð 
ñ 
ô 
ñ Ôð
ð> +˜9œ?Ñ,Ô,Ð ðaHð aHð aHð aHð aHñ aHô aHð aHðH;h"ð h"ð h"ð h"ð h"ñ h"ô h"ð h"ð h"ð h"rV   