o
    wZh                     @   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 Z/var/www/auris/lib/python3.10/site-packages/torch/utils/benchmark/examples/op_benchmark.py	<genexpr>   s   , z%assert_dicts_equal.<locals>.<genexpr>N)setkeysr   items)Z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)Zmin_run_timeN)r   Zblocked_autorange_MEASURE_TIME)r   Z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
      |   )torchZfloat32ZtakeZint32	enumeratezipr   joinr)   r   r   Zaranger.   r   tuplesumappendprintZmedianabsmaxsortoperator
itemgetterr-   extend)$nr   
fuzzer_clsZ
float_iterZint_iterZraw_resultsr   Zfloat_valuesZ
int_valuesZfloat_tensorsZfloat_tensor_paramsZfloat_paramsZint_tensorsZint_tensor_paramsZ
int_paramsZfloat_measurementZint_measurementZdescriptionsnameZ	shape_strr"   Z	order_strr$   Z	steps_strZparsed_resultsZname_lenZ	shape_lenZ	order_lenZ	steps_lenZt_floatZt_intZrel_diffr)   resultsZspacerZt_strr   )r   r0   r   run   sn   




&

&(& 
(rE   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))rA   r   rB   ztorch.square(x)zx + y)rE   r   r   r   r   r   r   mainb   s   rF   __main__)__doc__numpyr   r3   Ztorch.utils.benchmarkr   Z'torch.utils.benchmark.op_fuzzers.binaryr   Z&torch.utils.benchmark.op_fuzzers.unaryr   r>   r   r   rE   rF   __name__r   r   r   r   <module>   s   
E
