Ë
    L²j"9  ã                  óT  — U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ erd d	lmZ d d
lmZ d dlmZ d ad ad ag aded<   g Zded<   d ad aej                   G d„ d«      «       Z g a!ded<   d a"d a#d a$d a%ded<   d a&d a'd<d„Z(e G d„ d«      «       Z)d=d„Z* G d„ d«      Z+i Z,ded<   e G d„ d«      «       Z-e-j]                  d g d!¢«       e-j]                  d"g d#¢«       e-j]                  d$g d%¢«       e-j]                  d&g d'¢«       e-j]                  d(g d)¢«       d>d*„Z/d?d+„Z0d@d,„Z1dAd-„Z2dBd.„Z3d?d/„Z4dCd0„Z5dDd1„Z6	 	 	 	 	 	 dEd2„Z7	 	 	 	 	 	 	 	 dFd3„Z8d<d4„Z9dGd5„Z:e	dHd6„«       Z;dId7„Z<dJd8„Z=e-j]                  d9g d:¢«       	 	 	 	 	 	 	 	 	 	 dKd;„Z>y)Lé    )ÚannotationsN)Ú	dataclass)Ú	lru_cache)ÚTYPE_CHECKING)Úconfig)Úget_benchmark_name)Ú
OrderedSet)ÚCallable)ÚConfig)ÚBaseSchedulerNodez#list[tuple[BaseSchedulerNode, int]]Únodes_num_elemz%list[tuple[BaseSchedulerNode, float]]Únode_runtimesc                  ó&   — e Zd ZU ded<   dZded<   y)ÚCppOuterLoopFusedCountÚintÚinner_kernel_numberr   Úlocal_buffer_numberN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   © ó    úV/var/www/html/ia-enhanced/venv/lib/python3.12/site-packages/torch/_inductor/metrics.pyr   r   +   s   … àÓØ Ð˜Ô r   r   zlist[CppOuterLoopFusedCount]Ú!cpp_outer_loop_fused_inner_countsr   Únum_auto_chunkingc                 ó¨   — da dadat        j	                  «        t
        j	                  «        dadat        j	                  «        da	da
dadadaday )Nr   )Úgenerated_kernel_countÚgenerated_cpp_vec_kernel_countÚnum_bytes_accessedr   Úclearr   Úir_nodes_pre_fusionÚcpp_to_dtype_countr   Únum_comprehensive_paddingÚ)num_matches_for_scatter_upon_const_tensorÚnum_loop_reorderingÚparallel_reduction_countÚcodegen_mix_order_reductionr   r   r   r   Úresetr)   A   sj   € ð ÐØ%&Ð"ØÐÜ×ÑÔÜ×ÑÔØÐØÐÜ%×+Ñ+Ô-Ø !ÐØ01Ð-ØÐØ ÐØ"#ÐØÑr   c                  óN   — e Zd ZU dZded<   ded<   ded<   ded<   ded<   ded<   y	)
ÚCachedMetricsDeltasz]
    The subset of metrics we want update across cache hits, e.g., the
    FxGraphCache.
    r   r   r   r"   r#   r    r%   N)r   r   r   Ú__doc__r   r   r   r   r+   r+   _   s-   … ñð
  ÓØ$'Ó'ØÓØÓØÓØ/2Ô2r   r+   c                 ón   — t        j                  t        «      D � cg c]  } | j                  ‘Œ c} S c c} w ©N)ÚdataclassesÚfieldsr+   Úname)Úfields    r   Úget_metric_fieldsr3   n   s&   € Ü$/×$6Ñ$6Ô7JÓ$KÖL˜5ˆE�J‹JÒLÐLùÒLs   œ2c                  ó2   — e Zd ZdZdd„Zdd„Zedd„«       Zy)	ÚCachedMetricsHelperz¯
    A helper class to help calculate and apply counter deltas for those
    metrics we want to save with cache entries (e.g., FxGraphCache) and
    apply on a cache hit.
    c                ód   — i | _         t        «       D ]  }t        «       |   | j                   |<   Œ y r.   )Úcached_metricsr3   Úglobals)ÚselfÚmetrics     r   Ú__init__zCachedMetricsHelper.__init__y   s3   € Ø ˆÔÜ'Ó)ò 	<ˆFÜ*1«)°FÑ*;ˆD×Ñ Ò'ñ	<r   c                óz   — i }t        «       D ]"  }t        «       |   | j                  |   z
  ||<   Œ$ t        di |¤ŽS )Nr   )r3   r8   r7   r+   )r9   Údelta_metricsr:   s      r   Ú
