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Z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Z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Zd dlZd dlZd dlZd dlmZ d dlmZmZmZ d dlmZ d dlm Z  d dlm!Z! d dlm"Z" d dl
m#Z# d d	lm$Z$ d d
l%m&Z&m%Z% d dl'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d dl.Z.d dl/m0Z0m1Z1m2Z2 d dl3m4Z4 d dl5m6Z6m7Z7 e	j8 9e:¡Z;e	j8 <e	j8 <e;¡¡Z=e0 >¡ �rèd dl?m@Z@ d dlAmBZB d dlCmDZDmEZEmFZF ndd„ ZDdd„ ZEdd„ ZFdZGd aHdaIdd„ ZJdd„ ZKe LeM¡ZNe Od¡dd„ ƒZPdd „ ZQG d!d"„ d"ƒZRG d#d$„ d$eRƒZSG d%d&„ d&eRƒZTd'd(„ ZUdŒeVd*œd+d,„ZWd�eVeVeVd-œd.d/„ZXdŽe-eVeYf eVeVd1œd2d3„ZZd�e-eVeYf eVeVeVeVd4œd5d6„Z[eVe-eVeYf d7œd8d9„Z\ej]G d:d;„ d;ƒƒZ^e^d<œd=d>„Z_d?d@„ Z`e OdA¡dBdC„ ƒZadDdE„ ZbdFdG„ Zce Od¡dHdI„ ƒZdG dJdK„ dKƒZeej]G dLdM„ dMeeƒƒZfej]G dNdO„ dOeeƒƒZgG dPdQ„ dQeeƒZhehƒ Ziefƒ egƒ gZje Od¡dRdS„ ƒZkdTdU„ Zld�dWdX„Zmd‘dYdZ„Znd[d\„ Zod]d^„ Zpd_d`„ Zqdadb„ Zrdcdd„ Zsdedf„ Zte Od¡dgdh„ ƒZue Od¡didj„ ƒZvdkeidkdkfeedlœdmdn„ZwdVdVdkeidkdkfeedlœdodp„ZxG dqdr„ drƒZyG dsdt„ dtƒZzejOdudv„ ƒZ{dwdx„ Z|ddyœdzd{„Z}G d|d}„ d}ƒZ~G d~d„ dƒZG d€d�„ d�ƒZ€G d‚dƒ„ dƒƒZ�d„d…„ Z‚d†d‡„ ZƒG dˆd‰„ d‰ƒZ„G dŠd‹„ d‹ƒZ…e… †¡  dS )’é    N)Úbisect_right)ÚFutureÚProcessPoolExecutorÚThreadPoolExecutor)Úcdll)Úfield)Úpartial)Úabc)ÚPath)ÚThread)ÚsleepÚtime)ÚAnyÚCallableÚDictÚListÚSetÚUnion)ÚconfigÚcuda_propertiesÚexc)Údeveloper_warning)Ú	_FaketqdmÚtqdm)Úbuild_paths)Ú_run_build_command)Úlog_global_cache_statsÚlog_global_cache_valsÚuse_global_cachec                  O   s   d S ©N© ©ÚargsÚkwargsr    r    úX/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/_inductor/codecache.pyr   8   s    r   c                  O   s   d S r   r    r!   r    r    r$   r   ;   s    r   c                   C   s   dS ©NFr    r    r    r    r$   r   >   s    r   iX  c                   C   s   t d krtƒ a d S r   )Ú_t0r   r    r    r    r$   Ú_compile_startI   s    r'   c                  C   s"   t d k	rtƒ } t| t  7 ad a d S r   )r&   r   Ú_cumulative_compile_time)Út1r    r    r$   Ú_compile_endO   s    r*   c                  C   s<   t j d¡} | d kr*t ¡ › dt ¡ › �} t j| dd� | S )NZTORCHINDUCTOR_CACHE_DIRz/torchinductor_T©Úexist_ok)ÚosÚenvironÚgetÚtempfileÚ
gettempdirÚgetpassÚgetuserÚmakedirs)Ú	cache_dirr    r    r$   r5   [   s
    r5   c                 C   sz   t jjd krdndt jj dd¡› �}dtjj› tjj› �}|› d|› �}tj	 
tƒ |¡}tj	 
|| ¡}tj|dd� |S )	NÚcpuÚcuÚ.Ú ÚpyÚ_Tr+   )ÚtorchÚversionÚcudaÚreplaceÚsysÚversion_infoÚmajorÚminorr-   ÚpathÚjoinr5   r4   )ÚnameZcu_strÚpython_versionZbuild_folderÚcpp_wrapper_dirZcpp_wrapper_build_directoryr    r    r$   Úcpp_wrapper_cache_dird   s    
ÿýrI   c                   @   sf   e Zd Zee d¡dd„ ƒƒZee d¡dd„ ƒƒZee d¡dd„ ƒƒZdd	„ Z	d
d„ Z
dd„ ZdS )Ú	CacheBaseNc                  C   sˆ   zdd l } | j}W n tk
r*   d }Y nX dtj tj ¡ ¡jitjj|dœdtj	jj
jidœ}t tj|dd� d¡¡ ¡ |d	< |S )
Nr   rF   )r>   ÚtritonÚ
allow_tf32)Údevicer=   ÚotherT)Ú	sort_keysúutf-8Úhash)rK   Ú__version__ÚModuleNotFoundErrorr<   r>   Zget_device_propertiesÚcurrent_devicerF   r=   ÚbackendsÚmatmulrL   ÚhashlibÚsha256ÚjsonÚdumpsÚencodeÚ	hexdigest)rK   Ztriton_versionÚsystemr    r    r$   Ú
get_systemt   s*    

 ÿÿþ 
ÿöÿzCacheBase.get_systemc                   C   s   t tj tƒ dt ¡ d ¡ƒS )NÚcacherQ   )r
   r-   rD   rE   r5   rJ   r^   r    r    r    r$   Úget_local_cache_path“   s    zCacheBase.get_local_cache_pathc                   C   s*   t jd k	r&ttj t jt ¡ d ¡ƒS d S )NrQ   )r   Zglobal_cache_dirr
   r-   rD   rE   rJ   r^   r    r    r    r$   Úget_global_cache_path˜   s    ÿýzCacheBase.get_global_cache_pathc                 C   s0   t j ¡ sd S t ¡ | _t ¡ | _t ¡ | _	d S r   )
