o
    灛i%                     @   s  d dl Z d dlmZ d dlZd dlZd dlZd dlm	Z	m
Z
 dd Zdd Zdd	 Zd
d ZedddgZeddddddZedddddZedddddZi dd ej D dd ej D Zdd Zd d! Zd"d# Zd$d% Zed&kre  dS dS )'    N)
namedtuple)COMPUTE_METADATA_SCOPE_NAME
TritonHookc                 C   sn   g }| r.| D ]%}|  }|D ]}|dd    }|||fv r*||d   nqq|S |d gd }|S )N(r    (inc))lowersplitstripappend)metricsraw_metricsretmetric
raw_metricraw_metric_no_unit r   X/sda-disk/www/egybert/egybert_env/lib/python3.10/site-packages/triton/profiler/viewer.pymatch_available_metrics
   s   r   c                 C   s.   t | }|d}tj|}|| |fS )N   )jsonloadpopht
GraphFramefrom_literalshow_metric_columns)filedatabasedevice_infogfr   r   r   get_raw_metrics   s   

r    c              	   C   sh  t jd| jdgd}|D ]}|| D ]}|| | d }|| | d }|| | d }tjD ]}| d |k}	| |	 }
d| |
jvrDq/d	}|d
kru|dkrUd|d  }nE|dkr`d|d  }n:|dkrt|d | d d d |d  }n%|dkr|dkrd|d  }n|dks|dkrd|d  }ntd| |j|	df  |
d|  d	| 7  < q/qq|S )N        min_timeindexcolumnsarchnum_sms
clock_rateDeviceIdflopsr   CUDA80g  2C   89g bB90r   g    x:Ai     mBHIPgfx90ag  //bBgfx941gfx942g ?y"CzUnsupported device type: )	pd	DataFramer$   r   flops_widthr%   
ValueErrorlocfillna)dfr   min_time_flopsdevice_typedevice_indexr&   r'   r(   widthidxdevice_frames	max_flopsr   r   r   get_min_time_flops    s>   
 ,rD   c           
      C   s   t jd| jdgd}|D ]<}|| D ]5}| d |k}| | }|| | d }|| | d }d| | d d	 }	|j|df  |d
 |	 7  < qq|S )Nr!   r"   r#   r)   memory_clock_rate	bus_width   g     @@r-   bytes)r6   r7   r$   r:   )
r<   r   min_time_bytesr>   r?   rA   rB   rE   rF   peak_bandwidthr   r   r   get_min_time_bytesA   s    rK   
FactorDictnamefactortimer   gMbP?gư>g&.>)time/sztime/msztime/usztime/nsr*   g    eAr1   )zflop/szgflop/sztflop/srH   )zbyte/szgbyte/sztbyte/sc                 C      i | ]}|t qS r   )flops_factor_dict.0keyr   r   r   
<dictcomp>T       
rV   c                 C   rQ   r   )bytes_factor_dictrS   r   r   r   rV   V   rW   c                 C   s  g }g }t tjg|d }tjd |dd dd  }|D ]}|dkrVt| j|}	t| j|}
| j| tj| tjd   }|
d |	d t	| | jd	< |
d	 q |tv rt| }|j}|j}t |g|d }| j| | j| tj|   ||  | j| d
< |
| d
 q |tjv rtjd |dd  }| j| tj| tj|   | j| d
< |
| d
 q |
| q |rt ||}|| S )Nr   /r   r   )utilrP   r"   z
util (inc)r   )r   time_factor_dictrM   r   rK   	dataframerD   rN   combinemaxr
   derivable_metrics)r   r   r   r   derived_metricsoriginal_metricstime_metric_name	time_unitr   rI   r=   time_secderiveable_metricmetric_namemetric_factor_dictmatched_metric_namemetric_time_unitr   r   r   derive_metrics[   sD   "

rk   c                 C   s   t |do}t|\}}}	t|dksJ d|  t|| ||	} |s&|r=|r.d| dn|}
dd|
ig}|j|dd	}ddt dig}|j|dd	}|rad| d d
| ig}|j|dd	}t|j| d|dd W d    d S 1 sww   Y  d S )Nrr   z"No metrics found in the input filez^(?!z).**rM   T)squashz>= F)metric_columnexpand_namedepthrender_header)	openr    lenupdate_inclusive_columnsrk   filterr   printtree)r   filenameincludeexclude	thresholdrq   fr   r   r   name_filterqueryr   r   r   parse~   s    "r   c                 C   sz   t | d.}t|\}}}td |r*|D ]}|dd   }td|  q	 W d    d S 1 s6w   Y  d S )Nrl   zAvailable metrics:r   r   z- )rs   r    rw   r   r	   r   )	file_namer}   _r   r   r   r   r   r   show_metrics   s   $r   c            	      C   s  t jdt jd} | jddddd | jdd	td d
d | jddtd dd | jddtd dd | jddtd dd | jddtddd |  \}}t|dksSJ d|d }|j	r`|j	
dnd }|j}|j}|j}|j}|rv|rvtd|jrt| d S |rt|||||| d S d S )Nz,Performance data viewer for proton profiles.)descriptionformatter_classz-lz--list
store_truea`  List available metrics. Metric names are case insensitive and ignore units.
Derived metrics can be created when source metrics are available.
- time/s, time/ms, time/us, time/ns: time
- flop/s, gflop/s, tflop/s: flops / time
- byte/s, gbyte/s, tbyte/s: bytes / time
- util: max(sum(flops<width>) / peak_flops<width>_time, bytes / peak_bandwidth_time))
)actionhelpz-mz	--metricszAt maximum two metrics can be specified, separated by comma.
There are two modes:
1) Choose the output metric to display. It's case insensitive and ignore units.
2) Derive a new metric from existing metrics.
)typedefaultr   z-iz	--includez?Include frames(kernels) that match the given regular expressionz-ez	--excludez?Exclude frames(kernels) that match the given regular expressionz-tz--thresholdzrExclude frames(kernels) whose metrics are below the given threshold. This filter only applies on the first metric.z-dz--depthd   z The depth of the tree to displayr   zMust specify a file to readr   ,z'Cannot specify both include and exclude)argparseArgumentParserRawTextHelpFormatteradd_argumentstrfloatintparse_known_argsrt   r   r   rz   r{   r|   rq   r9   listr   r   )		argparserargstarget_argsr   r   rz   r{   r|   rq   r   r   r   main   sx   	r   __main__)r   collectionsr   r   pandasr6   hatchetr   triton.profiler.hookr   r   r   r    rD   rK   rL   r\   rR   rX   rN   keysr`   rk   r   r   r   __name__r   r   r   r   <module>   s<    !#M
