§
    ž²Åj
5  ã                  óü  — 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mZmZmZmZ d dlmZ d dlmZ er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„ Z#e G d„ d¦  «        ¦   «         Z$d„ Z% G d„ d¦  «        Z&i Z'ded<   e G d„ d¦  «        ¦   «         Z(e( )                    dg d¢¦  «         e( )                    dg d¢¦  «         e( )                    dg d ¢¦  «         e( )                    d!g d"¢¦  «         e( )                    d#g d$¢¦  «         d%„ Z*d&„ Z+d'„ Z,d(„ Z-d)„ Z.d*„ Z/d+„ Z0d,„ Z1d-„ Z2d.„ Z3d/„ Z4d8d2„Z5e	d9d5„¦   «         Z6d6„ Z7d7„ Z8dS ):é    )ÚannotationsN)Ú	dataclass)Ú	lru_cache)ÚDictÚListÚSetÚTupleÚTYPE_CHECKING)Úconfig)Úget_benchmark_name)Ú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<   dS )ÚCppOuterLoopFusedCountÚintÚinner_kernel_numberr   Úlocal_buffer_numberN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   © ó    úHC:\Projects\Historical\venv\Lib\site-packages\torch/_inductor/metrics.pyr   r   (   s0   € € € € € € àÐÐÑØ ÐÐ Ð Ð Ñ Ð Ð r   r   zList[CppOuterLoopFusedCount]Ú!cpp_outer_loop_fused_inner_countsc                 ó¼   — da dadat                               ¦   «          t
                               ¦   «          dadat                               ¦   «          da	da
dad S )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_reorderingr   r   r   Úresetr'   8   sp   € ð ÐØ%&Ð"ØÐÝ×ÒÑÔÐÝ×ÒÑÔÐØÐØÐÝ%×+Ò+Ñ-Ô-Ð-Ø !ÐØ01Ð-ØÐÐÐr   c                  óP   — 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<   d	S )
Ú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)   P   sf   € € € € € € ðð ð
  ÐÐÑØ'Ð'Ð'Ñ'ØÐÐÑØÐÐÑØÐÐÑØ2Ð2Ð2Ñ2Ð2Ð2r   r)   c                 óH   — d„ t          j        t          ¦  «        D ¦   «         S )Nc                ó   — g | ]	}|j         ‘Œ