r<   r>   Zis_availablerJ   r^   r]   r`   Úlocal_cache_pathra   Úglobal_cache_path©Úselfr    r    r$   Ú__init__¡   s
    


zCacheBase.__init__c              	   C   s6   | j  ¡ si S t| j ƒ�}t |¡}W 5 Q R X |d S ©Nr_   )rb   Úis_fileÚopenrY   Úload)re   Zlocal_cache_fpÚlocal_cacher    r    r$   Úget_local_cacheª   s
    
zCacheBase.get_local_cachec                 C   sD   t j | jj¡s"t j| jjdd� t| jtj| j	|dœdd�ƒ d S )NTr+   )r]   r_   é   )Úindent)
r-   rD   Úexistsrb   Úparentr4   Úwrite_atomicrY   rZ   r]   )re   rk   r    r    r$   Úupdate_local_cache±   s    þzCacheBase.update_local_cache)Ú__name__Ú
__module__Ú__qualname__ÚstaticmethodÚ	functoolsÚ	lru_cacher^   r`   ra   rf   rl   rr   r    r    r    r$   rJ   s   s   	rJ   c                   @   s2   e Zd Zee dœdd„Zee edœdd„ZdS )Ú
LocalCache)Úkeysc                 G   s2   |   ¡ }|}|D ]}||kr&|| }q d S q|S r   )rl   )re   rz   r_   Ú	sub_cacheÚkeyr    r    r$   Úlookup»   s    
zLocalCache.lookup)rz   Úvaluec                G   sL   |   ¡ }|}|dd… D ]}| |i ¡ || }q|||d < |  |¡ d S )Nr   éÿÿÿÿ)rl   Ú
setdefaultrr   )re   r~   rz   r_   r{   r|   r    r    r$   Ú	set_valueÇ   s    
zLocalCache.set_valueN)rs   rt   ru   r   Ústrr}   r   r�   r    r    r    r$   ry   º   s   ry   c                   @   s:   e Zd Ze d¡dd„ ƒZeeeege	f dœdd„Z
dS )ÚPersistentCacheNc              	   C   s@   | j d ks| j  ¡ si S t| j ƒ�}t |¡}W 5 Q R X |d S rg   )rc   rh   ri   rY   rj   )re   Zglobal_cache_fpZglobal_cacher    r    r$   Úget_global_cacheÔ   s
    z PersistentCache.get_global_cache)rF   ÚinputsÚ	benchmarkc                    sú   t t| jˆˆƒ}t t| jˆˆƒ}i ‰d‡ ‡‡‡fdd„	}tjsDtjrà|  ¡ }||ƒsötƒ rj||  	¡ |d�söˆ D ]D}	||	ƒˆ|	< | 
ˆi ¡ |ˆ  
ˆi ¡ ˆ|	 |ˆ ˆ |	 ¡ < qn|  |¡ tƒ rö‡fdd„ˆ D ƒ}
||
ƒ ntƒ rö||  	¡ |d� ˆS )a  
        Check to see if we have benchmarked the given choice callers. For each
        choice caller:

            1. Check global_cache[name][inputs][choice], return benchmark if cached.
            2. Check local_cache[name][inputs][choice], return benchmark if cached.
            3.
                a. `max_autotune_gemm=True`: benchmark the choice, update
                    local_cache[name][inputs][choice], and return the benchmark.
                b. `max_autotune_gemm=False`: don't benchmark the choice, return nothing.
        Nc                    s^   d}ˆ D ]B}|  ¡ }||  ˆi ¡ ˆi ¡krB| ˆ ˆ | ˆ|< qd} qLq|rZ||d� |S )z2Check if `cache` contains data for all the choicesTF)Úcached)Úhash_keyr/   )r_   ÚcallbackÚhitÚchoiceZchoice_hash©Úchoicesr…   rF   Útimingsr    r$   Úcheck_cacheó   s    
z+PersistentCache.lookup.<locals>.check_cache)r‰   c                    s   i | ]}|  ¡ ˆ | “qS r    )rˆ   )Ú.0r‹   )rŽ   r    r$   Ú
<dictcomp>  s     z*PersistentCache.lookup.<locals>.<dictcomp>)N)r   r   r]   r   r   Zmax_autotuneZmax_autotune_gemmrl   r   r„   r€   rˆ   rr   )re   r�   rF   r…   r†   Z	log_statsZlog_valsr�   rk   r‹   Ztimings_to_logr    rŒ   r$   r}   Ü   s2    ÿþ

ÿ
zPersistentCache.lookup)rs   rt   ru   rw   rx   r„   r‚   r   r   Úfloatr}   r    r    r    r$   rƒ   Ó   s   

ûrƒ   c                  C   s.   t j tƒ d¡} t j | ¡s*t j| dd� | S )NÚlocksTr+   )r-   rD   rE   r5   ro   r4   )Úlock_dirr    r    r$   Úget_lock_dir   s    r•   r9   ©Úextrac                 C   sH   | }|dkr|d | }dt  t | d¡¡ ¡ ¡d d…  d¡ ¡  S )Nr9   z||ÚcrP   é3   )Úbase64Ú	b32encoderW   rX   r[   ÚdigestÚdecodeÚlower)Úcoder—   Zhashing_strr    r    r$   Ú	code_hash'  s    "ÿÿÿr    )ÚbasenameÚ	extensionÚspecified_dirc                 C   sb   |r(t j |¡r|}q@t j tƒ |¡}nt j tƒ | dd… ¡}t j || › d|› �¡}| ||fS )Né   é   r8   )r-   rD   ÚisabsrE   r5   )r¡   r¢   r£   ÚsubdirrD   r    r    r$   Úget_path3  s    r¨   rŸ   ©Úcontentr—   Ú	hash_typec                 C   s:   |dkst dƒ‚|dkr"t| |ƒS |dkr6tt| ƒƒS d S )N)rŸ   ÚcubinzHash type not supportedrŸ   r¬   )ÚAssertionErrorr    Úreprr©   r    r    r$   Úget_hash?  s
    
