U
    •Ê¹jª  ã                   @   sê   d dl mZ d dlmZmZmZmZ d dlZd dlZd dl	Z	d dl
mZ eee dœdd„Zejjdœd	d
„Zeeeee f dœdd„Zdd„ Zdd„ Zdddœedœdd„Zedd„ ƒZedœdd„Zedœdd„Zedœdd„ZdS ) é    )Úcontextmanager)ÚAnyÚListÚTupleÚcastN)ÚTimer)ÚfilenameÚreturnc              	      s´   d}d}d ‰ d}g }t | ƒ�Ž}| ¡  |¡}t|ƒD ]p\}}|dkrFq4| |¡}	|	dkrZq4|d |	… }
||d   ¡ d ‰ ‡ fdd„|
jd	d
�D ƒ}| d |¡¡ q4W 5 Q R X |S )Nz<GRAPH_EXPORT>z</GRAPH_EXPORT>Ú r   éÿÿÿÿé   c                    s   g | ]}|t ˆ ƒd … ‘qS ©N)Úlen)Ú.0Úx©Úpfx© úZ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/utils/jit/log_extract.pyÚ
<listcomp>   s     zextract_ir.<locals>.<listcomp>T)Úkeepends)ÚopenÚreadÚsplitÚ	enumerateÚfindÚ
splitlinesÚappendÚjoin)r   ZBEGINÚENDÚcurrentZgraphsÚfZ
split_strsÚiZ	split_strZend_locÚsÚlinesr   r   r   Ú
extract_ir   s$    

r%   )Úinp_typec                 C   sb   |   ¡ }|  ¡ }|  ¡ }|  ¡ }|d k	s,t‚|d k	s8t‚|d k	sDt‚|d k	sPt‚tj||||d�S )N)ÚsizeÚstrideÚdeviceÚdtype)ÚsizesÚstridesr)   r*   ÚAssertionErrorÚtorchZempty_strided)r&   r'   r(   r)   r*   r   r   r   Úmake_tensor_from_type   s    r/   )Úirr	   c                 C   s
  t jj| dd�}| ¡  g }| ¡ D ]À}t| ¡ t jjƒrN| t	 
dd¡¡ q$t| ¡ t jjƒrt| t	 dd¡¡ q$t| ¡ t jjƒr¨tt jj| ¡ ƒ}| t|ƒ¡ q$t| ¡ t jjƒrÒ| t	 dd¡dk¡ q$td| ¡ › �ƒ‚q$t j d|¡}t j |j¡ ||fS )	NT)Zparse_tensor_constantsgš™™™™™¹?éd   r   r   z,A default value is not implemented for type Úforward)r.   Ú_CZparse_irZmakeMultiOutputIntoTupleÚinputsÚ
isinstanceÚtypeZ	FloatTyper   ÚrandomÚuniformZIntTypeÚrandintÚ
TensorTyper   r/   ZBoolTypeÚNotImplementedErrorZ_create_function_from_graphZ!_jit_pass_erase_shape_informationÚgraph)r0   r<   r4   ZinpZ
tensorTypeÚfuncr   r   r   Úload_graph_and_inputs)   s"    r>   c                 C   s$   t d| |dœd�}| ¡ }|jd S )Nzfn(*inputs))Úfnr4   )ÚstmtÚglobalséè  )r   Zblocked_autorangeZmedian)r?   r4   Ú	test_runsÚtÚtimesr   r   r   Ú	time_cuda>   s    rF   c                 C   s6   t  ¡ }t|ƒD ]}| |Ž  qt  ¡ }|| | d S )NrB   )ÚtimeÚperf_counterÚrange)r?   r4   rC   r#   Ú_Úer   r   r   Útime_cpuC   s
    
rL   é
   é   )Úwarmup_runsrC   )r	   c          	      C   sx   t | ƒ\}}t|ƒD ]}||Ž  qd }|D ] }t|tjƒr*|jjdk} qLq*|d k	sXt‚|rht|||ƒn
t	|||ƒ}|S )NÚcpu)
r>   rI   r5   r.   ZTensorr)   r6   r-   rL   rF   )	r0   r4   rO   rC   r<   rJ   Zis_cpuÚinputÚoutr   r   r   Úrun_testJ   s    
rS   c               	   o   s*   t j d¡}z
d V  W 5 t j |¡ X d S )NF)r.   r3   Z_get_graph_executor_optimize)ÚargsÚkwargsZold_optimizer   r   r   Úno_fuserY   s    
rV   c              
   C   s(   t ƒ � t| |ƒW  5 Q R £ S Q R X d S r   )rV   rS   ©r0   r4   r   r   r   Úrun_baseline_no_fusiona   s    rX   c              
   C   sb   zN|rdgndg}t j |¡}t j d¡� t| |ƒW  5 Q R £ W ¢S Q R X W 5 t j |¡ X d S )N)ZDYNAMICrM   )ZSTATICrM   Zfuser1)r.   ÚjitZset_fusion_strategyÚfuserrS   )r0   r4   ZdynamicZ	old_stratZstratr   r   r   Úrun_nncf   s    $r[   c              
   C   s.   t j d¡� t| |ƒW  5 Q R £ S Q R X d S )NZfuser2)r.   rY   rZ   rS   rW   r   r   r   Úrun_nvfusero   s    r\   )Ú
contextlibr   Útypingr   r   r   r   r7   r.   rG   Ztorch.utils.benchmarkr   Ústrr%   r3   r:   r/   r>   rF   rL   ÚfloatrS   rV   rX   r[   r\   r   r   r   r   Ú<module>   s    
	