S r   ©Úname)Ú.0Úfields     r   ú
<listcomp>z%get_metric_fields.<locals>.<listcomp>`   s   € ÐLÐLÐL˜5ˆEŒJÐLÐLÐLr   )ÚdataclassesÚfieldsr)   r   r   r   Úget_metric_fieldsr4   _   s"   € ØLÐL¥KÔ$6Õ7JÑ$KÔ$KÐLÑLÔLÐLr   c                  ó:   — e Zd ZdZd
d„Zdd„Zedd„¦   «         Zd	S )Ú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.
    ÚreturnÚNonec                ón   — i | _         t          ¦   «         D ]}t          ¦   «         |         | j         |<   Œd S ©N)Úcached_metricsr4   Úglobals)ÚselfÚmetrics     r   Ú__init__zCachedMetricsHelper.__init__j   sB   € Ø ˆÔÝ'Ñ)Ô)ð 	<ð 	<ˆFÝ*1©)¬)°FÔ*;ˆDÔ Ñ'Ð'ð	<ð 	<r   r)   c                óŠ   — i }t          ¦   «         D ]'}t          ¦   «         |         | j        |         z
  ||<   Œ(t          di |¤ŽS )Nr   )r4   r<   r;   r)   )r=   Údelta_metricsr>   s      r   Ú
get_deltaszCachedMetricsHelper.get_deltaso   sU   € ØˆÝ'Ñ)Ô)ð 	Tð 	TˆFÝ$+¡I¤I¨fÔ$5¸Ô8KÈFÔ8SÑ$SˆM˜&Ñ!Ð!å"Ð3Ð3 ]Ð3Ð3Ð3r   Údeltac                ó|   — t          ¦   «         D ],}t          ¦   «         |xx         t          | |¦  «        z  cc<   Œ-d S r:   )r4   r<   Úgetattr)rC   r>   s     r   Úapply_deltasz CachedMetricsHelper.apply_deltasv   sN   € å'Ñ)Ô)ð 	8ð 	8ˆFÝ‰IŒI�fÐÐÔ¥¨°Ñ!7Ô!7Ñ7ÐÐÑÐð	8ð 	8r   N)r7   r8   )r7   r)   )rC   r)   )r   r   r   r*   r?   rB   ÚstaticmethodrF   r   r   r   r6   r6   c   sf   € € € € € ðð ð<ð <ð <ð <ð
4ð 4ð 4ð 4ð ð8ð 8ð 8ñ „\ð8ð 8ð 8r   r6   zDict[str, MetricTable]ÚREGISTERED_METRIC_TABLESc                  ó`   — e Zd ZU ded<   ded<   dZded<   d„ Zd	„ Zd
„ Zd„ Ze	d„ ¦   «         Z
dS )ÚMetricTableÚstrÚ
table_namez	List[str]Úcolumn_namesr   r   Únum_rows_addedc                óR  ‡— | j         t          ¦   «         vrd S  |¦   «         Št          | j        ¦  «        t          ‰¦  «        k    s.J t          | j        ¦  «        › dt          ‰¦  «        › �¦   «         ‚t	          | j        ¦  «        t	          ‰                     ¦   «         ¦  «        k    s@J t	          | j        ¦  «        › dt	          ‰                     ¦   «         ¦  «        › �¦   «         ‚t          ¦   «         g}|ˆfd„| j        D ¦   «         z  }|                      |¦  «         d S )Nz v.s. c                ó    •— g | ]
}‰|         ‘ŒS r   r   )r/   Úcolumn_nameÚrow_dicts     €r   r1   z'MetricTable.add_row.<locals>.<listcomp>•   s   ø€ ÐKÐKÐK¨+�˜Ô%ÐKÐKÐKr   )rL   Úenabled_metric_tablesÚlenrM   ÚsetÚkeysr   Ú
_write_row)r=   Úrow_fnÚrowrR   s      @r   Úadd_rowzMetricTable.add_row†   sC  ø€ ØŒ?Õ"7Ñ"9Ô"9Ð9Ð9ØˆFà�6‘8”8ˆÝ�4Ô$Ñ%Ô%­Øñ*
ô *
ò 
ð 
ð 
å�$Ô#Ñ$Ô$Ð;Ð;­C°©M¬MÐ;Ð;ñ
ô 
ð 
õ �4Ô$Ñ%Ô%­Ø�MŠM‰OŒOñ*
ô *
ò 
ð 
ð 
å�$Ô#Ñ$Ô$ÐBÐB­C°·²±´Ñ,@Ô,@ÐBÐBñ
ô 
ð 
õ
 Ñ Ô ð
