ó
    Eñi\9  ã                  ó–  • % S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKJr  S SKJ	r	  S SK
JrJrJr  S SKJr  S SKJr  S SKJr  \(       a  S S	KJr  S S
KJr  S SKJr  S qS qS q/ qS\S'   / rS\S'   S q S q!\R                   " S S5      5       r"/ q#S\S'   S q$S q%S q&S q'S\S'   S q(S q)S<S jr*\ " S S5      5       r+S=S jr, " S S5      r-0 r.S\S'   \ " S S5      5       r/\/Ra                  S / S!Q5        \/Ra                  S"/ S#Q5        \/Ra                  S$/ S%Q5        \/Ra                  S&/ S'Q5        \/Ra                  S(/ S)Q5        S>S* jr1S?S+ jr2S@S, jr3      SAS- jr4SBS. jr5S?S/ jr6SCS0 jr7SDS1 jr8      SES2 jr9        SFS3 jr:S<S4 jr;SGS5 jr<\	SHS6 j5       r=SIS7 jr>SJS8 jr?\/Ra                  S9/ S:Q5                  SKS; jr@g)Lé    )ÚannotationsN)Ú	dataclass)Ú	lru_cache)ÚOptionalÚTYPE_CHECKINGÚUnion)Úconfig)Úget_benchmark_name)Ú
OrderedSet)ÚCallable)ÚConfig)ÚBaseSchedulerNodez#list[tuple[BaseSchedulerNode, int]]Únodes_num_elemz%list[tuple[BaseSchedulerNode, float]]Únode_runtimesc                  ó.   • \ rS rSr% S\S'   SrS\S'   Srg)ÚCppOuterLoopFusedCounté+   ÚintÚinner_kernel_numberr   Úlocal_buffer_number© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotations__r   Ú__static_attributes__r   ó    ÚT/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/_inductor/metrics.pyr   r   +   s   ‡ àÓØ Ð˜Ö r   r   zlist[CppOuterLoopFusedCount]Ú!cpp_outer_loop_fused_inner_countsr   Únum_auto_chunkingc                 ó¨   • Sq SqSq[        R	                  5         [
        R	                  5         SqSq[        R	                  5         Sq	Sq
SqSqSqSqg )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                  óV   • \ rS rSr% SrS\S'   S\S'   S\S'   S\S'   S\S'   S\S	'   S
rg)ÚCachedMetricsDeltasé_   zQ
The subset of metrics we want update across cache hits, e.g., the
FxGraphCache.
r   r#   r$   r'   r(   r%   r*   r   N)r   r   r   r   Ú__doc__r   r   r   r   r   r0   r0   _   s-   ‡ ñð
  ÓØ$'Ó'ØÓØÓØÓØ/2Ö2r   r0   c                 ót   • [         R                  " [        5       V s/ s H  o R                  PM     sn $ s  sn f ©N)ÚdataclassesÚfieldsr0   Úname)Úfields    r   Úget_metric_fieldsr9   n   s*   € Ü$/×$6Ò$6Ô7JÔ$KÓLÒ$K˜5�JŒJÑ$KÑLÐLùÒLs   �5c                  ó@   • \ rS rSrSrSS jrS	S jr\S
S j5       rSr	g)ÚCachedMetricsHelperér   zŸ
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                óh   • 0 U l         [        5        H  n[        5       U   U R                   U'   M     g r4   )Úcached_metricsr9   Úglobals)ÚselfÚmetrics     r   Ú__init__ÚCachedMetricsHelper.__init__y   s.   € Ø ˆÔÜ'Ö)ˆFÜ*1«)°FÑ*;ˆD×Ñ Ó'ò *r   c                ó|   • 0 n[        5        H"  n[        5       U   U R                  U   -
  X'   M$     [        S0 UD6$ )Nr   )r9   r?   r>   r0   )r@   Údelta_metricsrA   s      r   Ú
get_deltasÚCachedMetricsHelper.get_deltas~   sC   € ØˆÜ'Ö)ˆFÜ$+£I¨fÑ$5¸×8KÑ8KÈFÑ8SÑ$SˆMÓ!ñ *ô #Ñ3 ]Ñ3Ð3r   c                ób   • [        5        H!  n[        5       U==   [        X5      -  ss'   M#     g r4   )r9   r?   Úgetattr)ÚdeltarA   s     r   Úapply_deltasÚ CachedMetricsHelper.apply_deltas…   s&   € ä'Ö)ˆFÜ‹I�fÓ¤¨Ó!7Ñ7Õò *r   )r>   N©ÚreturnÚNone)rN   r0   )rJ   r0   rN   rO   )
r   r   r   r   r2   rB   rF   ÚstaticmethodrK   r   r   r   r   r;   r;   r   s%   † ñô<ô
4ð ó8ó ó8r   r;   zdict[str, MetricTable]ÚREGISTERED_METRIC_TABLESc                  ó|   • \ rS rSr% S\S'   S\S'   SrS\S'       SS	 jrSS
 jrSS jrSS jr	\