get_deltaszCachedMetricsHelper.get_deltas~   sL   € ØˆÜ'Ó)ò 	TˆFÜ$+£I¨fÑ$5¸×8KÑ8KÈFÑ8SÑ$SˆM˜&Ò!ð	Tô #Ñ3 ]Ñ3Ð3r   c                ó`   — t        «       D ]!  }t        «       |xx   t        | |«      z  cc<   Œ# y r.   )r3   r8   Úgetattr)Údeltar:   s     r   Úapply_deltasz CachedMetricsHelper.apply_deltas…   s-   € ä'Ó)ò 	8ˆFÜ‹I�fÓ¤¨°Ó!7Ñ7Ôñ	8r   N©ÚreturnÚNone)rD   r+   )rA   r+   rD   rE   )r   r   r   r,   r;   r>   ÚstaticmethodrB   r   r   r   r5   r5   r   s%   „ ñó<ó
4ð ò8ó ñ8r   r5   zdict[str, MetricTable]ÚREGISTERED_METRIC_TABLESc                  ób   — e Zd ZU ded<   ded<   dZded<   dd„Zdd	„Zdd
„Zdd„Ze	dd„«       Z
y)ÚMetricTableÚstrÚ
table_nameú	list[str]Úcolumn_namesr   r   Únum_rows_addedc                óF  — | j                   t        «       vry  |«       }t        | j                  «      t        |«      k(  s(J t        | j                  «      › dt        |«      › �«       ‚t	        | j                  «      t	        |j                  «       «      k(  s6J t	        | j                  «      › dt	        |j                  «       «      › �«       ‚t        «       }|g| j                  D �cg c]  }||   ‘Œ	 c}z   }t        d„ |D «       «      sJ ‚| j                  |«       y c c}w )Nz v.s. c           	   3  ó\   K  — | ]$  }t        |t        t        t        d «      f«      –— Œ& y ­wr.   )Ú
isinstancerJ   ÚfloatÚtype)Ú.0Úis     r   ú	<genexpr>z&MetricTable.add_row.<locals>.<genexpr>¤   s"   è ø€ ÒH¸q”:˜a¤#¤u¬d°4«jÐ!9×:ÑHùs   ‚*,)	rK   Úenabled_metric_tablesÚlenrM   r	   Úkeysr   ÚallÚ
_write_row)r9   Úrow_fnÚrow_dictÚbnÚcolumn_nameÚrows         r   Úadd_rowzMetricTable.add_row•   s  € Ø�?‰?Ô"7Ó"9Ñ9Øá“8ˆÜ�4×$Ñ$Ó%¬¨X«Ò6ð 	
Ü�4×$Ñ$Ó%Ð& f¬S°«]¨OÐ<ó	
Ð6ô ˜$×+Ñ+Ó,´
¸8¿=¹=»?Ó0KÒKð 	
Ü˜$×+Ñ+Ó,Ð-¨V´J¸x¿}¹}»Ó4OÐ3PÐQó	
ÐKô  Ó!ˆàˆd¸t×?PÑ?PÖQ°�h˜{Ó+ÒQÑQˆÜÑHÀCÔHÔHÐHÐHØ�‰˜Õùò Rs   Ã'Dc                ó"   — d| j                   › d�S )NÚmetric_table_z.csv)rK   )r9   s    r   Úoutput_filenamezMetricTable.output_filename§   s   € Ø˜tŸ™Ð/¨tÐ4Ð4r   c                óÒ   — | j                  «       }t        |d«      5 }t        j                  |d¬«      }|j	                  dg| j
                  z   «       d d d «       y # 1 sw Y   y xY w)NÚwú
©ÚlineterminatorÚ
model_name)rd   ÚopenÚcsvÚwriterÚwriterowrM   )r9   ÚfilenameÚfdrm   s       r   Úwrite_headerzMetricTable.write_headerª   s^   € Ø×'Ñ'Ó)ˆÜ�(˜CÓ ð 	@ BÜ—Z‘Z °4Ô8ˆFØ�O‰O˜\˜N¨T×->Ñ->Ñ>Ô?÷	@÷ 	@ñ 	@ús   �7AÁA&c                óÄ  — | j                  «       }| j                  dk(  r/t        j                  j	                  |«      s| j                  «        | xj                  dz  c_        t        |«      D ]&  \  }}t        |t        «      r|d›}n|€d}n|}|||<   Œ( t        |d«      5 }t        j                  |d¬«      }|j                  |«       d d d «       y # 1 sw Y   y xY w)Nr   é   z.6fÚ Úarg   rh   )rd   rN   ÚosÚpathÚexistsrq   Ú	enumeraterQ   rR   rk   rl   rm   rn   )r9   r`   ro   ÚidxÚorig_valÚnew_valrp   rm   s           r   r[   zMetricTable._write_row°   sÌ   € Ø×'Ñ'Ó)ˆØ×Ñ !Ò#¬B¯G©G¯N©N¸8Ô,DØ×ÑÔà×Ò˜qÑ Õä& s›^ò 	‰MˆC�Ü˜(¤EÔ*Ø% c˜N‘ØÐ!Ø‘à"�ØˆC�ŠHð	ô �(˜CÓ ð 	! BÜ—Z‘Z °4Ô8ˆFØ�O‰O˜CÔ ÷	!÷ 	!ñ 	!ús   Â$)CÃCc                ó.   — t        | |«      }|t        | <   y r.   )rI   rG   )r1   rM   Útables      r   Úregister_tablezMetricTable.register_tableÄ   s   € ä˜D ,Ó/ˆØ).Ô  Ò&r   N)r\   z+Callable[[], dict[str, str | float | None]]rD   rE   )rD   rJ   rC   )r`   zlist[str | float | None]rD   rE   )r1   rJ   rM   rL   rD   rE   )r   r   r   r   rN   ra   rd   rq   r[   rF   r   r   r   r   rI   rI   Ž   s@   … àƒOØÓà€N�CÓóó$5ó@ó!ð( ò/ó ñ/r   rI   Úslow_fusion)Úkernel1_pathÚkernel1_latencyÚkernel2_pathÚkernel2_latencyÚfused_kernel_pathÚfused_kernel_latencyÚslow_down_ratioÚgraph_stats)Úgraph_idÚnum_nodes_before_fusionÚnum_nodes_after_fusionÚpersistent_red_perf)
Úkernel0_pathr�   rƒ   Úkernel3_pathÚkernel0_latencyr‚   r„   Úkernel3_latencyÚ
size_hintsÚreduction_hintÚ'fusion_failure_due_to_indexing_mismatch)Úpre_grad_graph_idÚpost_grad_graph_idÚ
node1_nameÚ
node2_nameÚnode1_debug_strÚnode2_debug_strÚcommon_buffer_namesÚfailure_reasonÚkernel_metadata©Úkernel_nameÚkernel_pathÚkernel_categoryr‘   r’   Úline_of_codeÚnum_loadÚ	num_storeÚnum_for_loopÚnum_atomic_addÚnum_argsÚxnumelÚynumelÚrnumelÚkernel_args_num_gbc                óž   — ddl m} ddlm} |j	                  | «      } ||«      }t        j                  |j                  j                  «      S )z±
    The kernel_module_code is the python module that contains kernel function code.
    kernel function is the proper triton kernel function annotated with
    @triton.jit
    rs   )ÚPyCodeCache)Úget_triton_kernel)Ú	codecacher¬   Úwrapper_benchmarkr­   ÚloadÚinspectÚ	getsourceÚfn)Úkernel_module_coder¬   r­   ÚmodÚkernels        r   Ú_parse_kernel_fn_coder·     s@   € õ 'Ý4à