r¯   )rª   r¢   r—   r«   r£   c           	      C   sV   t | ||ƒ}t|||ƒ\}}}tj |¡s8tj|dd� tj |¡sNt|| ƒ ||fS )NTr+   )r¯   r¨   r-   rD   ro   r4   rq   )	rª   r¢   r—   r«   r£   r|   r¡   r§   rD   r    r    r$   ÚwriteG  s    
r°   )rD   rª   c              	   C   s€   t |ttfƒstdƒ‚t | ¡} | jdt ¡ › dt	 
¡ › d� }t |tƒrNdnd}| |¡�}| |¡ W 5 Q R X | | ¡ d S )Nz6Only strings and byte arrays can be saved in the cacher8   z.tmpÚwÚwb)Ú
isinstancer‚   Úbytesr­   Úpathlibr
   rp   r-   ÚgetpidÚ	threadingÚ	get_identri   r°   Úrename)rD   rª   Ztmp_pathZ
write_modeÚfr    r    r$   rq   W  s     ÿþ
 rq   c                   @   sÈ   e Zd ZU dZdZeed< dZeed< dZe	ed< dZ
e	ed< dZeed< eed�Zee	 ed	< eed�Zee ed
< eed�Zee	 ed< eed�Zee ed< dZeed< edœdd„Zdd„ ZdS )ÚCompiledFxGraphz!Class holding a compiled FX graphNÚcompiled_artifactÚcurrent_callableÚ	cache_keyÚartifact_pathÚcache_linemap)Údefault_factoryÚdevice_typesÚdevice_idxsÚmutated_inputsÚmutated_input_idxsÚ_boxed_call©Úreturnc                 C   s   |   ¡ |ƒS r   )Úget_current_callable)re   r…   r    r    r$   Ú__call__u  s    zCompiledFxGraph.__call__c                 C   s&   | j d krt tt | ¡¡S | j S d S r   )r½   rw   r   Ú_run_from_cacheÚweakrefÚproxyrd   r    r    r$   rÉ   x  s    
z$CompiledFxGraph.get_current_callable)rs   rt   ru   Ú__doc__r¼   r   Ú__annotations__r½   r¾   r‚   r¿   rÀ   r   r   ÚsetrÂ   r   rÃ   ÚintrÄ   ÚlistrÅ   rÆ   Úboolr   rÊ   rÉ   r    r    r    r$   r»   e  s   
r»   )Úcompiled_graphc                 C   sF   | j d kr<ddlm} | | j| j| jd k	r2| jnd¡j| _ |   |¡S )Nr¤   )ÚPyCodeCacher    )r¼   Z	codecacherÕ   Úload_by_key_pathr¾   r¿   rÀ   Úcall)rÔ   r…   rÕ   r    r    r$   rË   �  s    
ÿûrË   c                  C   sB   t  ¡ rt ¡ S tt jjttfƒr0tt jjƒ} n
t jjf} t	| ƒS r   )
r   Ú	is_fbcoder   Úgccr³   ÚcppÚcxxrÒ   ÚtupleÚcpp_compiler_search)Úsearchr    r    r$   Úcpp_compiler”  s    
rß   r¤   c                 C   s²   | D ] }zz|d krlt jdkr W qt d¡s.W qddlm} tƒ }|tj |d¡t	d�}|� t
ƒ }W 5 Q R X t |dg¡ |W   S  tjttfk
r¢   Y qY qX qt ¡ ‚d S )NÚlinuxZTORCH_INDUCTOR_INSTALL_GXXr   ©ÚFileLockzg++.lock©Útimeoutú	--version)r@   Úplatformr-   ÚgetenvÚfilelockrâ   r•   rD   rE   ÚLOCK_TIMEOUTÚinstall_gcc_via_condaÚ
subprocessÚcheck_outputÚSubprocessErrorÚFileNotFoundErrorÚImportErrorr   ZInvalidCxxCompiler)rÞ   rÛ   râ   r”   Úlockr    r    r$   rÝ   ž  s(    

 ÿ
rÝ   c               	   C   sˆ   t j tƒ d¡} t j | dd¡}t j |¡s„t d¡ t j dd¡}|dkrVt	 
d¡}|dk	r„tj|dd	| › �d
ddddgtjd� |S )z>On older systems, this is a quick way to get a modern compilerrÙ   Úbinzg++zDownloading GCC via condaZ	CONDA_EXEÚcondaNÚcreatez	--prefix=z--channel=conda-forgez--quietz-yz
python=3.8Zgxx)Ústdout)r-   rD   rE   r5   ro   ÚlogÚinfor.   r/   ÚshutilÚwhichrë   Ú
check_callÚPIPE)ÚprefixZcxx_pathrò   r    r    r$   rê   ¹  s*    

ø
õrê   c                   C   s   t  dtƒ ¡S )Nz(gcc|g\+\+))ÚrerÞ   rß   r    r    r    r$   Úis_gccÓ  s    rý   c                  C   s*   t ƒ } t | dg¡ d¡}d| ¡ d kS )Nrå   Úutf8ZAppler   )rß   rë   rì   r�   Ú
splitlines)rÛ   Úversion_stringr    r    r$   Úis_apple_clang×  s    r  c                   @   sŽ   e Zd ZU eed< eed< eed< eejef ed< dZ	dZ
dd„ Zejfejd	œd
d„Zdd„ Zdd„ Zedœdd„Ze d¡dd„ ƒZdS )ÚVecISAÚ
_bit_widthÚ_macroÚ_arch_flagsÚ_dtype_nelementsa[  
#if defined(CPU_CAPABILITY_AVX512) || defined(CPU_CAPABILITY_AVX2)
#include <ATen/cpu/vec/functional.h>
#include <ATen/cpu/vec/vec.h>
#endif

__attribute__((aligned(64))) float in_out_ptr0[16] = {0.0};

extern "C" void __avx_chk_kernel() {
    auto tmp0 = at::vec::Vectorized<float>(1);
    auto tmp1 = tmp0.exp();
    tmp1.store(in_out_ptr0);
}
zG
import torch
from ctypes import cdll
cdll.LoadLibrary("__lib_path__")
c                 C   s   | j S r   )r  rd   r    r    r$   Ú	bit_width  s    zVecISA.bit_width)Údtypec                 C   s
   | j | S r   )r  )re   r  r    r    r$   Ú	nelements  s    zVecISA.nelementsc                 C   s   | j S r   )r  rd   r    r    r$   Úbuild_macro  s    zVecISA.build_macroc                 C   s   | j S r   )r  rd   r    r    r$   Úbuild_arch_flags  s    zVecISA.build_arch_flagsrÇ   c                 C   s   t t| ƒƒS r   )rQ   r‚   rd   r    r    r$   Ú__hash__  s    zVecISA.__hash__Nc           	      C   s  t jjd k	rt jjS ttjdƒ\}}ddlm} tƒ }|t	j
 ||d ¡td�}|�° |d d… d }t t||d| d	�¡}zFt|||ƒ tjtjd