SS j5       rSrg)ÚMetricTableéŽ   ÚstrÚ
table_nameú	list[str]Úcolumn_namesr   r   Únum_rows_addedc                ó\  • U R                   [        5       ;  a  g U" 5       n[        U R                  5      [        U5      :X  d(   [        U R                  5       S[        U5       35       e[	        U R                  5      [	        UR                  5       5      :X  d6   [	        U R                  5       S[	        UR                  5       5       35       e[        5       nU/U R                   Vs/ s H  oBU   PM	     sn-   n[        S U 5       5      (       d   eU R                  U5        g s  snf )Nz v.s. c           	   3  ób   #   • U  H%  n[        U[        [        [        S 5      45      v •  M'     g 7fr4   )Ú
isinstancerU   ÚfloatÚtype)Ú.0Úis     r   Ú	<genexpr>Ú&MetricTable.add_row.<locals>.<genexpr>¦   s%   é € ÐHÂC¸q”:˜a¤#¤u¬d°4«jÐ!9×:Ð:ÂCùs   ‚-/)	rV   Úenabled_metric_tablesÚlenrX   r   Úkeysr
   ÚallÚ
_write_row)r@   Úrow_fnÚrow_dictÚbnÚcolumn_nameÚrows         r   Úadd_rowÚ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Ò?P°˜{Ô+Ñ?PÑQÑQˆÜÑHÁCÓH×HÑHÐHÐHØ�‰˜Õùò Rs   Ã+D)c                ó"   • SU R                    S3$ )NÚmetric_table_z.csv)rV   )r@   s    r   Úoutput_filenameÚMetricTable.output_filename©   s   € Ø˜tŸ™Ð/¨tÐ4Ð4r   c                óØ   • U R                  5       n[        US5       n[        R                  " USS9nUR	                  S/U R
                  -   5        S S S 5        g ! , (       d  f       g = f)NÚwÚ
