
    ȅiL                        S r SSKrSSKrSSKrSSKrSSKrSSKrSSKJr  SSK	J
r
  SSKJr  SSKJrJr  SSKrSSKJr  SS	KJrJr  SS
KJr  \R.                  " \5      r\\SS.S\R4                  S\\R8                     S\\\\4      S\S\4   4S jj5       5       r\R>                  " \SS9r \R>                  " \SS9r!S\"4S jr#\RH                  S\4S j5       r%g)a*  
This module provides TVM backend integration for TorchDynamo.

Apache TVM is a deep learning compiler framework that can optimize and execute
models on various hardware backends. This module enables:

- Compilation of PyTorch models to TVM's computation graphs
- Multiple scheduling options:
  - Default scheduler
  - Auto-scheduler for automatic optimization
  - Meta-schedule for evolutionary search-based tuning
- Hardware-specific optimizations:
  - CUDA GPU support
  - CPU support with LLVM targeting and architecture-specific tuning
  - Automatic detection of CPU capabilities (AVX2, AVX512)
- Tensor conversion utilities between PyTorch and TVM formats
- Configurable optimization levels and tuning trials

The backend can be used with torch.compile():
    model = torch.compile(model, backend="tvm")
    N)Callable)Path)MappingProxyType)AnyOptional)fx   )device_from_inputsfake_tensor_unsupported)register_backend)optionsgmexample_inputsr   return.c                d  ^^^^ Uc  [        S SSS.5      nUc   eSS KmSSKJn  SSKJn  [
        R                  R                  X5      n[        U5      n[        U5       VVs/ s H  u  pxSU 3UR                  4PM     n	nnU " U6 n
[        U
5      S:X  a!  [        R                  S5        U R                  $ UR                  R!                  XY5      u  pUR"                  S	:X  a6  TR%                  UR&                  5      nTR(                  R%                  5       nO4TR+                  S5      nTR(                  R-                  [/        5       5      nUR1                  S
S 5      nUc   [2        R4                  R1                  SS 5      nUR1                  SS5      nUR1                  SS5      nUS:X  au  SSKJn  [8        R:                  " 5        nUR=                  U5         TR>                  RA                  USS0S9   URC                  XUS9nS S S 5        S S S 5        S S S 5        GO
US:X  a  SSKJ"n  [8        RF                  " 5        nUR"                  S	:w  a?  TR(                  R-                  [/        5        SURH                  RK                  SS9 35      nUS:  d   eURL                  RO                  UUUUSUSUS9nURL                  RQ                  UUUUUS9nS S S 5        OKUS:X  d  U(       d3  TR>                  RA                  US9   URC                  XUS9nS S S 5        O[S        S5      eURU                  WS   " U5      5      mS TRV                  RX                  S![
        RZ                  4S" jmS#[
        RZ                  S!TRV                  RX                  4U4S$ jjmS%[
        RZ                  S![\        [
        RZ                     4UUU4S& jjnU$ s  snnf ! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       GN= f)'Ni N     )	schedulertrials	opt_levelr   )relay)graph_executorinp_z0Explicitly fall back to eager due to zero outputcudar   TVM_SCHEDULERr   r   auto_scheduler)r   z relay.backend.use_auto_schedulerT)r   config)targetparamsmeta_schedule)r   z --num-cores F)logical@   evolutionary)modr   work_dirmax_trials_globalnum_trials_per_iterr   strategyr   )databaser#   r   r   r   default)r   zThis tuning option is invalid/not implemented for torchdynamo's TVM-related backend. There are three available options: default, auto_scheduler and meta_schedule.	nd_tensorr   c                     U R                   S:X  a$  [        R                  " U R                  5       5      $ [        R                  R
                  R                  U R                  5       5      $ )z8A helper function to transfer a NDArray to torch.tensor.bool)dtypetorch
from_numpynumpyutilsdlpackfrom_dlpack	to_dlpack)r*   s    T/home/james-whalen/.local/lib/python3.13/site-packages/torch/_dynamo/backends/tvm.pyto_torch_tensortvm.<locals>.to_torch_tensor   sL    ??f$ ##IOO$566{{!!--i.A.A.CDD    torch_tensorc                    > U R                   [        R                  :X  a7  TR                  R	                  U R                  5       R                  5       5      $ TR                  R                  U 5      $ )z8A helper function to transfer a torch.tensor to NDArray.)r-   r.   r,   ndarraycpur0   r3   )r9   tvms    r5   to_tvm_tensortvm.<locals>.to_tvm_tensor   sQ    + 66<< 0 0 2 8 8 :;;vv!!,//r8   i_argsc                  x  > U  Vs/ s H  oR                  5       PM     nnTR                  5       u  p4UR                  5        VVs1 s H  u  pTUiM	     nnn[        US5       Hv  u  pxUR	                  5       S:w  d  M  UR
                  (       a  UR                  5       nSU 3n	X;  a  [        R                  SU	5        M^  TR                  U	T" U5      5        Mx     TR                  5         [        TR                  5       5       V
s/ s H  n
T" TR                  U
5      5      PM     sn
$ s  snf s  snnf s  sn
f )Nr   r   z6input %s skipped as not found in tvm's runtime library)
contiguousget_input_infoitems	enumeratedimrequires_graddetachlogwarning	set_inputrunrangeget_num_outputs
get_output)rA   aargs
shape_info_nameactive_inputsidxarginp_nameimr6   r?   s              r5   exec_tvmtvm.<locals>.exec_tvm   s
   (./1/((*
-7-=-=-?@-?'$-?@!$*HCwwyA~$$**,C!#<0KKP  !#& + 	
:?@Q@Q@S:TU:TQQ0:TUU' 0@" Vs   D,D1!D7)/r   r>   r   tvm.contribr   r.   jittracer
   rF   shapelenrJ   rK   forwardfrontendfrom_pytorchtyper   indexr   r=   Targetllvm_targetgetosenvironr   tempfileNamedTemporaryFileApplyHistoryBest	transformPassContextbuildr   TemporaryDirectoryr1   	cpu_countrelay_integration
tune_relaycompile_relayNotImplementedErrorGraphModuler;   r<   Tensorlist)r   r   r   r   r   jit_moddevicerW   rZ   
shape_listexample_outputsr#   r   devr   r   r   r   r   log_filelibmsr$   r(   r\   r[   r6   r?   r>   s                            @@@@r5   r>   r>   ,   s    "UV#WX*iioob1G/F8A.8QR8QfcT#<)8QJR.)O
?q FGzz..--gBKC{{fhhv||$"ggaj"";=1K.IJJNN?D9	[[5)FK+I$$& '')X++H5MM%%#-OQU,V &  ++c+@C	 6 *) 
o	%+((*h{{f$ **"}o]2883E3Ee3E3T2UV
 A::++66!"($&'# 7 	H &&44!# 5 C) +*6 
i	y]]&&&;++c+@C <; "\
 	
 	""3y>##67AE366<< EELL E0ELL 0SVV\\ 0V%,, V4+= V V, Oc S6  65 *) +*: <;s[   $O
O>O,9O
O,O>BP	P 
O)$O,,
O;	6O>>
P
P 
P/r   )r   r   c                  R     [         R                  " S5        g! [         a     gf = f)Nr>   TF)	importlibimport_moduleImportError r8   r5   has_tvmr      s*    & s    
&&c                  z    [         R                  S:X  a'  [        S5      R                  5       n SU ;   a  gSU ;   a  gg)Nlinuxz/proc/cpuinfoavx512zllvm -mcpu=skylake-avx512avx2zllvm -mcpu=core-avx2llvm)sysplatformr   	read_text)cpuinfos    r5   ri   ri      s:    
||w'113w.w)r8   )&__doc__	functoolsr   loggingrk   r   rm   collections.abcr   pathlibr   typesr   typingr   r   r.   r   commonr
   r   registryr   	getLogger__name__rJ   ry   r{   rz   strr>   partialtvm_meta_scheduletvm_auto_schedulerr,   r   cacheri   r   r8   r5   <module>r      s  ,    	 
  $  "     ? & ! 
 59	@
@&@ &sCx01	@
 c3h@  @F %%c_E &&s6FG   S  r8   