tj d|¡gtjt	jdd tj
¡i–d� W n2 tk
rô } zW Y ¢W 5 Q R £ dS d }~X Y nX W 5 Q R £ dS Q R X d S )NrÚ   r   rá   ú.lockrã   éýÿÿÿÚsoF)Úwarning_allÚvec_isaz-cZ__lib_path__Ú
PYTHONPATHú:)ÚstderrÚenvT)r   rÚ   Z
vec_isa_okr°   r  Ú	_avx_coderè   râ   r•   r-   rD   rE   ré   ÚshlexÚsplitÚcpp_compile_commandÚcompile_filerë   rù   r@   Ú
executableÚ_avx_py_loadr?   ÚDEVNULLr.   Ú	Exception)	re   r|   Ú
input_pathrâ   r”   rð   Úoutput_pathZ	build_cmdÚer    r    r$   Ú__bool__  s:       ÿÿýù
	"zVecISA.__bool__)rs   rt   ru   rÑ   rÏ   r‚   r   r<   r  r  r  r  r’   r	  r
  r  r  rw   rx   r"  r    r    r    r$   r  Þ  s   
r  c                   @   sV   e Zd ZU dZdZdZejdejdej	diZ
edœdd„ZejZeegef ed	< d
S )Ú	VecAVX512i   ZCPU_CAPABILITY_AVX512z0-mavx512f -mavx512dq -mavx512vl -mavx512bw -mfmaé   é    rÇ   c                 C   s   dS )NZavx512r    rd   r    r    r$   Ú__str__A  s    zVecAVX512.__str__r  N©rs   rt   ru   r  r  r  r<   r’   Zbfloat16Zfloat16r  r‚   r&  r  r  r   r   rÏ   r    r    r    r$   r#  :  s   
r#  c                   @   sV   e Zd ZU dZdZdZejdejdej	diZ
edœdd„ZejZeegef ed	< d
S )ÚVecAVX2é   ZCPU_CAPABILITY_AVX2z-mavx2 -mfmaé   r$  rÇ   c                 C   s   dS )NZavx2r    rd   r    r    r$   r&  N  s    zVecAVX2.__str__r  Nr'  r    r    r    r$   r(  G  s   
r(  c                   @   sL   e Zd ZU dZdZdZi Zedœdd„Zdd„ Z	e
jZee
gef ed< d	S )
ÚInvalidVecISAr   r9   rÇ   c                 C   s   dS )NZINVALID_VEC_ISAr    rd   r    r    r$   r&  Z  s    zInvalidVecISA.__str__c                 C   s   dS r%   r    rd   r    r    r$   r"  ]  s    zInvalidVecISA.__bool__r  N)rs   rt   ru   r  r  r  r  r‚   r&  r"  r  r  r   r   rÏ   r    r    r    r$   r+  T  s   
r+  c               
   C   sb   t jdkrg S g } tdƒ�>}| ¡ }tD ]}t|ƒ|kr(|r(|  |¡ q(| W  5 Q R £ S Q R X d S )Nrà   z/proc/cpuinfo)r@   ræ   ri   ÚreadÚsupported_vec_isa_listr‚   Úappend)Zisa_listZ	_cpu_infoZ_cpu_info_contentÚisar    r    r$   Úvalid_vec_isa_listj  s    

r0  c                  C   sP   t ƒ } | stS tjjd kr*| s"t‚| d S | D ]}tjj| ¡ kr.|  S q.tS )Nr   )r0  Úinvalid_vec_isar   rÚ   Zsimdlenr­   r  )Z_valid_vec_isa_listr/  r    r    r$   Úpick_vec_isax  s    
r2  Tc                 C   s   | rdS dS )Nz-shared -fPICr9   r    )Úsharedr    r    r$   Ú
get_shared‰  s    r4  c                 C   s   | rdS dS )Nz-Wallr9   r    )r  r    r    r$   Úget_warning_all_flag�  s    r5  c                   C   s   dS )Nz-std=c++17 -Wno-unused-variabler    r    r    r    r$   Ú	cpp_flags‘  s    r6  c                   C   s   dS )Nz-DTORCH_INDUCTOR_CPP_WRAPPERr    r    r    r    r$   Úcpp_wrapper_flags•  s    r7  c                  C   sV   d} t  ¡ r| S tjdkr$| d7 } nt ¡ dkr:| d7 } n| d7 } t  ¡ sR| d7 } | S )Nz%-O3 -ffast-math -fno-finite-math-onlyÚdarwinz -XclangÚppc64lez -mcpu=nativez -march=nativez	 -fopenmp)r   rØ   r@   ræ   Úmachine)Z
base_flagsr    r    r$   Úoptimization_flags™  s    


