U
    ªÊ¹jØ  ã                   @   s¨   d dl Z d dlZd dlZd dlZd dlZd dlZddlmZmZ ddl	m
Z
 e e¡Ze
edddœdd„ƒƒZe jed	d
�Ze jedd
�Zdd„ Ze  d¡dd„ ƒZdS )é    Né   )Údevice_from_inputsÚfake_tensor_unsupported)Úregister_backendé N  )Ú	schedulerÚtrialsc             
      s
  dd l ‰ddl m} ddlm} tj | |¡}t|ƒ}dd„ t|ƒD ƒ}| |Ž }	t	|	ƒdkrlt
 d¡ | jS |j ||¡\}
}|jdkr ˆ |j¡}ˆj ¡ }nˆ d¡}ˆj tƒ ¡}|d krÎtj dd ¡}|d	k�rdd
l m} t ¡ }tj |¡�s¼| |
d ||¡\}}|D ]}t|j ƒ �qtdƒ t	|ƒdk�r¼| !||¡}tj |¡�s¼|dk�sdt"‚|j#|| $|¡gdd�}z| %|¡ W n0 t&k
�rº   tj |¡�r´t '|¡ ‚ Y nX | (|¡�6 ˆj)j*dddid�� |j+|
||d�}W 5 Q R X W 5 Q R X nÌ|dk�rŒddl m,} t -¡ �b}|jdk�rRˆj tƒ › d|j.j/dd�› �¡}|j0j1|
||dd|dd�}|j0j2||
||d�}W 5 Q R X nD|dk�sœ|�sÈˆj)j*dd �� |j+|
||d�}W 5 Q R X nt3d!ƒ‚| 4|d |ƒ¡‰ d"d#„ ‰‡fd$d%„‰‡ ‡‡fd&d'„}|S )(Nr   )Úrelay)Úgraph_executorc                 S   s    g | ]\}}d |› �|j f‘qS )Úinp_)Úshape)Ú.0ÚidxÚi© r   úY/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/_dynamo/backends/tvm.pyÚ
<listcomp>   s     ztvm.<locals>.<listcomp>z0Explicitly fall back to eager due to zero outputÚcudaZTVM_SCHEDULERÚauto_scheduler)r   ÚmainzNo tasksiÐ  )Znum_measure_trialsZmeasure_callbacksZearly_stoppingé   z relay.backend.use_auto_schedulerT)Ú	opt_levelÚconfig)ÚtargetÚparamsÚmeta_schedule)r   z --num-cores F)Zlogicalr   é@   Zevolutionary)Úmodr   Úwork_dirZmax_trials_globalZnum_trials_per_iterr   Zstrategy)Údatabaser   r   r   Údefaulté
   )r   z¢This tuning option is invalid/not implemented for torchdynamo's TVM-related backend. There are three available options: default, auto_scheduler and meta_schedule.c                 S   s*   | j dkrt |  ¡ ¡S tjj |  ¡ ¡S )z8A helper function to transfer a NDArray to torch.tensor.Úbool)ÚdtypeÚtorchZ
from_numpyÚnumpyÚutilsZdlpackÚfrom_dlpackZ	to_dlpack)Z	nd_tensorr   r   r   Úto_torch_tensorp   s    
ztvm.<locals>.to_torch_tensorc                    s,   | j tjkr ˆ j |  ¡  ¡ ¡S ˆ j | ¡S )z8A helper function to transfer a torch.tensor to NDArray.)r#   r$   r"   ÚndÚarrayÚcpur%   r'   )Ztorch_tensor)Útvmr   r   Úto_tvm_tensory   s    ztvm.<locals>.to_tvm_tensorc                     s®   dd„ | D ƒ}ˆ   ¡ \}}dd„ | ¡ D ƒ}t|dƒD ]R\}}| ¡ dkr6|jrX| ¡ }d|› �}||krxt d|¡ q6ˆ  |ˆ|ƒ¡ q6ˆ  	¡  ‡ ‡fdd„t
ˆ  ¡ ƒD ƒS )	Nc                 S   s   g | ]}|  ¡ ‘qS r   )Ú
contiguous)r   Úar   r   r   r   ‚   s     z)tvm.<locals>.exec_tvm.<locals>.<listcomp>c                 S   s   h | ]\}}|’qS r   r   )r   ÚnameÚ_r   r   r   Ú	<setcomp>„   s     z(tvm.<locals>.exec_tvm.<locals>.<setcomp>r   r   z6input %s skipped as not found in tvm's runtime libraryc                    s   g | ]}ˆˆ   |¡ƒ‘qS r   )Z
get_output)r   r   )Úmr(   r   r   r   •   s     )Zget_input_infoÚitemsÚ	enumerateÚdimZrequires_gradÚdetachÚlogÚwarningZ	set_inputÚrunÚrangeZget_num_outputs)Zi_argsÚargsZ
shape_infor1   Zactive_inputsr   ÚargZinp_name)r3   r(   r-   r   r   Úexec_tvm�   s(    
þþztvm.<locals>.exec_tvm)5r,   r	   Ztvm.contribr
   r$   ZjitÚtracer   r5   Úlenr8   r9   ÚforwardZfrontendZfrom_pytorchÚtyper   Úindexr   r+   ZTargetÚllvm_targetÚosÚenvironÚgetr   ÚtempfileÚNamedTemporaryFileÚpathÚexistsZextract_tasksÚprintZcompute_dagZTaskSchedulerÚAssertionErrorZTuningOptionsZRecordToFileZtuneÚ	ExceptionÚunlinkZApplyHistoryBestZ	transformZPassContextÚbuildr   ÚTemporaryDirectoryr&   Ú	cpu_countZrelay_integrationZ
tune_relayZcompile_relayÚNotImplementedErrorZGraphModule)ZgmZexample_inputsr   r   r	   r
   Zjit_modZdeviceZ
shape_listZexample_outputsr   r   Údevr   r   Zlog_fileÚtasksZtask_weightsÚtaskZtunerZtune_optionÚlibÚmsr   r   r>   r   )r3   r(   r-   r,   r   r,      s¨    



  ÿ
ý
 ÿ&

ÿù	üÿ	r,   r   )r   r   c                   C   s,   zt  d¡ W dS  tk
r&   Y dS X d S )Nr,   TF)Ú	importlibÚimport_moduleÚImportErrorr   r   r   r   Úhas_tvmž   s
    
r\   c                   C   s   dt dƒ ¡ krdS dS )NZavx512z/proc/cpuinfozllvm -mcpu=skylake-avx512zllvm -mcpu=core-avx2)ÚopenÚreadr   r   r   r   rD   ¦   s    rD   )Ú	functoolsrY   ÚloggingrE   rH   r$   Úcommonr   r   Úregistryr   Ú	getLoggerÚ__name__r8   r,   ÚpartialZtvm_meta_scheduleZtvm_auto_schedulerr\   Ú	lru_cacherD   r   r   r   r   Ú<module>   s"   
 