×
Ñ
Ð-Ó
.€CÙ˜sÓ#€Fô ×Ñ˜VŸY™YŸ\™\Ó*Ð*r   c                ó4   — t        | j                  «       «      S )zJ
    Return the line of code for the kernel excluding the decorators.
    )rX   Ú
splitlines)Úproper_kernel_fn_codes    r   Ú_parse_kernel_line_of_coder»   .  s   € ô Ð$×/Ñ/Ó1Ó2Ð2r   c                ón   — |dk(  ry t        j                  d| «      }|sJ d«       ‚|j                  d«      S )NÚforeachzsize_hints=(\[[0-9, ]*\]),zsize_hints missing!rs   ©ÚreÚsearchÚgroup)r´   r    Úms      r   Ú_parse_size_hintsrÃ   5  s;   € Ø˜)Ò#àÜ
�	‰	Ð/Ð1CÓD€AÙÐ#Ð#Ó#ˆ1Ø�7‰7�1‹:Ðr   c                ól   — | dvry t        j                  d|«      }|sJ d«       ‚|j                  d«      S )N)Ú	reductionÚpersistent_reductionz$reduction_hint=ReductionHint\.(\w*),z/reduction_hint not found in kernel source code!rs   r¾   )r    r´   rÂ   s      r   Ú_parse_reduction_hintrÇ   >  s<   € ØÐCÑCØÜ
�	‰	Ð9Ð;MÓN€AÙÐ?Ð?Ó?ˆ1Ø�7‰7�1‹:Ðr   c                ó$   — | j                  |«      S r.   )Úcount)rº   Úpatterns     r   Ú_count_patternrË   F  s   € Ø ×&Ñ& wÓ/Ð/r   c                óÚ   — | j                  «       d   }|j                  d«      sJ ‚|j                  d«      }|j                  d«      }||dz   | }|j                  d«      }t	        |«      S )Nr   údef ú(z):rs   ú,)r¹   Ú
startswithÚindexÚsplitrX   )rº   Údef_lineÚ	start_idxÚend_idxÚdecl_csvÚcompss         r   Ú_count_argsrØ   J  sm   € Ø$×/Ñ/Ó1°!Ñ4€HØ×Ñ˜vÔ&Ð&Ð&Ø—‘˜sÓ#€IØ�n‰n˜TÓ"€GØ˜	 A™¨Ð0€HØ�N‰N˜3Ó€EÜˆu‹:Ðr   c                ó.   — | j                  d«      }| |d S )z
    Skip decorators.
    rÍ   N)rÑ   )Úkernel_fn_codeÚ	start_poss     r   Ú_parse_proper_kernel_fn_coderÜ   T  s!   € ð ×$Ñ$ VÓ,€IØ˜)˜*Ð%Ð%r   c                ón   — t        j                  |› d�| «      }|rt        |j                  d«      «      S y )Nz
 = ([\d]+)rs   )r¿   rÀ   r   rÁ   )rº   Únumel_arg_namerÂ   s      r   Ú_parse_numelrß   \  s3   € Ü