©ÚlineterminatorÚ
model_name)rq   ÚopenÚcsvÚwriterÚwriterowrX   )r@   ÚfilenameÚfdr{   s       r   Úwrite_headerÚMetricTable.write_header¬   sQ   € Ø×'Ñ'Ó)ˆÜ�(˜CÔ  BÜ—Z’Z °4Ñ8ˆFØ�O‰O˜\˜N¨T×->Ñ->Ñ>Ô?÷ !× Ö ús   �5AÁ
A)c                óâ  • U R                  5       nU R                  S:X  a4  [        R                  R	                  U5      (       d  U R                  5         U =R                  S-  sl        [        U5       H+  u  p4[        U[        5      (       a  US nOUc  SnOUnXQU'   M-     [        US5       n[        R                  " USS9nUR                  U5        S S S 5        g ! , (       d  f       g = f)Nr   é   z.6fÚ Úaru   rv   )rq   rY   ÚosÚpathÚexistsr   Ú	enumerater\   r]   ry   rz   r{   r|   )r@   rl   r}   ÚidxÚorig_valÚnew_valr~   r{   s           r   rg   ÚMetricTable._write_row²   sÀ   € Ø×'Ñ'Ó)ˆØ×Ñ !Ó#¬B¯G©G¯N©N¸8×,DÑ,DØ×ÑÔà×Ò˜qÑ Õä& sž^‰MˆCÜ˜(¤E×*Ñ*Ø% c˜N‘ØÑ!Ø‘à"�Ø�‹Hñ ,ô �(˜CÔ  BÜ—Z’Z °4Ñ8ˆFØ�O‰O˜CÔ ÷ !× Ö ús   Â0'C Ã 
C.c                ó,   • [        X5      nU[        U '   g r4   )rS   rQ   )r7   rX   Útables      r   Úregister_tableÚMetricTable.register_tableÆ   s   € ä˜DÓ/ˆØ).Ô  Ò&r   r   N)rh   z4Callable[[], dict[str, Optional[Union[str, float]]]]rN   rO   )rN   rU   rM   )rl   zlist[str | float | None]rN   rO   )r7   rU   rX   rW   rN   rO   )r   r   r   r   r   rY   rm   rq   r   rg   rP   r�   r   r   r   r   rS   rS   Ž   sP   ‡ àƒOØÓà€N�CÓðØJðà	ôô(5ô@ô!ð( ó/ó ó/r   rS   Ú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                ó    • SSK Jn  SSKJn  UR	                  U 5      nU" U5      n[
        R                  " UR                  R                  5      $ )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
r‚   )Ú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   • [        U R                  5       5      $ )zB
Return the line of code for the kernel excluding the decorators.
)rd   Ú
splitlines)Úproper_kernel_fn_codes    r   Ú_parse_kernel_line_of_coderÌ   0  s   € ô Ð$×/Ñ/Ó1Ó2Ð2r   c                ó|   • US:X  a  g [         R                  " SU 5      nU(       d   S5       eUR                  S5      $ )NÚforeachzsize_hints=(\[[0-9, ]*\]),zsize_hints missing!r‚   ©ÚreÚsearchÚgroup)rÅ   r±   Úms      r   Ú_parse_size_hintsrÔ   7  s;   € Ø˜)Ó#àÜ
�	Š	Ð/Ð1CÓD€AÞÐ#Ð#Ó#ˆ1Ø�7‰7�1‹:Ðr   c                ó|   • U S;  a  g [         R                  " SU5      nU(       d   S5       eUR                  S5      $ )N)Ú	reductionÚpersistent_reductionz$reduction_hint=ReductionHint\.(\w*),z/reduction_hint not found in kernel source code!r‚   rÏ   )r±   rÅ   rÓ   s      r   Ú_parse_reduction_hintrØ   @  s>   € ð ÐCÓCØÜ
�	Š	Ð9Ð;MÓN€AÞÐ?Ð?Ó?ˆ1Ø�7‰7�1‹:Ðr   c                ó$   • U R                  U5      $ r4   )Úcount)rË   Úpatterns     r   Ú_count_patternrÜ   J  s   € Ø ×&Ñ& wÓ/Ð/r   c                óâ   • U R                  5       S   nUR                  S5      (       d   eUR                  S5      nUR                  S5      nXS-   U nUR                  S5      n[	        U5      $ )Nr   údef Ú(z):r‚   Ú,)rÊ   Ú
startswithÚindexÚsplitrd   )rË   Údef_lineÚ	start_idxÚend_idxÚdecl_csvÚcompss         r   Ú_count_argsré   N  sn   € Ø$×/Ñ/Ó1°!Ñ4€HØ×Ñ˜v×&Ñ&Ð&Ð&Ø—‘˜sÓ#€IØ�n‰n˜TÓ"€GØ A™¨Ð0€HØ�N‰N˜3Ó€EÜˆu‹:Ðr   c                ó,   • U R                  S5      nXS $ )z
Skip decorators.
rÞ   N)râ   )Úkernel_fn_codeÚ	start_poss     r   Ú_parse_proper_kernel_fn_coderí   X  s   € ð ×$Ñ$ VÓ,€IØ˜*Ð%Ð%r   c                óz   • [         R                  " U S3U 5      nU(       a  [        UR                  S5      5      $ g )Nz
 = ([\d]+)r‚   )rÐ   rÑ   r   rÒ   )rË   Únumel_arg_namerÓ   s      r   Ú_parse_numelrð   `  s3   € Ü
�	Š	�^Ð$ KÐ0Ð2GÓH€AÞÜ�1—7‘7˜1“:‹Ðàr   c                óv   • [         R                  " SU 5      nU(       a  [        UR                  S5      5      $  g)zu
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.]+)r‚   N)rÐ   rÑ   r]   rÒ   )rë   r±   rÓ   s      r   Ú_parse_kernel_args_num_gbrò   h  s5   € ô 	�	Š	Ð1°>ÓB€AÞÜ�Q—W‘W˜Q“ZÓ Ð ð	ð r   c           
     óì   ^ ^^^^^^^	• SSK Jn  U" U5      m[        TU5      m[        UT5      m	[	        U5      m[        T5      m[        T5      m[        S5      R                  UUUU UUUU	4S j5        g)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.
r‚   )Ú"get_kernel_category_by_source_coder­   c                 óÚ   >• TTT TTT[        TS5      [        TS5      [        TS5      [        TS5      [        T5      [        TS5      [        TS5      [        TS5      [        TT 5      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>Ú%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_tablerm   )
r¯   r°   rÅ   rô   r±   rë   rö   rË   r£   r¢   s
   ``  @@@@@@r   Úlog_kernel_metadatarú   }  sp   ÿ€ õ Fá8Ð9KÓL€OÜ*¨?Ð<NÓO€NÜ"Ð#5°ÓG€JÜ*Ð+=Ó>€Nä8¸ÓHÐô 5Ð5JÓKÐäÐ&Ó'×/Ñ/÷	
ó 	
õr   c                 ó  • [         R                  5        Ho  u  pU [        5       ;   d  M  UR                  5       n[        R
                  R                  U5      (       a  [        R                  " U5        UR                  5         Mq     g)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)	rQ   Úitemsrc   rq   r…   r†   r‡   Úunlinkr   )r7   rŽ   r}   s      r   Úpurge_old_log_filesrþ   ©  s^   € ô 0×5Ñ5Ö7‰ˆØÔ(Ó*Õ*Ø×,Ñ,Ó.ˆHÜ�w‰w�~‰~˜h×'Ñ'Ü—	’	˜(Ô#à×ÑÖ ò 8r   c                 ó4   • [        [        R                  5      $ r4   )Úenabled_metric_tables_implr	   rc   r   r   r   rc   rc   ¸  s   € Ü%¤f×&BÑ&BÓCÐCr   c                óÈ   • [        5       nU R                  S5       HB  nUR                  5       nU(       d  M  U[        ;   d   SU S35       eUR	                  U5        MD     U$ )Nrà   zMetric table name z is not registered)r   rã   ÚstriprQ   Úadd)Ú
config_strÚenabledr7   s      r   r   r   ¼  sg   € ä)›|€GØ× Ñ  Ö%ˆØ�z‰z‹|ˆÞÙØÔ/Ó/ð 	
Ø   Ð&8Ð9ó	
Ð/ð 	�‰�DÖñ &ð €Nr   c                ó   • U [        5       ;   $ r4   )rc   ©r7   s    r   Úis_metric_table_enabledr  Ê  s   € ØÔ(Ó*Ñ*Ð*r   c                ó>   • U [         ;   d   SU  S35       e[         U    $ )NzMetric table z is not defined)rQ   r  s    r   rù   rù   Î  s*   € ØÔ+Ó+ÐR¨}¸T¸FÀ/Ð-RÓRÐ+Ü# DÑ)Ð)r   Úkernel_autotune©r°   r¯   Útriton_configÚ
latency_msc                óN   ^ ^^^• [        S5      R                  UUU U4S j5        g )Nr
  c                 ó$   >• TT[        T 5      TS.$ )Nr  )rU   )r	   r¯   r°   Úlatencys   €€€€r   r÷   Ú,log_kernel_autotune_result.<locals>.<lambda>â  s   ø€ Ø&Ø&Ü  ›[Ø!ò	
r   )rù   rm   )r°   r¯   r	   r  s   ````r   Úlog_kernel_autotune_resultr  Þ  s   û€ ô Ð&Ó'×/Ñ/÷	
õr   rM   )rN   rW   )rÅ   rU   rN   rU   )rË   rU   rN   r   )rÅ   rU   r±   rU   rN   úOptional[str])r±   rU   rÅ   rU   rN   r  )rË   rU   rÛ   rU   rN   r   )rë   rU   rN   rU   )rË   rU   rï   rU   rN   zOptional[int])rë   rU   r±   rU   rN   zOptional[float])r¯   rU   r°   rU   rÅ   rU   rN   rO   )rN   úOrderedSet[str])r  rU   rN   r  )r7   rU   rN   Úbool)r7   rU   rN   rS   )
r°   rU   r¯   rU   r	   r   r  r]   rN   rO   )AÚ
__future__r   rz   r5   rÂ   r…   rÐ   r   Ú	functoolsr   Útypingr   r   r   Ú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.   r0   r9   r;   rQ   rS   r�   rÈ   rÌ   rÔ   rØ   rÜ   ré   rí   rð   rò   rú   rþ   rc   r   r  rù   r  r   r   r   Ú<module>r     s˜  ðÞ "ã 
Û Û Û 	Û 	Ý !Ý ß 1Ñ 1å "Ý 4Ý /ö Ý(å<Ý;ð Ð Ø!"Ð ØÐ ð ð ð ó ð 8:€Ð4Ó 9ð Ð ð Ð ð ×Ñ÷!ð !ó ð!ð CEÐ !Ð#?Ó DàÐ Ø,-Ð )àÐ ØÐ �3Ó ð Ð àÐ ôð< ÷3ð 3ó ð3ôM÷8ñ 8ð2 46Ð Ð0Ó 5ð ÷:/ð :/ó ð:/ðz × Ñ Øòôð × Ñ Øòôð × Ñ Øòôð" × Ñ Ø-ò	ôð × Ñ Øòôô6+ô 3ôðØðØ.1ðàôô0ôô&ôðØðØ*-ðàôð*)Øð)Ø#&ð)Ø<?ð)à	ô)ôX!ôDð ó
ó ð
ô+ô*ð
 × Ñ Øòôð
Øð
Ø#&ð
Ø06ð
ØAFð
à	õ
r   