r;  c                   C   s   dS )Nz$-D C10_USING_CUSTOM_GENERATED_MACROSr    r    r    r    r$   Úuse_custom_generated_macros±  s    r<  c                  C   s$   t  ¡ rt ¡ } d| › d�S dS d S )Nz-Wp,-fopenmp z( -D C10_USE_GLOG -D C10_USE_MINIMAL_GLOGr9   )r   rØ   r   Ú
openmp_lib)r=  r    r    r$   Úuse_fb_internal_macrosµ  s    r>  c                   C   s   t  ¡ rdS dS d S )Nz	-nostdincr9   )r   rØ   r    r    r    r$   Úuse_standard_sys_dir_headers½  s    r?  c                  C   sJ   z,d} t  |  ¡ ¡ d¡}tt |¡ƒdkW S  t jk
rD   Y dS X d S )Nzconda list llvm-openmp --jsonrþ   r   F)rë   rì   r  r�   ÚlenrY   Úloadsrí   )ÚcommandÚoutputr    r    r$   Úis_conda_llvm_openmp_installedÄ  s    rD  c                  C   s\   z>t  ddg¡ t  dddg¡ d¡ ¡ } tj | ¡}|| fW S  t jk
rV   Y dS X d S )Nrø   Zbrewz--prefixÚlibomprþ   )Fr9   )rë   rì   r�   Ústripr-   rD   ro   rí   )Úlibomp_pathÚomp_availabler    r    r$   Úhomebrew_libompÎ  s    ÿÿ
rI  F©r  c                 C   s  t  ¡ r2dtjkr2dtjkr2tj t ¡ ¡tjd< ddlm	} |rNt  ¡ rNd}d}t
jdk�rŒ| sx|tksx|sxt jj�rŒ| |¡t d¡g }| |¡t d	¡g }g }t  ¡ sØ|d
ddg7 }|dg7 }|sú|dg7 }n"|dg7 }|rú|tj tƒ ¡g7 }| ¡ }|�r^t  ¡ �rT|tk�rTt|ƒ ¡ }	d | ¡ d|	› �d|	› �d|	› d�g¡}n
d|› �}|�r*t  ¡ �rz|dg7 }n|dddg7 }�nž| |¡t d¡g }g }t
jdk�rtƒ  }
t d¡d k	�r<tj t d¡dd¡}tj |¡}|�r(| tj t d¡d¡¡ | tj t d¡d¡¡ n
t d¡ |
�p:|}
|
�rFg ndg}|
�sÔt d¡d k	�rÔt ƒ }
|
�rÔtj t d¡d¡}| tj t d¡d¡¡ | |¡ t !¡ j"dk�rÔtj tj |d ¡¡�rÔd!g}|
�s*t#ƒ \}
}|
�r*| tj |d¡¡ | tj |d¡¡ nt  ¡ �r$dgndg}t  ¡ �r¼| t $¡ ¡ | t %¡ ¡ | t &¡ ¡ | t '¡ ¡ | t (¡ ¡ | t )¡ ¡ | t *¡ ¡ | t +¡ ¡ | t ,¡ ¡ | d¡ d d"d#„ |D ƒ¡}d d$d#„ |D ƒ¡}d d%d#„ |D ƒ¡}||||fS )&NZ	CUDA_HOMEZ	CUDA_PATHr   )Úcpp_extensionTr9   rà   ÚincludeÚLIBDIRZc10r<   Z	torch_cpuÚgompZtorch_pythonZompú z-D CPU_CAPABILITY=z-D CPU_CAPABILITY_z-D HAVE_Z_CPU_DEFINITIONz-Dr>   Zc10_cudaZ
torch_cudar8  Z
OMP_PREFIXzomp.hÚlibz-environment variable `OMP_PREFIX` is invalid.ZCONDA_PREFIXÚx86_64zlibiomp5.dylibZiomp5c                 S   s   g | ]}d | ‘qS )z-Ir    ©r�   Úpr    r    r$   Ú
<listcomp>^  s     z1get_include_and_linking_paths.<locals>.<listcomp>c                 S   s   g | ]}d | ‘qS )z-Lr    rR  r    r    r$   rT  _  s     c                 S   s   g | ]}d | ‘qS )z-lr    rR  r    r    r$   rT  `  s     )-r   rØ   r-   r.   rD   Údirnamer   r>   Ztorch.utilsrK  r@   ræ   r1  rÚ   Zenable_kernel_profileZinclude_pathsÚ	sysconfigr¨   Zlibrary_pathsÚget_config_varÚcpp_prefix_pathr
  r‚   ÚupperrE   r  r  rç   ro   r.  ÚwarningsÚwarnrD  Úunamer:  rI  ZsleefZopenmpZgcc_includeZlibgccZlibgcc_archZlibgcc_backwardÚglibcZlinux_kernelZgcc_install_tools_include)Úinclude_pytorchr  r>   Úaot_moderK  ÚmacrosÚipathsÚlpathsÚlibsÚcaprH  Úheader_pathZ	valid_envZconda_lib_pathrG  r    r    r$   Úget_include_and_linking_pathsâ  sº    ÿþýÿþýü	ÿ


üÿ	




ÿ


rf  c              #   C   s   t ||||ƒ\}}	}
}t ¡ rr|r,| }|}ntj | ¡}tj |¡}tj t ¡ ¡t 	¡ g}d 
dd„ |D ƒ¡}n| }|}d}t dddtƒ › d|› dt|ƒ› dt|ƒ› dtƒ › d|› d|	› d|
› d|› d|› dtƒ › dtƒ › dtƒ › dtƒ › d|› d�¡ ¡ S )	NrO  c                 S   s   g | ]}d | ‘qS )z-Br    rR  r    r    r$   rT  z  s     z'cpp_compile_command.<locals>.<listcomp>r9   z[ \n]+z
            z
            -o z	
        )rf  r   rØ   r-   rD   r¡   rU  r   ÚldZ	glibc_librE   rü   Úsubrß   r4  r5  r6  r;  r<  r>  r?  rF  )ÚinputrC  r  r3  r^  r  r>   r_  ra  rb  rc  r`  Zinp_nameZout_nameZlinker_pathsr    r    r$   r  d  sh    
   ÿÿÿÿþþýýýýýüûúùøýr  c                   @   s4   e Zd Zeƒ ZeejƒZedd„ ƒZedd„ ƒZ	dS )ÚCudaKernelParamCachec                 C   s,   t |ddtjd�\}}||d< || j|< d S )Nr¬   )r«   r£   Z
cubin_path)r°   r   Úaot_inductor_output_pathr_   )Úclsr|   Úparamsr¬   r;   rD   r    r    r$   rÐ   “  s    ü
zCudaKernelParamCache.setc                 C   s   | j  |d ¡S r   )r_   r/   )rl  r|   r    r    r$   r/   ž  s    zCudaKernelParamCache.getN)
rs   rt   ru   Údictr_   rv   ÚclearÚclassmethodrÐ   r/   r    r    r    r$   rj  �  s   


rj  c                   @   s(   e Zd Zeƒ ZeejƒZedd„ ƒZdS )ÚAotCodeCachec                    sD  |rt ntƒ }ttdd||ˆjd�ƒ}t|d|tjd�\‰}ˆˆ jk�r0ddl	m
} tƒ }|tj |ˆd ¡td	�}	|	�² tj |¡d d
 }
