o
    0h                     @   sr   d 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
Z
dZdd Zd	d
 Zdd Zedkr7e  dS dS )zfExample use of Timer and op fuzzers to measure kernel performance.

$ python -m examples.op_benchmark
    N)Timer)BinaryOpFuzzer)UnaryOpFuzzerg      ?c                    s>   t |  t |  ksJ t fdd|  D sJ dS )zBuiltin dict comparison will not compare numpy arrays.
    e.g.
        x = {"a": np.ones((2, 1))}
        x == x  # Raises ValueError
    c                 3   s.    | ]\}}|d krt | | kV  qdS )dtypeN)npall).0kvdict_1 _/var/www/vscode/kcb/lib/python3.10/site-packages/torch/utils/benchmark/examples/op_benchmark.py	<genexpr>   s   , z%assert_dicts_equal.<locals>.<genexpr>N)setkeysr   items)dict_0r   r   r   r   assert_dicts_equal   s   "r   c           $         s  |dt jd| }|dt jd| }g }tt||D ]\}\}}|\}	}
}|\}}}t|| t|
d |d   fdd|	|fD \}}g }|	D ]I}dddd	 |	| jD  d
 }|
| d }t	|t
t|krrdntt|}|
| d }t|t|krt|nd}|||||f qL||||f td|d  d|  dd qt  g ddddf\}}}}}|D ]I\}}}|jd }|jd }t|| ||  d }|||||f |D ]"\}} }}t|t|}t|t| }t|t|}t|t|}qq|jtdd td   tdddd|  ddd td| ddd| dd tdd  |d d df|dd  dffD ]m\}!}"|!D ]a\}}}}|d  d!d"||k rjd#nd$d%gfd&d	|d d' D  t|D ]1\}#\}} }}| d(|d }| |d } ||}t|# d| d)|  d*| d+| 	 qqWt|" qQd S ),Nr   )seedr   xc                 3   s$    | ]}t  |d jtdV  qdS ))globals)min_run_timeN)r   blocked_autorange_MEASURE_TIME)r   tensors)stmtr   r   r   *   s    
zrun.<locals>.<genexpr>(z, c                 S   sF   g | ]}d t t| |kr|dkrdt t| nt|qS )      z2 ** )intr   log2str)r   ir   r   r   
<listcomp>4   s    zrun.<locals>.<listcomp>)order stepsr   z / )endg    .Ar   )keyzstmt: z diff    fasterz>17 shapez>16z          steps
zd----------------------------------------------------------------------------------------------------
   z...id   z>4.1fz%    r    floatz<20c                    s   g | ]}d  t d qS )r'   r   )ljustlen)r   _)time_strr   r   r$   Y   s    :z  z|     z
      |   )torchfloat32takeint32	enumeratezipr   joinr-   r   r   aranger2   r"   tuplesumappendprintmedianabsmaxsortoperator
itemgetterr1   extend)$nr   
fuzzer_cls
float_iterint_iterraw_resultsr#   float_values
int_valuesfloat_tensorsfloat_tensor_paramsfloat_paramsint_tensorsint_tensor_params
int_paramsfloat_measurementint_measurementdescriptionsname	shape_strr&   	order_strr(   	steps_strparsed_resultsname_len	shape_len	order_len	steps_lent_floatt_intrel_diffr-   resultsspacert_strr   )r   r4   r   run   sn   




&

&(& 
(ri   c                   C   s.   t ddtd t ddtd t ddtd d S )Nr/   ztorch.median(x, dim=0))rJ   r   rK   ztorch.square(x)zx + y)ri   r   r   r   r   r   r   mainb   s   rj   __main__)__doc__numpyr   r7   torch.utils.benchmarkr   'torch.utils.benchmark.op_fuzzers.binaryr   &torch.utils.benchmark.op_fuzzers.unaryr   rG   r   r   ri   rj   __name__r   r   r   r   <module>   s   
E
