a
    d[                     @   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mZmZ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 d dl Z d dl!m"Z"m#Z# d dl$m%Z% d	d
l&m'Z'm(Z(m)Z) d	dl*m+Z+ dZ,d a-da.dd Z/dd Z0e1e2Z3e1d4e'j5r^ej6nej7 e8ddd Z9G dd dZ:dd Z;dd Z<dd Z=dWddZ>e?e?dd d!Z@d"d# ZAe8d	d$d% ZBd&d' ZCd(d) ZDG d*d+ d+ZEejFG d,d- d-eEZGejFG d.d/ d/eEZHG d0d1 d1eEZIeI ZJeG eH gZKe8dd2d3 ZLd4d5 ZMdXd7d8ZNdYd9d:ZOd;d< ZPd=d> ZQd?d@ ZRdAeJfeEdBdCdDZSd6d6dAeJfeEdBdEdFZTG dGdH dHZUG dIdJ dJZVG dKdL dLZWdMdN ZXdOdP ZYdQdR ZZG dSdT dTZ[G dUdV dVZ\e\]  dS )Z    N)FutureProcessPoolExecutorThreadPoolExecutor)cdll)Thread)sleeptime)AnyCallableDictList)	_Faketqdmtqdm)cpp_extension   )configcuda_propertiesexc)developer_warningiX  c                   C   s   t d u rt a d S N)_t0r    r   r   b/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/torch/_inductor/codecache.py_compile_start&   s    r   c                  C   s"   t d urt } t| t  7 ad a d S r   )r   r   _cumulative_compile_time)t1r   r   r   _compile_end,   s    r   filelockc                   C   s    t jdt  dt  S )NZTORCHINDUCTOR_CACHE_DIRz/torchinductor_)osenvirongettempfile
gettempdirgetpassgetuserr   r   r   r   	cache_dir9   s    r%   c                       s`   e Zd Zeeddd Zeeddd Z fddZe	e
g e	f d	d
dZ  ZS )	DiskCacheNc                  C   s"   t jt d} t j| dd | S )NZcached_tuningsTexist_ok)r   pathjoinr%   makedirs)subdirr   r   r   _subdirB   s    zDiskCache._subdiri   c                 C   s<   t | d}t| W  d    S 1 s.0    Y  d S )Nr)openjsonloadsread)r)   fdr   r   r   
_read_fileI   s    zDiskCache._read_filec                    s   t    || _d S r   )super__init__unique_name)selfr7   	__class__r   r   r6   O   s    
zDiskCache.__init__)keygeneratec                 C   sL   t j|  t| jt| }t j|sB| }t|t	
| | |S )zo
        Check if we have already generated key, if not call generate()
        to populate the cache.
        )r   r)   r*   r-   	code_hashr7   reprexistswrite_atomicr0   dumpsr4   )r8   r;   r<   r)   valuer   r   r   lookupS   s
     zDiskCache.lookup)__name__
__module____qualname__staticmethod	functools	lru_cacher-   r4   r6   r	   r
   rC   __classcell__r   r   r9   r   r&   A   s   r&   c                  C   s.   t jt d} t j| s*t j| dd | S )NlocksTr'   )r   r)   r*   r%   r?   r+   )lock_dirr   r   r   get_lock_dir_   s    rM   c                 C   s0   dt t| d d d d  S )Nczutf-83   )base64	b32encodehashlibsha256encodedigestdecodelower)coder   r   r   r=   f   s    "r=   c                 C   sF   t | | }tjt |dd }tj|| d| }|||fS )Nr      .)r=   r   r)   r*   r%   source_codeextextrabasenamer,   r)   r   r   r   get_code_patho   s    r`    c                 C   sJ   t | ||\}}}tj|s,tj|dd tj|sBt||  ||fS )NTr'   )r`   r   r)   r?   r+   r@   r[   r   r   r   writev   s    