tj |
¡�st t||
||ˆjd�¡}t dd |¡¡ zt |¡ W n6 tjk
�r } zt ||j¡|‚W 5 d }~X Y nX nt d|
¡ |
ˆ jˆ< W 5 Q R X ‡ ‡‡fdd„}|S )NÚiÚo)r  r>   r_  rÚ   )r—   r£   r   rá   r  rã   z.so)ri  rC  r  r>   r_  zaot compilation command: %srO  z.aot_inductor dynamic library already exist: %sc                     s:   t ˆjƒdkst‚ˆ jˆ fdd„ tt ˆjƒd ƒD ƒ˜S )Nr   c                 s   s   | ]
}d V  qd S r   r    )r�   rr  r    r    r$   Ú	<genexpr>Ö  s     z=AotCodeCache.compile.<locals>.wrapper_call.<locals>.<genexpr>r¤   )r@  Zgraph_outputsr­   r_   Úrange)r"   ©rl  Úgraphr|   r    r$   Úwrapper_callÔ  s    z*AotCodeCache.compile.<locals>.wrapper_call)r1  r2  r®   r  r_  r°   r   rk  r_   rè   râ   r•   r-   rD   rE   ré   Úsplitextro   r  r  rõ   Údebugrë   rù   ÚCalledProcessErrorr   ÚCppCompileErrorrC  )rl  rw  Úsource_coder>   Úpicked_vec_isaÚcpp_commandr  râ   r”   rð   Z	output_soÚcmdr!  rx  r    rv  r$   Úcompile§  sX        ÿÿü
ûÿ	$ ÿzAotCodeCache.compileN)	rs   rt   ru   rn  r_   rv   ro  rp  r�  r    r    r    r$   rq  £  s   
rq  c               	   C   s<   t tƒjd } |  ¡ �}| ¡ }t|dƒ\}}W 5 Q R X |S )Nzcodegen/cpp_prefix.hÚh)r
   Ú__file__rp   ri   r,  r°   )rD   rº   rª   r;   Úfilenamer    r    r$   rX  ã  s    
þrX  c                  C   s2   t ƒ } t ¡ r"dtj | ¡› d�S d| › d�S d S )Nz
#include "ú")rX  r   rØ   r-   rD   r¡   )r„  r    r    r$   Ú
cpp_prefixï  s    r†  rÇ   c              
   C   sf  t  ¡ rtj | ¡n| }zØt  ¡ rÞtƒ }tj |¡}tj |¡}tj tjj	j
