o
    I&i                     @  s  U d dl m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rCd dlmZmZmZmZ d ad ad ag ad	ed
< g Zded< d ad ad add Z i Z!eG dd dZ"e"#dg d e"#dg d dd Z$edddZ%dd Z&dd Z'dS )     )annotationsN)	dataclass)	lru_cache)ListSetTupleTYPE_CHECKINGUnion)config)get_benchmark_name)BaseSchedulerNodeExternKernelSchedulerNodeNopKernelSchedulerNodeSchedulerNodezYList[Tuple[Union[NopKernelSchedulerNode, SchedulerNode, ExternKernelSchedulerNode], int]]nodes_num_elemz%List[Tuple[BaseSchedulerNode, float]]node_runtimesc                   C  s,   da dadat  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_countdisable_cpp_wrapper r   r   BC:\wamp64\www\opt\env\Lib\site-packages\torch/_inductor/metrics.pyreset-   s   r   c                   @  sV   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
dS )MetricTablestr
table_namez	List[str]column_namesr   intnum_rows_addedc                   s   | 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d| jD 7 }| | d S )Nz v.s. c                   s   g | ]} | qS r   r   ).0Zcolumn_nameZrow_dictr   r   
<listcomp>X   s    z'MetricTable.add_row.<locals>.<listcomp>)r   enabled_metric_tableslenr   setkeysr   
_write_row)selfZrow_fnrowr   r#   r   add_rowI   s"   

zMetricTable.add_rowc                 C  s   d| j  dS )NZmetric_table_z.csv)r   )r*   r   r   r   output_filename[   s   zMetricTable.output_filenamec                 C  sX   |   }t|d}tj|dd}|dg| j  W d    d S 1 s%w   Y  d S )Nw
lineterminatorZ
model_name)r-   opencsvwriterwriterowr   )r*   filenamefdr4   r   r   r   write_header^   s
   "zMetricTable.write_headerc                 C  s   |   }| jdkrtj|s|   |  jd7  _t|D ]\}}t|tr,|d}n	|d u r3d}n|}|||< qt	|d}t
j|dd}|| W d    d S 1 sWw   Y  d S )Nr      z.6f ar/   r0   )r-   r!   ospathexistsr8   	enumerate
isinstancefloatr2   r3   r4   r5   )r*   r+   r6   idxZorig_valnew_valr7   r4   r   r   r   r)   d   s   


"zMetricTable._write_rowc                 C  s   t | |}|t| < d S N)r   REGISTERED_METRIC_TABLES)namer   tabler   r   r   register_tablex   s   
zMetricTable.register_tableN)__name__
__module____qualname____annotations__r!   r,   r-   r8   r)   staticmethodrH   r   r   r   r   r   B   s   
 r   Zslow_fusion)Zkernel1_pathZkernel1_latencyZkernel2_pathZkernel2_latencyZfused_kernel_pathZfused_kernel_latencyZslow_down_ratioZgraph_stats)Zgraph_idZnum_nodes_before_fusionZnum_nodes_after_fusionc                  C  sF   t  D ]\} }| t v r | }tj|rt| |  qd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)	rE   itemsr%   r-   r<   r=   r>   unlinkr8   )rF   rG   r6   r   r   r   purge_old_log_files   s   

rP   returnSet[str]c                  C  sP   t j} t }| dD ]}| }|sq|tv s J d| d|| q|S )N,zMetric table name z is not registered)r
   r%   r'   splitstriprE   add)Z
config_strenabledrF   r   r   r   r%      s   

r%   c                 C  s
   | t  v S rD   )r%   rF   r   r   r   is_metric_table_enabled   s   
rY   c                 C  s    | t v sJ d|  dt |  S )NzMetric table z is not defined)rE   rX   r   r   r   get_metric_table   s   rZ   )rQ   rR   )(
__future__r   r3   r<   dataclassesr   	functoolsr   typingr   r   r   r   r	   Ztorch._inductorr
   Ztorch._inductor.utilsr   Ztorch._inductor.schedulerr   r   r   r   r   r   r   r   rL   r   r   r   r   r   rE   r   rH   rP   r%   rY   rZ   r   r   r   r   <module>   sH    
;