rb   )r)   r\   c                 C   s^   t jtj| d\}}t|d}|| W d    n1 sD0    Y  t||  d S )Ndirw)r!   mkstempr   r)   dirnamefdopenrb   rename)r)   r\   r3   Ztmp_pathfr   r   r   r@      s    (r@   c                  C   s2   t tjjttfr ttjj} n
tjjf} t| S r   )
isinstancer   cppcxxlisttuplecpp_compiler_search)searchr   r   r   cpp_compiler   s    
rr   c                 C   s   | D ]}z|d u rt jdkr W qtds.W qddlm} t }|tj|dt	d}| t
 }W d    n1 sv0    Y  t|dg |W   S  tjttfy   Y qY q0 qt d S )NlinuxZTORCH_INDUCTOR_INSTALL_GXXr   FileLockzg++.locktimeoutz	--version)sysplatformr   getenvr   ru   rM   r)   r*   LOCK_TIMEOUTinstall_gcc_via_conda
subprocesscheck_outputSubprocessErrorFileNotFoundErrorImportErrorr   ZInvalidCxxCompiler)rq   rm   ru   rL   lockr   r   r   rp      s&    

$
rp   c               	   C   s   t jt d} t j| dd}t j|std t jdd}|du rVt	
d}|durt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 compilerZgccbinzg++zDownloading GCC via condaZ	CONDA_EXEcondaNcreatez	--prefix=z--channel=conda-forgez--quietz-yz
python=3.8Zgxx)stdout)r   r)   r*   r%   r?   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\+\+))rerq   rr   r   r   r   r   is_gcc   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   r8   r   r   r   	bit_width   s    zVecISA.bit_width)dtypec                 C   s
   | j | S r   )r   )r8   r   r   r   r   	nelements   s    zVecISA.nelementsc                 C   s   | j S r   )r   r   r   r   r   build_macro   s    zVecISA.build_macroc                 C   s   | j S r   )r   r   r   r   r   build_arch_flags   s    zVecISA.build_arch_flagsreturnc                 C   s   t t| S r   )hashstrr   r   r   r   __hash__   s    zVecISA.__hash__Nc           	      C   s   t tjddd\}}ddlm} t }|tj||d t	d}| |d d d	 }t
||d
| dd}z4tj|tjd tjddtjd|gtjd W n2 ty } zW Y d }~W d    d
S d }~0 0 W d    dS 1  s0    Y  d S )Nrl   ra   r^   r   rt   .lockrv   soF)warning_allvec_isa stderrpythonz-cZ__lib_path__T)rb   r   	_avx_coder   ru   rM   r   r)   r*   r{   cpp_compile_commandsplitr}   r~   STDOUTr   _avx_py_loadreplaceDEVNULL	Exception)	r8   r;   
input_pathru   rL   r   output_pathZ	build_cmder   r   r   __bool__   s.    
$zVecISA.__bool__)rD   rE   rF   int__annotations__r   r   torchr   r   r   r   floatr   r   r   r   rH   rI   r   r   r   r   r   r      s   
r   c                   @   sP   e Zd ZU dZdZdZ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   r   r   r   r   __str__"  s    zVecAVX512.__str__r   NrD   rE   rF   r   r   r   r   r   Zbfloat16r   r   r   r   r   r
   r	   r   r   r   r   r   r     s   
r   c                   @   sP   e Zd ZU dZdZdZ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   r   r   r   r   r   /  s    zVecAVX2.__str__r   Nr   r   r   r   r   r   (  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   ra   r   c                 C   s   dS )NZINVALID_VEC_ISAr   r   r   r   r   r   ;  s    zInvalidVecISA.__str__c                 C   s   dS )NFr   r   r   r   r   r   >  s    zInvalidVecISA.__bool__r   N)rD   rE   rF   r   r   r   r   r   r   r   r   r   r
   r	   r   r   r   r   r   r   5  s   