�	‰	�^Ð$ KÐ0Ð2GÓH€AÙÜ�1—7‘7˜1“:‹Ðàr   c                ój   — t        j                  d| «      }|rt        |j                  d«      «      S 	 y)z�
    inductor meta looks like:
        inductor_meta={... 'mutated_arg_names': [], 'no_x_dim': False, 'kernel_num_gb': 2.0},
    z.kernel_num_gb.:\s*([0-9.]+)rs   N)r¿   rÀ   rR   rÁ   )rÚ   r    rÂ   s      r   Ú_parse_kernel_args_num_gbrá   d  s5   € ô 	�	‰	Ð1°>ÓB€AÙÜ�Q—W‘W˜Q“ZÓ Ð ð	ð r   c           
     óê   ‡ ‡‡‡‡‡‡‡	— ddl m}  ||«      Št        ‰|«      Št        |‰«      Š	t	        |«      Št        ‰«      Št        ‰«      Št        d«      j                  ˆˆˆˆ ˆˆˆˆ	fd„«       y)zå
    An utility to log kernel metadata. We may parse metadata from kernel source code here.

    It's fine to parse the generated kernel code here since the logging is
    disabled by default. It would hurt compilation time.
    rs   )Ú"get_kernel_category_by_source_coderœ   c                 óÚ   •— ‰‰‰ ‰‰‰t        ‰d«      t        ‰d«      t        ‰d«      t        ‰d«      t        ‰«      t        ‰d«      t        ‰d«      t        ‰d«      t        ‰‰ «      dœS )	Nztl.loadztl.storezfor ztl.atomic_addr§   r¨   r©   r�   )rË   rØ   rß   rá   )r    rÚ   Úkernel_line_of_coderž   rŸ   rº   r’   r‘   s   €€€€€€€€r   ú<lambda>z%log_kernel_metadata.<locals>.<lambda>�  s   ø€ Ø&Ø&Ø.Ø$Ø,Ø/Ü&Ð'<¸iÓHÜ'Ð(=¸zÓJÜ*Ð+@À&ÓIÜ,Ð-BÀOÓTÜ#Ð$9Ó:Ü"Ð#8¸(ÓCÜ"Ð#8¸(ÓCÜ"Ð#8¸(ÓCÜ";Ø ó#ñ
