U
    Mh                     @   sn   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rje  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tt fdd|  D s:t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/html/venv/lib/python3.8/site-packages/torch/utils/benchmark/examples/op_benchmark.py	<genexpr>   s      z%assert_dicts_equal.<locals>.<genexpr>N)setkeysAssertionErrorr   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 ]}dddd	 |	| jD  d
 }|
| d }t	|t
t|krdn
tt|}|
| d }t|t|krt|nd}|||||f q||||f td|d  d|  dd q:t  g ddddf\}}}}}|D ]\}}}|jd }|jd }t|| ||  d }|||||f |D ]F\}} }}t|t|}t|t| }t|t|}t|t|}q̐q|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 ]\}!}"|!D ]\}}}}|d  d!d"||k rd#nd$d%gfd&d	|d d' D  t|D ]b\}#\}} }}| d(|d }| |d } ||}t|# d| d)|  d*| d+| 	 qqt|" qd 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   r1   r   run   sh    




&

&(& 
,rF   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))rB   r   rC   ztorch.square(x)zx + y)rF   r   r   r   r   r   r   mainb   s    rG   __main__)__doc__numpyr   r4   Ztorch.utils.benchmarkr   Z'torch.utils.benchmark.op_fuzzers.binaryr   Z&torch.utils.benchmark.op_fuzzers.unaryr   r?   r   r   rF   rG   __name__r   r   r   r   <module>   s   
E