ˆð 	ÐKÐKÐKÐK¸Ô9JÐKÑKÔKÑKˆØ�Š˜ÑÔÐÐÐr   c                ó   — d| j         › d�S )NÚmetric_table_z.csv)rL   )r=   s    r   Úoutput_filenamezMetricTable.output_filename˜   s   € Ø4˜tœÐ4Ð4Ð4Ð4r   c                óè   — |                       ¦   «         }t          |d¦  «        5 }t          j        |d¬¦  «        }|                     dg| j        z   ¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )NÚwú
©ÚlineterminatorÚ
model_name)r]   ÚopenÚcsvÚwriterÚwriterowrM   )r=   ÚfilenameÚfdrf   s       r   Úwrite_headerzMetricTable.write_header›   sÇ   € Ø×'Ò'Ñ)Ô)ˆÝ�(˜CÑ Ô ð 	@ BÝ”Z °4Ð8Ñ8Ô8ˆFØ�OŠO˜\˜N¨TÔ->Ñ>Ñ?Ô?Ð?ð	@ð 	@ð 	@ñ 	@ô 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@øøøð 	@ð 	@ð 	@ð 	@ð 	@ð 	@s   ¥5A'Á'A+Á.A+c                óè  — |                       ¦   «         }| j        dk    r3t          j                             |¦  «        s|                      ¦   «          | xj        dz  c_        t          |¦  «        D ]+\  }}t          |t          ¦  «        r|d›}n|€d}n|}|||<   Œ,t          |d¦  «        5 }t          j        |d¬¦  «        }|                     |¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nr   é   z.6fÚ Úar`   ra   )r]   rN   ÚosÚpathÚexistsrj   Ú	enumerateÚ
isinstanceÚfloatrd   re   rf   rg   )r=   rY   rh   ÚidxÚorig_valÚnew_valri   rf   s           r   rW   zMetricTable._write_row¡   sF  € Ø×'Ò'Ñ)Ô)ˆØÔ !Ò#Ð#­B¬G¯NªN¸8Ñ,DÔ,DÐ#Ø×ÒÑÔÐàÐÔ˜qÑ ÐÔå& s™^œ^ð 	ð 	‰MˆC�Ý˜(¥EÑ*Ô*ð #Ø%Ð+Ð+��ØÐ!Ø��à"�ØˆC�‰HˆHå�(˜CÑ Ô ð 	! BÝ”Z °4Ð8Ñ8Ô8ˆFØ�OŠO˜CÑ Ô Ð ð	!ð 	!ð 	!ñ 	!ô 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!øøøð 	!ð 	!ð 	!ð 	!ð 	!ð 	!s   Â.,C'Ã'C+Ã.C+c                ó:   — t          | |¦  «        }|t          | <   d S r:   )rJ   rH   )r.   rM   Útables      r   Úregister_tablezMetricTable.register_tableµ   s"   € å˜D ,Ñ/Ô/ˆØ).Õ  Ñ&Ð&Ð&r   N)r   r   r   r   rN   rZ   r]   rj   rW   rG   rz   r   r   r   rJ   rJ      s–   € € € € € € à€O€O�OØÐÐÑà€NÐÐÐÑðð ð ð$5ð 5ð 5ð@ð @ð @ð!ð !ð !ð( ð/ð /ñ „\ð/ð /ð /r   rJ   Ú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} |                     | ¦  «        } ||¦  «        }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
    rl   )ÚPyCodeCache)Úget_triton_kernel)Ú	codecacher§   Úwrapper_benchmarkr¨   ÚloadÚinspectÚ	getsourceÚfn)Úkernel_module_coder§   r¨   ÚmodÚkernels        r   Ú_parse_kernel_fn_coder²     sc   € ð 'Ð&Ð&Ð&Ð&Ð&Ø4Ð4Ð4Ð4Ð4Ð4à
×
Ò
Ð-Ñ
.Ô
.€CØÐ˜sÑ#Ô#€Fõ Ô˜VœYœ\Ñ*Ô*Ð*r   c                óD   — t          |                      ¦   «         ¦  «        S )zJ
    Return the line of code for the kernel excluding the decorators.
    )rT   Ú
splitlines)Úproper_kernel_fn_codes    r   Ú_parse_kernel_line_of_coder¶     s   € õ Ð$×/Ò/Ñ1Ô1Ñ2Ô2Ð2r   c                ó~   — |dk    rd S t          j        d| ¦  «        }|s
J d¦   «         ‚|                     d¦  «        S )NÚforeachzsize_hints=(\[[0-9, ]*\]),zsize_hints missing!rl   ©ÚreÚsearchÚgroup)r¯   r›   Úms      r   Ú_parse_size_hintsr¾   &  sI   € Ø˜)Ò#Ð#àˆtÝ
Œ	Ð/Ð1CÑDÔD€AØÐ#Ð#Ð#Ñ#Ô#ˆ1Ø�7Š7�1‰:Œ:Ðr   c                óz   — | dvrd S t          j        d|¦  «        }|s
J d¦   «         ‚|                     d¦  «        S )N)Ú	reductionÚpersistent_reductionz$reduction_hint=ReductionHint\.(\w*),z/reduction_hint not found in kernel source code!rl   r¹   )r›   r¯   r½   s      r   Ú_parse_reduction_hintrÂ   /  sJ   € ØÐCÐCÐCØˆtÝ
Œ	Ð9Ð;MÑNÔN€AØÐ?Ð?Ð?Ñ?Ô?ˆ1Ø�7Š7�1‰:Œ:Ðr   c                ó,   — |                       |¦  «        S r:   )Úcount)rµ   Úpatterns     r   Ú_count_patternrÆ   7  s   € Ø ×&Ò& wÑ/Ô/Ð/r   c                ó  — |                       ¦   «         d         }|                     d¦  «        sJ ‚|                     d¦  «        }|                     d¦  «        }||dz   |…         }|                     d¦  «        }t	          |¦  «        S )Nr   údef ú(z):rl   ú,)r´   Ú
startswithÚindexÚsplitrT   )rµ   Údef_lineÚ	start_idxÚend_idxÚdecl_csvÚcompss         r   Ú_count_argsrÓ   ;  s„   € Ø$×/Ò/Ñ1Ô1°!Ô4€HØ×Ò˜vÑ&Ô&Ð&Ð&Ð&Ø—’˜sÑ#Ô#€IØ�nŠn˜TÑ"Ô"€GØ˜	 A™¨Ð/Ô0€HØ�NŠN˜3ÑÔ€EÝˆu‰:Œ:Ðr   c                ó@   — |                       d¦  «        }| |d…         S )z
    Skip decorators.
    rÈ   N)rÌ   )Úkernel_fn_codeÚ	start_poss     r   Ú_parse_proper_kernel_fn_coder×   E  s&   € ð ×$Ò$ VÑ,Ô,€IØ˜)˜*˜*Ô%Ð%r   c                ó~   — t          j        |› d�| ¦  «        }|r"t          |                     d¦  «        ¦  «        S d S )Nz
 = ([\d]+)rl   )rº   r»   r   r¼   )rµ   Únumel_arg_namer½   s      r   Ú_parse_numelrÚ   M  s@   € Ý
Œ	�^Ð0Ð0Ð0Ð2GÑHÔH€AØð Ý�1—7’7˜1‘:”:‰ŒÐàˆtr   c                óz   — t          j        d| ¦  «        }|r"t          |                     d¦  «        ¦  «        S 	 dS )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.]+)rl   N)rº   r»   rt   r¼   )rÕ   r›   r½   s      r   Ú_parse_kernel_args_num_gbrÜ   U  sB   € õ
 	Œ	Ð1°>ÑBÔB€AØð 
Ý�Q—W’W˜Q‘Z”ZÑ Ô Ð ð	ð ˆtr   c           
     ó*  ‡ ‡‡‡‡‡‡‡	— ddl m}  ||¦  «        Št          ‰|¦  «        Št          |‰¦  «        Š	t	          |¦  «        Št          ‰¦  «        Št          ‰¦  «        Št          d¦  «                             ˆˆˆˆ ˆˆˆˆ	fd„¦  «         dS )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.
    rl   )Ú"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ÔHÝ'Ð(=¸zÑJÔJÝ*Ð+@À&ÑIÔIÝ,Ð-BÀOÑTÔTÝ#Ð$9Ñ:Ô:Ý"Ð#8¸(ÑCÔCÝ"Ð#8¸(ÑCÔCÝ"Ð#8¸(ÑCÔCÝ";Ø ñ#ô #ð
ð 
€ r   N)	rª   rÞ   rÂ   r¾   r²   r×   r¶   Úget_metric_tablerZ   )
r™   rš   r¯   rÞ   r›   rÕ   rà   rµ   r�   rŒ   s
   ``  @@@@@@r   Úlog_kernel_metadatarã   h  sß   øøøøøøøø€ ð FÐEÐEÐEÐEÐEà8Ð8Ð9KÑLÔL€OÝ*¨?Ð<NÑOÔO€NÝ"Ð#5°ÑGÔG€JÝ*Ð+=Ñ>Ô>€Nå8¸ÑHÔHÐõ 5Ð5JÑKÔKÐåÐ&Ñ'Ô'×/Ò/ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ñô ð ð ð r   c                 ó  — t                                ¦   «         D ]p\  } }| t          ¦   «         v r[|                     ¦   «         }t          j                             |¦  «        rt	          j        |¦  «         |                     ¦   «          ŒqdS )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)	rH   ÚitemsrS   r]   ro   rp   rq   Úunlinkrj   )r.   ry   rh   s      r   Úpurge_old_log_filesrç   ’  s‰   € õ 0×5Ò5Ñ7Ô7ð !ð !‰ˆˆeØÕ(Ñ*Ô*Ð*Ð*Ø×,Ò,Ñ.Ô.ˆHÝŒw�~Š~˜hÑ'Ô'ð $Ý”	˜(Ñ#Ô#Ð#à×ÒÑ Ô Ð øð!ð !r   r7   úSet[str]c                 ó4   — t          t          j        ¦  «        S r:   )Úenabled_metric_tables_implr   rS   r   r   r   rS   rS   ¡  s   € Ý%¥fÔ&BÑCÔCÐCr   Ú
config_strrK   c                óØ   — t          ¦   «         }|                      d¦  «        D ]E}|                     ¦   «         }|sŒ|t          v sJ d|› d�¦   «         ‚|                     |¦  «         ŒF|S )NrÊ   zMetric table name z is not registered)rU   rÍ   ÚstriprH   Úadd)rë   Úenabledr.   s      r   rê   rê   ¥  s‚   € å‰eŒe€GØ× Ò  Ñ%Ô%ð ð ˆØ�zŠz‰|Œ|ˆØð 	ØàÕ,Ð,Ð,Ð,Ø8 Ð8Ð8Ð8ñ -Ô,Ð,à�Š�DÑÔÐÐØ€Nr   c                ó"   — | t          ¦   «         v S r:   )rS   r-   s    r   Úis_metric_table_enabledrñ   ³  s   € ØÕ(Ñ*Ô*Ð*Ð*r   c                óJ   — | t           v sJ d| › d�¦   «         ‚t           |          S )NzMetric table z is not defined)rH   r-   s    r   râ   râ   ·  s3   € ØÕ+Ð+Ð+Ð+Ð-R¸TÐ-RÐ-RÐ-RÑ+Ô+Ð+Ý# DÔ)Ð)r   )r7   rè   )rë   rK   r7   rè   )9Ú
__future__r   re   r2   r¬   ro   rº   r   Ú	functoolsr   Útypingr   r   r   r	   r
   Útorch._inductorr   Útorch._inductor.utilsr   Útorch._inductor.schedulerr   r   r   r    r   r   r   r"   r#   r   r   r$   r%   r&   r'   r)   r4   r6   rH   rJ   rz   r²   r¶   r¾   rÂ   rÆ   rÓ   r×   rÚ   rÜ   rã   rç   rS   rê   rñ   râ   r   r   r   ú<module>rù      s5  ðà "Ð "Ð "Ð "Ð "Ð "Ð "à 
€
€
€
Ø Ð Ð Ð Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8à "Ð "Ð "Ð "Ð "Ð "Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4ð ð <Ø;Ð;Ð;Ð;Ð;Ð;ð Ð Ø!"Ð ØÐ ð ð ð ð ð ñ ð 8:€Ð 9Ð 9Ð 9Ñ 9ð Ð ð Ð ð Ôð!ð !ð !ð !ð !ñ !ô !ñ Ôð!ð CEÐ !Ð DÐ DÐ DÑ DàÐ Ø,-Ð )àÐ ðð ð ð0 ð3ð 3ð 3ð 3ð 3ñ 3ô 3ñ „ð3ðMð Mð Mð8ð 8ð 8ð 8ð 8ñ 8ô 8ð 8ð2 46Ð Ð 5Ð 5Ð 5Ñ 5ð ð8/ð 8/ð 8/ð 8/ð 8/ñ 8/ô 8/ñ „ð8/ðv × Ò Øðð ð ñô ð ð × Ò Øðð ð ñô ð ð × Ò Øðð ð ñô ð ð" × Ò Ø-ð	ð 	ð 	ñô ð ð × Ò Øðð ð ñô ð ð6+ð +ð +ð 3ð 3ð 3ðð ð ðð ð ð0ð 0ð 0ðð ð ð&ð &ð &ðð ð ðð ð ð&'ð 'ð 'ðT!ð !ð !ðDð Dð Dð Dð ð
ð 
ð 
ñ „ð
ð+ð +ð +ð*ð *ð *ð *ð *r   