€ r   N)	r¯   rã   rÇ   rÃ   r·   rÜ   r»   Úget_metric_tablera   )
rž   rŸ   r´   rã   r    rÚ   rå   rº   r’   r‘   s
   ``  @@@@@@r   Úlog_kernel_metadatarè   y  sp   ÿ€ õ Fá8Ð9KÓL€OÜ*¨?Ð<NÓO€NÜ"Ð#5°ÓG€JÜ*Ð+=Ó>€Nä8¸ÓHÐô 5Ð5JÓKÐäÐ&Ó'×/Ñ/÷	
ò 	
õr   c                 óþ   — t         j                  «       D ]f  \  } }| t        «       v sŒ|j                  «       }t        j
                  j                  |«      rt	        j                  |«       |j                  «        Œh y)z»
    Purge the old log file at the beginning when the benchmark script runs.
    Should do it in the parent process rather than the child processes running
    each individual model.
    N)	rG   ÚitemsrW   rd   rv   rw   rx   Úunlinkrq   )r1   r~   ro   s      r   Úpurge_old_log_filesrì   ¥  sb   € ô 0×5Ñ5Ó7ò !‰ˆˆeØÔ(Ó*Ò*Ø×,Ñ,Ó.ˆHÜ�w‰w�~‰~˜hÔ'Ü—	‘	˜(Ô#à×ÑÕ ñ!r   c                 ó4   — t        t        j                  «      S r.   )Úenabled_metric_tables_implr   rW   r   r   r   rW   rW   ´  s   € Ü%¤f×&BÑ&BÓCÐCr   c                ó´   — t        «       }| j                  d«      D ]9  }|j                  «       }|sŒ|t        v sJ d|› d�«       ‚|j	                  |«       Œ; |S )NrÏ   zMetric table name z is not registered)r	   rÒ   ÚstriprG   Úadd)Ú
config_strÚenabledr1   s      r   rî   rî   ¸  sl   € ä)›|€GØ× Ñ  Ó%ò ˆØ�z‰z‹|ˆÙØØÔ/Ñ/ð 	
Ø   Ð&8Ð9ó	
Ð/ð 	�‰�DÕðð €Nr   c                ó   — | t        «       v S r.   )rW   ©r1   s    r   Úis_metric_table_enabledrö   Æ  s   € ØÔ(Ó*Ð*Ð*r   c                ó:   — | t         v sJ d| › d�«       ‚t         |    S )NzMetric table z is not defined)rG   rõ   s    r   rç   rç   Ê  s*   € ØÔ+Ñ+ÐR¨}¸T¸FÀ/Ð-RÓRÐ+Ü# DÑ)Ð)r   Úkernel_autotune©rŸ   rž   Útriton_configÚ
latency_msc                óL   ‡ ‡‡‡— t        d«      j                  ˆˆˆ ˆfd„«       y )Nrø   c                 ó$   •— ‰‰t        ‰ «      ‰dœS )Nrù   )rJ   )r   rž   rŸ   Úlatencys   €€€€r   ræ   z,log_kernel_autotune_result.<locals>.<lambda>Þ  s   ø€ Ø&Ø&Ü  ›[Ø!ñ	
€ r   )rç   ra   )rŸ   rž   r   rþ   s   ````r   Úlog_kernel_autotune_resultrÿ   Ú  s   û€ ô Ð&Ó'×/Ñ/ö	
õr   rC   )rD   rL   )r´   rJ   rD   rJ   )rº   rJ   rD   r   )r´   rJ   r    rJ   rD   ú
str | None)r    rJ   r´   rJ   rD   r   )rº   rJ   rÊ   rJ   rD   r   )rÚ   rJ   rD   rJ   )rº   rJ   rÞ   rJ   rD   z
int | None)rÚ   rJ   r    rJ   rD   zfloat | None)rž   rJ   rŸ   rJ   r´   rJ   rD   rE   )rD   úOrderedSet[str])rò   rJ   rD   r  )r1   rJ   rD   Úbool)r1   rJ   rD   rI   )
rŸ   rJ   rž   rJ   r   r   rþ   rR   rD   rE   )?Ú
__future__r   rl   r/   r±   rv   r¿   r   Ú	functoolsr   Útypingr   Útorch._inductorr   Útorch._inductor.utilsr   Útorch.utils._ordered_setr	   Úcollections.abcr
   Ú%torch._inductor.runtime.triton_compatr   Útorch._inductor.schedulerr   r   r   r    r   r   r   r"   r#   r   r   r$   r%   r&   r   r'   r(   r)   r+   r3   r5   rG   rI   r   r·   r»   rÃ   rÇ   rË   rØ   rÜ   rß   rá   rè   rì   rW   rî   rö   rç   rÿ   r   r   r   ú<module>r     s}  ðÞ "ã 
Û Û Û 	Û 	Ý !Ý Ý  å "Ý 4Ý /ñ Ý(å<Ý;ð Ð Ø!"Ð ØÐ ð ð ð ó ð 8:€Ð4Ó 9ð Ð ð Ð ð ×Ñ÷!ð !ó ð!ð CEÐ !Ð#?Ó DàÐ Ø,-Ð )àÐ ØÐ �3Ó ð Ð àÐ óð< ÷3ð 3ó ð3óM÷8ñ 8ð2 46Ð Ð0Ó 5ð ÷8/ð 8/ó ð8/ðv × Ñ Øòôð × Ñ Øòôð × Ñ Øòôð" × Ñ Ø-ò	ôð × Ñ Øòôó6+ó 3óóó0óó&óðØðØ*-ðàóð*)Øð)Ø#&ð)Ø<?ð)à	ó)óX!óDð ò
ó ð
ó+ó*ð
 × Ñ Øòôð
Øð
Ø#&ð
Ø06ð
ØAFð
à	ô
r   