r   c                  C   sn   t jdkrg S g } td@}| }tD ]}t||v r(|r(| | q(| W  d    S 1 s`0    Y  d S )Nrs   z/proc/cpuinfo)rx   ry   r/   r2   supported_vec_isa_listr   append)Zisa_listZ	_cpu_infoZ_cpu_info_contentisar   r   r   valid_vec_isa_listK  s    

r   c                  C   sP   t  } | stS tjjd u r*| s"J | d S | D ]}tjj| kr.|  S q.tS )Nr   )r   invalid_vec_isar   rl   Zsimdlenr   )Z_valid_vec_isa_listr   r   r   r   pick_vec_isaY  s    
r   Tc                 C   s   | rdS dS )Nz-shared -fPICra   r   )sharedr   r   r   
get_sharedj  s    r   c                 C   s   | rdS dS )Nz-Wallra   r   )r   r   r   r   get_warning_all_flagn  s    r   c                   C   s   dS )Nz-std=c++17 -Wno-unused-variabler   r   r   r   r   	cpp_flagsr  s    r   c                  C   s$   d} t jdkr| d7 } n| d7 } | S )Nz%-O3 -ffast-math -fno-finite-math-onlydarwinz -Xclang -fopenmpz -march=native -fopenmp)rx   ry   )Z
base_flagsr   r   r   optimization_flagsv  s
    

r   c                   C   s   dS )Nz$-D C10_USING_CUSTOM_GENERATED_MACROSr   r   r   r   r   use_custom_generated_macros  s    r   Fr   c                 C   sZ  t jdkrf| s|tkstjjrft t	dg }t
 tdg }g d}| }|rdd| }nt t	dg }g }d}t jdkrdg}td	d urtjtd	d
}|tjtd	d || t jdkrtjtj|drdg}ndg}ddd |D }ddd |D }ddd |D }||||fS )Nrs   includeLIBDIR)Zc10r   Z	torch_cpuZtorch_pythongompz-Dra   r   ZompZCONDA_PREFIXlibx86_64zlibiomp5.dylibZiomp5r   r   c                 S   s   g | ]}d | qS )z-Ir   .0pr   r   r   
<listcomp>      z1get_include_and_linking_paths.<locals>.<listcomp>c                 S   s   g | ]}d | qS )z-Lr   r   r   r   r   r     r   c                 S   s   g | ]}d | qS )z-lr   r   r   r   r   r     r   )rx   ry   r   r   rl   Zenable_kernel_profiler   Zinclude_paths	sysconfigget_pathZlibrary_pathsget_config_varr   r   rz   r)   r*   r   unamemachiner?   )include_pytorchr   ipathslpathslibsmacrosZconda_lib_pathr   r   r   get_include_and_linking_paths  s>    

r   c           
      C   s~   t ||\}}}}	tdddt  d|  dt| dt| dt  d| d| d| d|	 dt  dt  d| d	 S )Nz[ \n]+r   z
            z
            -oz	
        )
r   r   subrr   r   r   r   r   r   strip)
inputoutputr   r   r   r   r   r   r   r   r   r   r   r     s@    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y } zvdt|v rTtjdrTt dat | W  Y d }~S dt|v rt| dt	  dt	  d| W Y d }~n
d }~0 0 d S )Nr   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   LoadLibraryOSErrorr   r   r)   r?   Z_libgompr!   r"   )r)   r   r   r   r   _load_library  s    
zCppCodeCache._load_libraryc                 C   s"  t  }t|dtdd|dd\}}|| jvrddlm} t }|tj	||d t
d	}| |d d
 d }tj|st|||dd}	ztj|	tjd W n6 tjy }
 zt|	|
j|
W Y d }
~
n
d }
~
0 0 | || j|< || j| _W d    n1 s0    Y  | j| S )Nrl   ior   r   r   rt   r   rv   r   r   )r   r   r   r   r   )r   rb   r   cacher   ru   rM   r   r)   r*   r{   r?   r   r}   r~   r   CalledProcessErrorr   ZCppCompileErrorr   r   r;   )clsr\   Zpicked_vec_isar;   r   ru   rL   r   r   cmdr   r   r   r   load  s2    
&,zCppCodeCache.loadN)
rD   rE   rF   dictr   rG   clearr   classmethodr   r   r   r   r   r     s   

r   c                   @   s(   e Zd Ze ZeejZedd ZdS )PyCodeCachec                 C   s   t |d\}}|| jvrt|^}t| |d}tt d| }||_||_	t
||j|j | j|| W d    n1 s0    Y  | j| S )NpyexecrZ   )rb   r   r/   compiler2   types
ModuleTyperD   __file__r;   r   __dict__
setdefault)r   r\   r;   r)   rj   rX   modr   r   r   r     s    

,zPyCodeCache.loadN)	rD   rE   rF   r   r   rG   r   r   r   r   r   r   r   r     s   
r   c                   @   s$   e Zd Zedd Zedd ZdS )TritonCodeCachec                 C   s   dd t | D \}|S )Nc                 S   s   g | ]}| d r|qS )Ztriton_)
startswith)r   nr   r   r   r     r   z,TritonCodeCache.get_name.<locals>.<listcomp>rc   )r  namer   r   r   get_name  s    zTritonCodeCache.get_namec                 C   s   t |}t|| |S r   )r   r   getattrr  )r   r\   r  r   r   r   r     s    
zTritonCodeCache.loadN)rD   rE   rF   rG   r  r   r   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  r   
precompile)r\   ccdevicekernelr   r   r   _worker_compile"  s    

r  c                 C   s   t | }|  |S r   )r  r   r  )r\   r  r   r   r   _load_kernel(  s    
r  c                 C   s   t t| S r   )r  r  r   r   r\   r   r   r   _load_kernel_name.  s    r  c                   @   s   e Zd Zdd Zdd ZdS )TritonFuturec                 C   s   || _ || _d S r   )r\   future)r8   r\   r  r   r   r   r6   3  s    zTritonFuture.__init__c                 C   sv   t  }t| dr| jS | j  t| j }| _t  | }|dkrjt| j}td| d|  t| j | `| `|S )Nr  2   z"Detected long compilation time of z seconds for kernel name )	r   hasattrr  r  resultr  r\   r  r   )r8   t0r  Zlatencyr  r   r   r   r  8  s    




zTritonFuture.resultN)rD   rE   rF   r6   r  r   r   r   r   r  2  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   r   r   r   r   r6   K  s    zAsyncCompile.__init__r   c                   C   s   t jdksJ tt jS Nr   )r   compile_threadsr   r   r   r   r   poolN  s    zAsyncCompile.poolc                     s^   t   tjdksJ 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killgetpidsignalSIGKILLr   Z	orig_ppidr   r   rund  s    z4AsyncCompile.process_pool.<locals>.init.<locals>.runT)targetdaemon)r   Z_watchdog_threadstart)r   r  r   r   initc  s    z'AsyncCompile.process_pool.<locals>.initfork)Z
mp_contextZinitializer)Zexitpriority)r   Z_propertiesr   r  r   r  multiprocessingZget_contextr   utilZFinalizeshutdownrx   maxsize)r$  Zfork_contextr  r   r  r   process_poolT  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+  rangeZ_adjust_process_countZ_start_executor_manager_threadr   )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)r   taskr   r   r   r/    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   r     r   z$AsyncCompile.map.<locals>.<listcomp>c                    s   g | ]}   |qS r   )r  r/  )r   xr   fnr   r   r     r   )r   r  lenrn   map)r   r4  seqr   r3  r   r6    s    zAsyncCompile.mapc                 C   s^   t   tjdkrRtj \}}tj }|d | }|  t	|||}t
||S t|S d S )Nr   
   )r   r   r  r   ZcudaZget_device_capabilityZcurrent_devicer*  r/  r  r  r  )r8   r\   majorminorr
  r	  r  r   r   r   triton  s    


zAsyncCompile.tritonc                    s    fdd}|  |S )Nc                      s   t  jS r   )r   r   r  r   r  r   r   r0    s    zAsyncCompile.cpp.<locals>.task)r/  )r8   r\   r0  r   r  r   rl     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   )rk   r   r  )r   r;   rB   r   r   r   r     s   z%AsyncCompile.wait.<locals>.<listcomp>zInductor Compilationr   )totaldescdisabledelayr   )r5  itemsr   r   Zdisable_progressr  Zverbose_progressrk   r   Zset_postfix_strr   r  r  updater   )r8   r<  Znum_kernelsZpbarr;   r  r   r   r   wait  s&    

zAsyncCompile.waitN)rD   rE   rF   r6   rG   rH   rI   r  r*  r   r.  r/  r6  r;  rl   r   r   r	   rC  r   r   r   r   r  J  s    %


r  )ra   )T)T)^rP   ZdataclassesrH   r#   rR   r0   loggingr&  r   r   r   r  r}   rx   r   r!   r   concurrent.futuresr   r   r   ctypesr   	threadingr   r   r   typingr	   r
   r   r   r   Z	torch.hubr   r   Ztorch.utilsr   ra   r   r   r   utilsr   r{   r   r   r   r   	getLoggerrD   r   setLeveldebugDEBUGINFOrI   r%   r&   rM   r=   r`   rb   r   r@   rr   rp   r|   r   r   Z	dataclassr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r.  r   r   r   r   <module>   s   	
 
	
	
S


35 