d¡}t ¡ �z}t |tj ||¡¡ t | tj ||¡¡ tj |d¡}	t ||	¡ t|||ƒ}
tj |¡rÆt |¡ t |
|¡ W 5 Q R X ntj|tjd� W np tjk
�r` } zN|j d¡}d|k�p"d|k}|�rBtjdk�rBd}||7 }t ||¡|‚W 5 d }~X Y nX d S )NrL  )r  rP   z'omp.h' file not foundrE  r8  a¢  

OpenMP support not found. Please try one of the following solutions:
(1) Set the `CXX` environment variable to a compiler other than Apple clang++/g++ that has builtin OpenMP support;
(2) install OpenMP via conda: `conda install llvm-openmp`;
(3) install libomp via brew: `brew install libomp`;
(4) manually setup OpenMP and set the `OMP_PREFIX` environment variable to point to a path with `include/omp.h` under it.)r   rØ   r-   rD   r¡   rX  rE   r<   ÚutilsrK  Ú_TORCH_PATHr0   ÚTemporaryDirectoryr÷   ÚcopyÚcopytreer   ro   Úremoverë   rì   ÚSTDOUTr{  rC  r�   r@   ræ   r   r|  )r  r   r€  Z
input_filere  Úheader_nameZoutput_nameZtorch_includes_pathZtmp_dirZdest_include_pathZoutput_file_pathr!  rC  Zopenmp_problemZinstructionr    r    r$   r  û  s8     ÿ

ÿ	r  c                   @   s4   e Zd Zeƒ ZeejƒZedd„ ƒZedd„ ƒZ	dS )ÚCppCodeCachec              
   C   sš   zt  | ¡W S  tk
r” } zjdt|ƒkrRtj d¡rRt  d¡at  | ¡ W Y ¢8S dt|ƒkr‚t|› dt 	¡ › dt 	¡ › d�ƒ|‚‚ W 5 d }~X Y nX d S )NrN  z/usr/lib64/libgomp.so.1z(failed to map segment from shared objectz3.  The most common reason this may occur is if the zl folder is mounted with noexec (e.g., by default Docker mounts tmp file systems as noexec).  Please remount zi with exec enabled, or set another temporary directory with TORCHINDUCTOR_CACHE_DIR environment variable.)
r   ZLoadLibraryÚOSErrorr‚   r-   rD   ro   Z_libgompr0   r1   )rD   r!  r    r    r$   Ú_load_library,  s    
ÿûzCppCodeCache._load_libraryc              	   C   sÒ   t ƒ }ttdd|d�ƒ}t|d|d�\}}|| jkrÈddlm} tƒ }|tj	 
||d ¡td	�}|�^ |d d
… d }	tj	 |	¡s¢t t||	|d�¡}
t||	|
ƒ |  |	¡| j|< || j| _W 5 Q R X | j| S )Nrr  rs  rJ  rÚ   r–   r   rá   r  rã   r  r  )ri  rC  r  )r2  r®   r  r°   r_   rè   râ   r•   r-   rD   rE   ré   ro   r  r  r  r‘  r|   )rl  r}  r~  r  r|   r  râ   r”   rð   r   r€  r    r    r$   rj   ?  s*    
  ÿÿzCppCodeCache.loadN)
rs   rt   ru   rn  r_   rv   ro  r‘  rp  rj   r    r    r    r$   r�  (  s   

r�  c                   @   sv   e Zd ZU eƒ Zeeejf e	d< eƒ Z
eejƒZeddd„ƒZeddd„ƒZeddd	„ƒZee d
¡dd„ ƒƒZd
S )rÕ   r_   r9   c                 C   s   t |d|d�S ©Nr:   r–   )r°   )rl  r}  r—   r    r    r$   r°   ]  s    zPyCodeCache.writer    c                 C   s    t |d|d�\}}|  |||¡S r’  )r°   rÖ   )rl  r}  r—   Úlinemapr|   rD   r    r    r$   rj   a  s    zPyCodeCache.loadc                 C   sÜ   || j krÒt|ƒ�º}zt| ¡ |dƒ}W nB tk
rj } z$td|› dt|ƒj› d|› �ƒ‚W 5 d }~X Y nX t 	t› d|› �¡}||_
||_t||j|jƒ |tj|j< | j  ||¡ tt|Ž ƒ| j|< W 5 Q R X | j | S )NÚexeczFailed to import Ú
z: r8   )r_   ri   r�  r,  r  ÚRuntimeErrorÚtypers   ÚtypesÚ
ModuleTyperƒ  r|   r”  Ú__dict__r@   Úmodulesr€   rÒ   ÚzipÚlinemaps)rl  r|   rD   r“  rº   rŸ   r!  Úmodr    r    r$   rÖ   f  s     

ÿzPyCodeCache.load_by_key_pathNc                 C   sV   || j krd S | j | \}}t||ƒ}|dkr2d S ||d  }|sFd S dd„ }||ƒS )Nr   r¤   c                 S   s"   d}t  || ¡}dd„ t|ƒD ƒS )Nz"File "(.+)", line (\d+), in (.+)\nc                 S   s"   g | ]\}}}|t |ƒ|d œ‘qS ))r„  ÚlinerF   )rÑ   )r�   rº   ÚlÚnr    r    r$   rT  �  s   ÿzPPyCodeCache.stack_frames_for_code.<locals>.parse_stack_trace.<locals>.<listcomp>)rü   ÚfindallÚreversed)Zstack_traceÚregexÚmatchesr    r    r$   Úparse_stack_traceŠ  s
    þz<PyCodeCache.stack_frames_for_code.<locals>.parse_stack_trace)r�  r   )rl  rD   ÚlinenoÚlinesZnodesrS  Úentryr¦  r    r    r$   Ústack_frames_for_code|  s    


z!PyCodeCache.stack_frames_for_code)r9   )r9   r    )r    )rs   rt   ru   rn  r_   r   r   r˜  r™  rÏ   r�  rv   ro  rp  r°   rj   rÖ   rw   rx   rª  r    r    r    r$   rÕ   X  s   

rÕ   c                   @   s(   e Zd Zeƒ ZeejƒZedd„ ƒZdS )ÚCppWrapperCodeCachec                 C   sæ  d|› �}t |ƒ}tj |¡s(t |¡ d}tj ||› d|› �¡}t d|¡ || jk�rÜt d|¡ ddl	m
}	 tƒ }
|	tj |
|d ¡td	�}|��< tj |¡�sht d
|¡ tƒ }tƒ }tƒ }tƒ }ttƒ |d�\}}}}tƒ }tƒ }|› d|› d|› d|› d|› d|› �}|› d|› d|› d�}|› }tjjj|||g|g|g|g|gdd�}t d|¡ n`t d|¡ tj ||¡}|d k	�s�t‚tj |¡}t|jt j!ƒ�s°t‚|j "|¡ t d|¡ || j|< W 5 Q R X | j| S )NZinline_extension_r  r8   zCpp wrapper code path %szCpp wrapper cache miss for %sr   rá   r  rã   zCpp wrapper building %s)r  r>   rO  z                     z -ffast-mathT)rF   Zbuild_directoryZcpp_sourcesZ	functionsÚextra_cflagsÚextra_ldflagsÚextra_include_pathsZuse_pchzCpp wrapper done building %sz(Found target .so, cpp wrapper loading %szCpp wrapper done loading %s)#rI   r-   rD   ro   r4   rE   rõ   rz  r_   rè   râ   r•   ré   r6  r;  r4  r5  rf  r2  r<  r7  r<   r‡  rK  Zload_inlineÚ	importlibÚutilÚspec_from_file_locationr­   Úmodule_from_specr³   Úloaderr	   ÚLoaderÚexec_module)rl  r}  Ú	func_namer|   r>   rF   rH   ÚextÚfilepathrâ   r”   rð   Z
_cpp_flagsZ
_opt_flagsZ_sharedZ_warning_all_flagZ_ipathsZ_lpathsZ_libsZ_macrosZ_use_custom_generated_macrosZ_cpp_wrapper_flagsr¬  r­  r®  rž  Úspecr    r    r$   rj   ›  sd    

þÿø
zCppWrapperCodeCache.loadN)	rs   rt   ru   rn  r_   rv   ro  rp  rj   r    r    r    r$   r«  —  s   
r«  c                   @   s   e Zd Zedd„ ƒZdS )ÚTritonCodeCachec                 C   s   t  |¡}t||ƒS r   )rÕ   rj   Úgetattr)rl  Úkernel_namer}  rž  r    r    r$   rj   ß  s    
zTritonCodeCache.loadN)rs   rt   ru   rp  rj   r    r    r    r$   rº  Þ  s   rº  c                 C   s&   t  |¡ t | |¡}|j|d� d S )N)Zwarm_cache_only_with_cc)r   Z"set_compiler_worker_current_devicerº  rj   Ú
precompile)r¼  r}  ÚccrM   Úkernelr    r    r$   Ú_worker_compileå  s    
rÀ  c                 C   s   t  | |¡}| ¡  |S r   )rº  rj   r½  )r¼  r}  r¿  r    r    r$   Ú_load_kernelë  s    rÁ  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTritonFuturec                 C   s   || _ || _|| _d S r   )r¼  r}  Úfuture)re   r¼  r}  rÃ  r    r    r$   rf   ò  s    zTritonFuture.__init__c                 C   sv   t ƒ }t| dƒr| jS | j ¡  t| j| jƒ }| _t ƒ | }|dkrftd|› d| j› �ƒ t| jƒ | `| `| `|S )Nr¿  é2   z"Detected long compilation time of z seconds for kernel name )	r   Úhasattrr¿  rÃ  ÚresultrÁ  r¼  r}  r   )re   Út0r¿  Zlatencyr    r    r$   rÆ  ø  s    


ÿ
zTritonFuture.resultN)rs   rt   ru   rf   rÆ  r    r    r    r$   rÂ  ñ  s   rÂ  c                   @   sŠ   e Zd Zdd„ Zee d¡dd„ ƒƒZee d¡dd„ ƒƒZe	dd	„ ƒZ
e	d
d„ ƒZe	dd„ ƒZdd„ Zdd„ Zeeef dœdd„ZdS )ÚAsyncCompilec                 C   s   d S r   r    rd   r    r    r$   rf   
  s    zAsyncCompile.__init__r¤   c                   C   s   t jdkst‚tt jƒS ©Nr¤   )r   Úcompile_threadsr­   r   r    r    r    r$   Úpool  s    zAsyncCompile.poolc                     s^   t  ¡  tjdkst‚t ¡ ‰ ‡ fdd„} t d¡}t	tj|| d�}tj
jd |jtjd� |S )Nr¤   c                     s$   ‡ fdd„} t | dd�at ¡  d S )Nc                      s,   t dƒ ˆ t ¡ kr t t ¡ tj¡ q d S rÉ  )r   r-   ÚgetppidÚkillr¶   ÚsignalÚSIGKILLr    ©Z	orig_ppidr    r$   Úrun#  s    z4AsyncCompile.process_pool.<locals>.init.<locals>.runT)ÚtargetÚdaemon)r   Z_watchdog_threadÚstart)rÑ  rÐ  r    r$   Úinit"  s    z'AsyncCompile.process_pool.<locals>.initÚfork)Z
mp_contextZinitializer)Zexitpriority)r   Z_propertiesr   rÊ  r­   r-   r¶   ÚmultiprocessingZget_contextr   r°  ZFinalizeÚshutdownr@   Úmaxsize)rÕ  Zfork_contextrË  r    rÐ  r$   Úprocess_pool  s    
  ÿzAsyncCompile.process_poolc                 C   sZ   t jdkrd S tƒ  |  ¡ }t|dƒr0| ¡  n tt jƒD ]}| ¡  q:| ¡  t	ƒ  d S )Nr¤   Ú_start_queue_management_thread)
r   rÊ  r'   rÚ  rÅ  rÛ  ru  Z_adjust_process_countZ_start_executor_manager_threadr*   )rl  rË  r;   r    r    r$   Ú	warm_pool:  s    



zAsyncCompile.warm_poolc                 C   s   t jdkr|ƒ S |  ¡  |¡S rÉ  )r   rÊ  rË  Úsubmit)rl  Útaskr    r    r$   rÝ  W  s    
zAsyncCompile.submitc                    sB   t jdkst|ƒdkr$ttˆ|ƒƒS dd„ ‡ ‡fdd„|D ƒD ƒS )Nr¤   c                 S   s   g | ]}|  ¡ ‘qS r    )rÆ  )r�   Útr    r    r$   rT  a  s     z$AsyncCompile.map.<locals>.<listcomp>c                    s   g | ]}ˆ   ¡  ˆ|¡‘qS r    )rË  rÝ  )r�   Úx©rl  Úfnr    r$   rT  a  s     )r   rÊ  r@  rÒ   Úmap)rl  râ  Úseqr    rá  r$   rã  ]  s    zAsyncCompile.mapc                 C   sd   t ƒ  tjdkrVtj ¡ \}}tj ¡ }|d | }|  ¡  t	||||¡}t
|||ƒS t||ƒS d S )Nr¤   é
   )r'   r   rÊ  r<   r>   Zget_device_capabilityrT   rÚ  rÝ  rÀ  rÂ  rÁ  )re   r¼  r}  rB   rC   rM   r¾  rÃ  r    r    r$   rK   c  s    

    ÿzAsyncCompile.tritonc                    s   ‡ fdd„}|   |¡S )Nc                      s   t  ˆ ¡jS r   )r�  rj   r¿  r    ©r}  r    r$   rÞ  r  s    zAsyncCompile.cpp.<locals>.task)rÝ  )re   r}  rÞ  r    ræ  r$   rÚ   q  s    zAsyncCompile.cpp)Úscopec                 C   sŒ   t dd„ | ¡ D ƒƒ}t|dtjdd�}tjdkr‚| ¡ D ]F\}}tjr\t|tƒs\| 	|¡ t|t
tfƒr:| ¡ ||< | d¡ q:tƒ  d S )Nc                 S   s"   g | ]\}}t |ttfƒr|‘qS r    )r³   r   rÂ  )r�   r|   r~   r    r    r$   rT  y  s   þz%AsyncCompile.wait.<locals>.<listcomp>zInductor Compilationr   )ÚtotalÚdescÚdisableÚdelayr¤   )r@  Úitemsr   r   Zdisable_progressrÊ  Zverbose_progressr³   r   Zset_postfix_strr   rÂ  rÆ  Úupdater*   )re   rç  Znum_kernelsZpbarr|   rÆ  r    r    r$   Úwaitw  s&    þÿü

zAsyncCompile.waitN)rs   rt   ru   rf   rv   rw   rx   rË  rÚ  rp  rÜ  rÝ  rã  rK   rÚ   r   r‚   r   rî  r    r    r    r$   rÈ  	  s    %


rÈ  )r9   )r9   )r9   rŸ   )r9   rŸ   r9   )T)T)‡rš   Údataclassesrw   r2   rW   r¯  rY   Úloggingr×  r-   rµ   ræ   rü   r  r÷   rÎ  rë   r@   rV  r0   r·   r˜  rZ  rÌ   Úbisectr   Úconcurrent.futuresr   r   r   Úctypesr   r   r   r	   r
   r   r   r   Útypingr   r   r   r   r   r   r<   Ztorch._inductorr   r   r   Ztorch._inductor.utilsr   Z	torch.hubr   r   rD   Úabspathrƒ  Z_HERErU  rˆ  rØ   Z	triton.fbr   Ztriton.fb.buildr   Ztorch._inductor.fb.utilsr   r   r   ré   r(   r&   r'   r*   Ú	getLoggerrs   rõ   rx   r5   rI   rJ   ry   rƒ   r•   r‚   r    r¨   r´   r¯   r°   rq   Ú	dataclassr»   rË   rß   rÝ   rê   rý   r  r  r#  r(  r+  r1  r-  r0  r2  r4  r5  r6  r7  r;  r<  r>  r?  rD  rI  rf  r  rj  rq  rX  r†  r  r�  rÕ   r«  rº  rÀ  rÁ  rÂ  rÈ  rÜ  r    r    r    r$   Ú<module>   s   
	

GM   û
û


\



	
   ÿÿ øú+@
-0?G 