Ë
    P/æjéï ã                  óÖ
  — U d dl m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 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%m&Z& d d
l'm(Z( d dl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 d dl9m:Z: d dl;Z;d dl<m=Z> d dl;m?Z?m@Z@ d dlAmBZBmCZCmDZD d dlEmFZFmGZGmHZH d dlImJZJ d dlKmLZLmMZM d dlNmOZO ddlPmQZQ  e7d«      ZRe6rd dlSmTZT ddlUmVZVmWZW 	 d dlXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZa d dlbmcZc d dldmeZemfZfmgZg d dlhmiZimjZjmkZk d dllmmZmmnZn d dlompZpmqZqmrZrmsZsmtZtmuZumvZv d dlwmxZx d dlymzZzm{Z{m|Z| d d l}m~Z~mZm€Z€ e6rd d!l�m‚Z‚ d d"lƒm„Z„ d d#l…m†Z† d d$l‡mˆZˆm‰Z‰ e�j                  �j                  eŒ«      Z�e�j                  �j                  e�j                  �j                  e�«      «      Z�e�j                  �j!                  e�d%«      Z‘e�j$                  d&k(  Z“ eF�j(                  «       rd d'l•m–Z– d d(l—m˜Z˜ d d)l™mšZšm›Z›mœZœm�Z� nd‹d*„Zšd‹d+„Z›d‹d,„ZœdŒd-„Z�e;�j<                  �j?                  e d.«      Z¡d/Z¢e�j$                  d&k(  Z“ e
�jF                  e «      Z¤d�d0„Z¥dŽd1„Z¦ G d2„ d3«      Z§ G d4„ d5e§«      Z¨ G d6„ d7e§«      Z©dŽd8„Zªd�d9„Z«d�d‘d:„Z¬	 d�	 	 	 	 	 	 	 d’d;„Z­	 d“	 	 	 	 	 	 	 d”d<„Z®	 	 	 d•	 	 	 	 	 	 	 	 	 	 	 d–d=„Z¯d—d>„Z°	 	 d˜	 	 	 	 	 	 	 	 	 d™d?„Z±e�jd                   G d@„ dA«      «       Z³dšdB„Z´	 	 	 	 	 	 d›dC„Zµ	 	 	 	 	 	 dœdD„Z¶	 	 	 	 	 	 d�dE„Z·dždF„Z¸dŸdG„Z¹ G dH„ dIe�jt                  «      Z»	 	 	 	 	 	 	 	 d dJ„Z¼ e�jz                  d«      d¡dK„«       Z¾dŽdL„Z¿e�jd                   G dM„ dN«      «       ZÀ G dO„ dPeÁ«      ZÂ G dQ„ dR«      ZÃ	 	 	 	 	 	 	 	 	 	 d¢dS„ZÄ	 	 	 	 	 	 	 	 d£dU„ZÅ	 	 	 	 	 	 	 	 d¤dV„ZÆd¥dW„ZÇ G dX„ dY«      ZÈeÉZÊdZeËd[<   e�jd                   G d\„ dT«      «       ZÌd¦d]„ZÍ e�jz                  d«      d§d^„«       ZÎes G d_„ d`«      «       ZÏ G da„ db«      ZÐese�jz                  dŽdc„«       «       ZÑdŽdd„ZÒ	 	 	 	 	 	 	 	 d¨de„ZÓ	 	 	 	 	 	 	 	 d¨df„ZÔdaÕdgeËdh<   d©di„ZÖes G dj„ dk«      «       Z×	 	 	 	 	 	 	 	 	 	 dªdl„ZØes G dm„ dne×«      «       ZÙes G do„ dpeÙ«      «       ZÚes G dq„ dreÙ«      «       ZÛd«ds„ZÜd¬dt„ZÝes G du„ dv«      «       ZÞ G dw„ dx«      Zßd­dy„Zàd®dz„Zád®d{„Zâd®d|„Zãd®d}„Zä	 d¯	 	 	 	 	 	 	 	 	 d°d~„Zå G d„ d€«      Zæes G d�„ d‚«      «       Zçes G dƒ„ d„«      «       Zè G d…„ d†«      Zé G d‡„ dˆeé«      Zê G d‰„ dŠeé«      Zëy)±é    )ÚannotationsN)Úbisect_right)Úcopy)Úc_void_pÚCDLLÚcdll)Ú	timedelta)Úpartial)ÚPath)ÚtimeÚtime_ns)Ú
ModuleType)ÚAnyÚCallableÚcastÚCounterÚDictÚ	GeneratorÚListÚNoReturnÚOptionalÚSequenceÚSetÚTupleÚTYPE_CHECKINGÚTypeVarÚUnion)Ú	TypeAlias)ÚSymIntÚTensor)ÚcountersÚdynamo_timedÚget_chromium_event_logger)ÚconfigÚexcÚmetrics)Úcuda_env)Úrocm_compile_commandÚrocm_compiler)Úlog_cache_bypassé   )Ú_alignÚT)ÚKeysView)Ú
JsonDataTyÚRemoteCache)	Ú_set_gpu_runtime_envÚ_transform_cuda_pathsÚ
CppBuilderÚ
CppOptionsÚCppTorchCudaOptionsÚget_compiler_version_infoÚget_cpp_compilerÚ&get_name_and_dir_from_output_file_pathÚnormalize_path_separator)Úpick_vec_isa)ÚBoxedDeviceIndexÚCudagraphCachedInfoÚ#log_cudagraph_skip_and_bump_counter)Ú_module_to_triton_kernelÚ_reload_python_moduleÚ _reload_python_module_in_subproc)Ú	cache_dirÚdefault_cache_dir)ÚALIGN_BYTESÚalign_inputs_from_check_idxsÚ	BoxedBoolÚclear_on_fresh_inductor_cacheÚis_linuxÚ
is_windowsÚ"set_tracing_context_output_strides)Útrace_structured)Úextract_tensor_metadataÚ
FakeTensorÚTensorMetadata)Úhas_hintÚhint_intÚShapeEnv)ÚFuture©ÚGraphLowering)ÚChoiceCaller)ÚHalideInputSpecÚ
HalideMetaz_inductor/script.ldÚwin32)Úbuild_paths)Ú_run_build_command)Úlog_global_cache_errorsÚlog_global_cache_statsÚlog_global_cache_valsÚuse_global_cachec                  ó   — y ©N© ©ÚargsÚkwargss     ú\/root/repos/pocs/video-evals/.venv/lib/python3.12/site-packages/torch/_inductor/codecache.pyrZ   rZ   ”   ó   € Øó    c                  ó   — y r_   r`   ra   s     rd   r[   r[   —   re   rf   c                  ó   — y r_   r`   ra   s     rd   r\   r\   š   re   rf   c                  ó   — y©NFr`   r`   rf   rd   r]   r]   �   s   € Ørf   Úoutput_codeiX  c                óÒ  — t         j                  j                  €dn,dt         j                  j                  j                  dd«      › �}dt        j
                  j                  › t        j
                  j                  › �}|› d|› �}t        j                  j                  t        «       |«      }t        j                  j                  || «      }t        j                  |d¬«       |S )	NÚcpuÚcuú.Ú ÚpyÚ_T©Úexist_ok)ÚtorchÚversionÚcudaÚreplaceÚsysÚversion_infoÚmajorÚminorÚosÚpathÚjoinrA   Úmakedirs)ÚnameÚcu_strÚpython_versionÚbuild_folderÚcpp_wrapper_dirÚcpp_wrapper_build_directorys         rd   Úcpp_wrapper_cache_dirr‡   «   s½   € ô �=‰=×ÑÐ%ñ 	à”%—-‘-×$Ñ$×,Ñ,¨S°"Ó5Ð6Ð7ð ð
 œ#×*Ñ*×0Ñ0Ð1´#×2BÑ2B×2HÑ2HÐ1IÐJ€NØ$Ð% Q v hÐ/€Lä—g‘g—l‘l¤9£;°Ó=€OÜ"$§'¡'§,¡,¨ÀÓ"EÐÜ‡K�KÐ+°dÕ;Ø&Ð&rf   c                 ó>   — t         j                  j                  €dS dS )NÚ
cubin_pathÚ
hsaco_path)ru   rv   Úhipr`   rf   rd   Úget_cpp_wrapper_cubin_path_namerŒ   º   s   € Ü Ÿ=™=×,Ñ,Ð4ˆ<ÐF¸,ÐFrf   c                  óâ   — e Zd Ze ej
                  d«      dd„«       «       Zee ej
                  d«      d	d„«       «       «       Ze ej
                  d«      d
d„«       «       Z	dd„Z
dd„Zdd„Zy)Ú	CacheBaseNc                 ó�  — 	 ddl m}   | «       }	 dd id|idœ}t        j                  j                  t        j                  j                  «       «      }t        j                  j                  �3|j                  |d   d<   t        j                  j                  |d   d<   n2|j                  |d   d<   t        j                  j                  |d   d	<   t        j                  t        j                   |d
¬«      j#                  d«      «      j%                  «       |d<   |S # t        $ r d }Y �Œw xY w# t        t        f$ r i }Y Œqw xY w)Nr   )Ú
triton_keyr�   Útriton)Údevicerv   r’   rv   rw   r‹   T)Ú	sort_keysúutf-8Úhash)Útriton.compiler.compilerr�   ÚModuleNotFoundErrorru   rw   Úget_device_propertiesÚcurrent_devicerv   r�   ÚgcnArchNamer‹   ÚAssertionErrorÚRuntimeErrorÚhashlibÚsha256ÚjsonÚdumpsÚencodeÚ	hexdigest)r�   Útriton_versionÚsystemÚdevice_propertiess       rd   Ú
get_systemzCacheBase.get_system¿   s3  € ð	"Ý;ñ (›\ˆNð	à! 4˜.à˜nðñ&ˆFô !&§
¡
× @Ñ @Ü—
‘
×)Ñ)Ó+ó!Ðô �}‰}×!Ñ!Ð-Ø+<×+AÑ+A��xÑ  Ñ(Ü,1¯M©M×,>Ñ,>��yÑ! &Ò)à+<×+HÑ+H��xÑ  Ñ(Ü+0¯=©=×+<Ñ+<��yÑ! %Ñ(ô
 !Ÿ™Ü�J‰J�v¨Ô.×5Ñ5°gÓ>ó
ç
‰)‹+ð 	ˆv‰ð ˆøô7 #ò 	"Ø!‹Nð	"ûô& ¤Ð-ò 	àŠFð	ús#   ‚D �CD1 ÄD.Ä-D.Ä1EÅEc                 ó�   — t        t        j                  j                  t	        «       dt
        j                  «       d   «      «      S )NÚcacher•   )r   r}   r~   r   rA   rŽ   r¦   r`   rf   rd   Úget_local_cache_pathzCacheBase.get_local_cache_pathå   s0   € ô ”B—G‘G—L‘L¤£¨g´y×7KÑ7KÓ7MÈfÑ7UÓVÓWÐWrf   c                 ó¾   — t         j                  �Lt        t        j                  j                  t         j                  t        j                  «       d   «      «      S d S )Nr•   )r$   Úglobal_cache_dirr   r}   r~   r   rŽ   r¦   r`   rf   rd   Úget_global_cache_pathzCacheBase.get_global_cache_pathë   sL   € ô
 ×&Ñ&Ð2ô ”—‘—‘œf×5Ñ5´y×7KÑ7KÓ7MÈfÑ7UÓVÓWð	
ð ð	
rf   c                ó6   — t         j                  «       | _        y r_   )rŽ   r¦   r¤   ©Úselfs    rd   Ú__init__zCacheBase.__init__ô   s   € Ü×*Ñ*Ó,ˆ�rf   c                óÂ   — | j                  «       }|j                  «       si S t        |«      5 }t        j                  |«      }d d d «       |d   S # 1 sw Y   d   S xY w©Nr¨   )r©   Úis_fileÚopenrŸ   Úload)r¯   Úlocal_cache_pathÚlocal_cache_fpÚlocal_caches       rd   Úget_local_cachezCacheBase.get_local_cache÷   sa   € Ø×4Ñ4Ó6ÐØ×'Ñ'Ô)ØˆIÜÐ"Ó#ð 	4 ~ÜŸ)™) NÓ3ˆK÷	4à˜7Ñ#Ð#÷	4à˜7Ñ#Ð#ús   ®AÁAc                ó–   — | j                  «       }t        t        |«      t        j                  | j
                  |dœd¬«      d¬«       y )N)r¤   r¨   é   )ÚindentT©Ú	make_dirs)r©   Úwrite_atomicÚstrrŸ   r    r¤   )r¯   r¸   r¶   s      rd   Úupdate_local_cachezCacheBase.update_local_cacheÿ   s<   € Ø×4Ñ4Ó6ÐÜÜÐ Ó!Ü�J‰J $§+¡+¸ÑDÈQÔOØö	
rf   ©ÚreturnúDict[str, Any])rÃ   r   )rÃ   zOptional[Path]©rÃ   ÚNone)r¸   rÄ   rÃ   rÆ   )Ú__name__Ú
__module__Ú__qualname__ÚstaticmethodÚ	functoolsÚ	lru_cacher¦   rF   r©   r¬   r°   r¹   rÁ   r`   rf   rd   rŽ   rŽ   ¾   s•   „ ØØ€Y×Ñ˜Óò"ó ó ð"ðH Ø"Ø€Y×Ñ˜ÓòXó ó #ó ðXð Ø€Y×Ñ˜Óò
ó ó ð
ó-ó$ô
rf   rŽ   c                  ó   — e Zd Zdd„Zdd„Zy)Ú
LocalCachec                óN   — | j                  «       }|}|D ]  }||v r||   }Œ y  |S r_   )r¹   )r¯   Úkeysr¨   Ú	sub_cacheÚkeys        rd   ÚlookupzLocalCache.lookup	  s?   € Ø×$Ñ$Ó&ˆàˆ	Øò 	ˆCØ�e‰|Ø! #™J‘	áð		ð Ðrf   c               óœ   — | j                  «       }|}|dd D ]  }|j                  |i «       ||   }Œ |||d   <   | j                  |«       y )Nr   éÿÿÿÿ)r¹   Ú
setdefaultrÁ   )r¯   ÚvaluerÐ   r¨   rÑ   rÒ   s         rd   Ú	set_valuezLocalCache.set_value  sa   € Ø×$Ñ$Ó&ˆàˆ	Ø˜˜"�:ò 	'ˆCØ× Ñ   bÔ)Ø! #™‰Ið	'ð $ˆ	�$�r‘(Ñà×Ñ Õ&rf   N)rÐ   rÀ   rÃ   úOptional[Dict[str, Any]])rÐ   rÀ   r×   r   rÃ   rÆ   )rÇ   rÈ   rÉ   rÓ   rØ   r`   rf   rd   rÎ   rÎ     s   „ ó
ô	'rf   rÎ   c                  óZ   — e Zd Z ej                  d«      dd„«       Z	 	 	 	 	 	 	 	 	 	 dd„Zy)ÚPersistentCacheNc                óÆ   — | j                  «       }|�|j                  «       si S t        |«      5 }t        j                  |«      }d d d «       |d   S # 1 sw Y   d   S xY wr²   )r¬   r³   r´   rŸ   rµ   )r¯   Úglobal_cache_pathÚglobal_cache_fpÚglobal_caches       rd   Úget_global_cachez PersistentCache.get_global_cache"  sg   € à ×6Ñ6Ó8ÐØÐ$Ð,=×,EÑ,EÔ,GØˆIÜÐ#Ó$ð 	6¨ÜŸ9™9 _Ó5ˆL÷	6à˜GÑ$Ð$÷	6à˜GÑ$Ð$ús   °AÁA c                óð  ‡‡‡‡‡— t        j                  «       Št        t        | j                  ‰‰‰«      }t        t
        | j                  ‰‰‰«      }t        t        | j                  ‰‰‰«      }i Šddˆˆˆˆˆfd„}t        j                  st        j                  �rt        j                  r| j                  «       ni }	 ||	«      sét        «       r || j                  «       |¬«      sÇ|�Å	  |‰«      Št        ˆfd„‰D «       «      sJ ‚|	j                  ‰i «       |	‰   j                  ‰i «      j                  ‰i «       ‰j!                  «       D ]!  \  }
}||	‰   ‰   ‰   |
j#                  «       <   Œ# 	 | j'                  |	«       ‰D �
ci c]  }
|
j#                  «       ‰|
   “Œ }}
 ||«       ‰S t        «       r || j                  «       |¬«       ‰S # t$        $ r} ||«       |‚d}~ww xY wc c}
w )aG  
        Check to see if we have benchmarked the given choice callers. For each
        choice caller:

            1. Check global_cache[op][inputs][choice][precision], return benchmark if cached.
            2. Check local_cache[op][inputs][choice][precision], return benchmark if cached.
            3. If benchmark is not None:
                a. `max_autotune_gemm=True`: benchmark the choice, update
                    local_cache[op][inputs][choice], and return the benchmark.
                b. `max_autotune_gemm=False`: don't benchmark the choice, return nothing.
        Nc                óâ   •— d}‰D ][  }|j                  «       }|| j                  ‰i «      j                  ‰i «      j                  ‰i «      v r| ‰   ‰   ‰   |   ‰	|<   ŒYd} n |r	 ||¬«       |S )z2Check if `cache` contains data for all the choicesTF)Úcached)Úhash_keyÚget)
r¨   ÚcallbackÚhitÚchoiceÚchoice_hashÚchoicesÚinputsÚopÚ	precisionÚtimingss
        €€€€€rd   Úcheck_cachez+PersistentCache.lookup.<locals>.check_cacheF  s‰   ø€ àˆCØ!ò �Ø$Ÿo™oÓ/�Ø %§)¡)¨B°Ó"3×"7Ñ"7¸ÀÓ"C×"GÑ"GÈ	ÐSUÓ"VÑVà&+¨B¡i°Ñ&7¸	Ñ&BÀ;Ñ&O�G˜F’Oð  �CÙðñ Ù Õ$ØˆJrf   )ræ   c              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wr_   r`   )Ú.0rè   rî   s     €rd   ú	<genexpr>z)PersistentCache.lookup.<locals>.<genexpr>d  s   øè ø€ ÒG°V˜v¨Ô0ÑGùs   ƒr_   )r¨   rÄ   ræ   r   rÃ   Úbool)ru   Úget_float32_matmul_precisionr
   r[   r¤   r\   rZ   r$   Úmax_autotuneÚmax_autotune_gemmÚautotune_local_cacher¹   r]   rà   ÚallrÖ   Úitemsrä   rœ   rÁ   )r¯   rê   rì   rë   Ú	benchmarkÚ	log_statsÚlog_valsÚ
log_errorsrï   r¸   rè   ÚtimingÚeÚtimings_to_logrí   rî   s    ```          @@rd   rÓ   zPersistentCache.lookup+  sâ  ü€ ô$ ×6Ñ6Ó8ˆ	äÔ2°D·K±KÀÀVÈYÓWˆ	ÜÔ0°$·+±+¸rÀ6È9ÓUˆÜÜ# T§[¡[°"°f¸ió
ˆ
ð ˆ÷	ò 	ô  ×Ò¤&×":Ó":Ü4:×4OÒ4O˜$×.Ñ.Ô0ÐUWˆKñ   Ô,ä$Ô&Ù# D×$9Ñ$9Ó$;ÀiÕPàÐ)ðá'¨Ó0�GÜÓG¸wÔGÔGÐGÐGØ×*Ñ*¨2¨rÔ2Ø ‘O×.Ñ.¨v°rÓ:×EÑEÀiÐQSÔTØ*1¯-©-«/ò W™˜ ØPV˜ B™¨Ñ/°	Ñ:¸6¿?¹?Ó;LÒMñWð ×'Ñ'¨Ô4ð FMö"Ø;A�F—O‘OÓ% w¨v¡Ñ6ð"�ð "ñ ˜Ô(ð ˆô Ôá˜×-Ñ-Ó/¸)ÕDð ˆøô! $ò á˜q”MØ�Gûðüò"s   Ã.B	G ÆG3Ç	G0Ç!
G+Ç+G0rÂ   )
rê   zList[ChoiceCaller]rì   rÀ   rë   rÀ   rú   z4Optional[Callable[[Any], Dict[ChoiceCaller, float]]]rÃ   zDict[ChoiceCaller, float])rÇ   rÈ   rÉ   rË   rÌ   rà   rÓ   r`   rf   rd   rÛ   rÛ   !  s]   „ Ø€Y×Ñ˜Óò%ó ð%ðNà#ðNð ðNð ð	Nð
 HðNð 
#ôNrf   rÛ   c                 óÂ   — t         j                  j                  t        «       d«      } t         j                  j	                  | «      st        j
                  | d¬«       | S )NÚlocksTrs   )r}   r~   r   rA   Úexistsr€   )Úlock_dirs    rd   Úget_lock_dirr  |  s;   € Ü�w‰w�|‰|œI›K¨Ó1€HÜ�7‰7�>‰>˜(Ô#Ü
�‰�H tÕ,Ø€Orf   c                ó®   — t        j                  t        j                  | «      j	                  «       «      d d j                  d«      j                  «       S )Né3   r”   )Úbase64Ú	b32encoder�   rž   ÚdigestÚdecodeÚlower)Údatas    rd   Úsha256_hashr  ƒ  s@   € ä×ÑœGŸN™N¨4Ó0×7Ñ7Ó9Ó:¸3¸BÐ?×FÑFÀwÓO×UÑUÓWÐWrf   c                óœ   — t        | t        «      r| n| j                  d«      }|dk7  r|dz   |j                  d«      z   }dt        |«      z   S )Nr”   rp   s   ||Úc)Ú
isinstanceÚbytesr¡   r  )ÚcodeÚextraÚhashing_strs      rd   Ú	code_hashr  ˆ  sJ   € Ü$ T¬5Ô1‘$°t·{±{À7Ó7K€KØ�‚{Ø! EÑ)¨E¯L©L¸Ó,AÑAˆØ”˜[Ó)Ñ)Ð)rf   c                óF  — |rKt         j                  j                  |«      r|}nTt         j                  j                  t	        «       |«      }n+t         j                  j                  t	        «       | dd «      }t         j                  j                  || › d|› �«      }| ||fS )Nr+   é   ro   )r}   r~   Úisabsr   rA   )ÚbasenameÚ	extensionÚspecified_dirÚsubdirr~   s        rd   Úget_pathr  �  sz   € ñ Ü�7‰7�=‰=˜Ô'Ø"‰Fä—W‘W—\‘\¤)£+¨}Ó=‰Fä—‘—‘œi›k¨8°A°a¨=Ó9ˆÜ�7‰7�<‰<˜ 8 *¨A¨i¨[Ð 9Ó:€DØ�V˜TÐ!Ð!rf   c                óp   — |dk(  rt        | |«      S |dv rt        t        | «      «      S t        d|› �«      ‚)Nr  )ÚcubinÚhsacoÚspvzUnknown hash type )r  Úreprr›   )Úcontentr  Ú	hash_types      rd   Úget_hashr&  �  sD   € ð �FÒÜ˜ %Ó(Ð(ØÐ-Ñ-Üœ˜g›Ó'Ð'Ü
Ð-¨i¨[Ð9Ó
:Ð:rf   c                óÆ   — t        | j                  «       ||«      }t        |||«      \  }}}|dk(  }	t        j                  j                  |«      st        || d¬«       ||fS )Nr  Tr½   )r&  Ústripr  r}   r~   r  r¿   )
r$  r  r  r%  r  rÒ   r  r  r~   Úencode_utf_8s
             rd   Úwriter*  §  s]   € ô ˜Ÿ™›¨°	Ó:€CÜ% c¨9°mÓDÑ€Hˆf�dØ" fÑ,€LÜ�7‰7�>‰>˜$ÔÜ�T˜7¨dÕ3Ø�Tˆ>Ðrf   c                ó    — t        | d«      d   S )zT
    Write the `text` to a file and return the path computed based on the hash.
    Útxtr+   ©r*  )Útexts    rd   Ú
write_textr/  ¹  s   € ô ��uÓ˜aÑ Ð rf   c                óÊ  — t        |t        t        f«      sJ d«       ‚t        | «      }|r|j                  j                  dd¬«       |j                  dt        j                  «       › dt        j                  «       › d�z  }t        |t        «      rdnd}|j                  ||rdnd ¬	«      5 }|j                  |«       d d d «       |j                  |«       y # 1 sw Y   ŒxY w)
Nz6Only strings and byte arrays can be saved in the cacheT©Úparentsrt   ro   z.tmpÚwÚwbr”   )Úencoding)r  rÀ   r  r   ÚparentÚmkdirr}   ÚgetpidÚ	threadingÚ	get_identr´   r*  Úrename)Úpath_r$  r¾   r)  r~   Útmp_pathÚ
write_modeÚfs           rd   r¿   r¿   À  sÏ   € ô Ø”#”u�ôð @à?ó@ð ô �‹;€DÙØ�‰×Ñ $°ÐÔ6Ø�{‰{˜q¤§¡£ ¨Q¬y×/BÑ/BÓ/DÐ.EÀTÐJÑJ€HÜ" 7¬CÔ0‘°d€JØ	�‰�z±|©GÈˆÓ	Nð ÐRSØ	�‰�Ô÷à‡O�O�DÕ÷ð ús   Â-CÃC"c                  ó&   — e Zd ZU dZded<   ded<   y)ÚTensorMetadataAndValueszk
    TensorMetadata plus the elements as a list of raw values.
    Used for hashing inlined constants.
    rM   Útensor_metadataú	List[Any]ÚvaluesN©rÇ   rÈ   rÉ   Ú__doc__Ú__annotations__r`   rf   rd   rA  rA  Õ  s   … ñð
 $Ó#ØÔrf   rA  c                ó   — | S r_   r`   ©Úxs    rd   Ú_identrK  à  s   € Ø€Hrf   c                óú   — t        |«      }t        |d«      st        j                  |dd¬«      }|j                  | vr|j                  | |j                  <   t        j                  || |j                     ¬«      }|S )zs
    Extracts the tensor metadata and removes fields of the TensorMetadata
    that are not needed for caching
    Ú_is_inductor_staticr   N)Ústorage_offsetÚstorage_bytes)r’   )rK   ÚhasattrÚdataclassesrx   r’   )Ú
device_mapÚtÚmetas      rd   Ú%extract_tensor_metadata_for_cache_keyrU  ä  sm   € ô # 1Ó%€DÜ�1Ð+Ô,Ü×"Ñ" 4¸ÈÔNˆð ‡{�{˜*Ñ$Ø"&§+¡+ˆ
�4—;‘;ÑÜ×Ñ˜t¨J°t·{±{Ñ,CÔD€Dà€Krf   c                ó,   — t        | |«      }t        |ffS )zH
    See FxGraphCachePickler. Custom reducer to pickle FakeTensors.
    )rU  rK  )rR  rS  Úmetadatas      rd   Ú_reduce_fake_tensorrX  ý  s   € ô 5°ZÀÓC€HÜ�X�KÐ Ð rf   c                óú   — |j                   rt        d«      ‚t        «       }|j                  «       }t        «       |z
  }|dkD  rt	        j
                  d|d›d�«       t        | |«      }t        t        ||«      ffS )a4  
    See FxGraphCachePickler. Custom reducer to pickle Tensors.
    If we see tensors, we know they're constants stored as attributes on
    the GraphModule. Include the values in the key calculation. Small
    tensors will be inlined, so we can't serve the same cache entry for
    different values anyway. Large constants are treated as parameters,
    so we could conceivably reuse a cache entry. To do that, however,
    PyCodeCache would need more complexity to create a new module from its
    cache, but with the right constants attached as attributes.
    zmkldnn tensors unpickleable.g      ð?z1FX graph cache handling of a large constant took z.1zs. Please file an issue.)	Ú	is_mkldnnÚBypassFxGraphCacher   ÚtolistÚwarningsÚwarnrU  rK  rA  )rR  rS  ÚstartrD  ÚelapsedrW  s         rd   Ú_reduce_tensorra    s~   € ð 	‡{‚{ô !Ð!?Ó@Ð@ô ‹F€EØ�X‰X‹Z€FÜ‹f�u‰n€GØ�‚}Ü�‰Ø?ÀÈ¸|ÐKcÐdô	
ô 5°ZÀÓC€HÜÔ,¨X°vÓ>Ð@ÐAÐArf   c                ó&   — t         t        | «      ffS )zD
    See FxGraphCachePickler. Custom reducer to pickle SymInts.
    )rK  rÀ   ©Úss    rd   Ú_reduce_symintre  (  s   € ô ”S˜“V�IÐÐrf   c                ó   — t        d«      ‚)zˆ
    See FxGraphCachePickler. Custom reducer to handle any objects that we don't
    support and therefore raise to bypass caching.
    zReduce unsupported.)r[  rc  s    rd   Ú_reduce_unsupportedrg  2  s   € ô
 Ð2Ó
3Ð3rf   c                  ón  — e Zd ZU dZi Zded<   ej                  j                  «       Z e	j                  ee«      ee<    e	j                  ee«      eej                  <   eeej"                  <   eeej&                  j(                  j*                  j,                  <   edd„«       Zed	d„«       Zed
d„«       Zy)ÚFxGraphCachePicklera:  
    Custom pickler to customize the pickling of some objects (Tensors), only for the
    purpose of computing a hash for keying into the FxGraphCache. Tensors contain
    objects that don't pickle and/or vary between runs, and we want to capture the
    data that allow us to compute a stable, but safe hash.
    ú Dict[torch.device, torch.device]Ú_device_mapc                ó,  — t        j                  «       5 } | |«      }d|_        	 |j                  |«       |j                  «       cddd«       S # t        t
        f$ r(}t        j                  dd¬«       t        d«      |‚d}~ww xY w# 1 sw Y   yxY w)zA
        Pickle an object using the FxGraphCachePickler.
        TzCan't pickle©Úexc_infoz#Config options may be unpickleable.N)
ÚioÚBytesIOÚfastÚdumpÚ	TypeErrorÚAttributeErrorÚlogÚwarningr[  Úgetvalue)ÚclsÚobjÚstreamÚpicklerrÿ   s        rd   r    zFxGraphCachePickler.dumpsN  s‘   € ô
 �Z‰Z‹\ð 	%˜VÙ˜&“kˆGàˆGŒLðWØ—‘˜SÔ!ð —?‘?Ó$÷	%ñ 	%øô œ~Ð.ò Wô —‘˜N°T�Ô:Ü(Ð)NÓOÐUVÐVûð	Wú÷	%ð 	%ús-   •B
¦A·B
ÁBÁ#BÂBÂB
Â
Bc                ó:   — | j                  |«      }t        |«      S )zt
        Serialize an object using the FxGraphCachePickler and return a hash
        of the pickled object.
        )r    r  )rx  ry  Úserialized_datas      rd   r&  zFxGraphCachePickler.get_hash`  s   € ð Ÿ)™) C›.ˆÜ˜?Ó+Ð+rf   c                ó>  ‡ — dˆ fd„}g }t        |«      j                  «       D ]÷  \  }}t        |t        «      rTt	        t        |«      «      D ]<  }‰ j                  ||   «      }|j                  d|› d|› d|› d |||   «      › �«       Œ> Œjt        |t        «      rM|j                  «       D ]9  \  }}	‰ j                  |	«      }|j                  d|› d|› d|› d ||	«      › �«       Œ; ŒÇ‰ j                  |«      }|j                  d|› d|› d ||«      › �«       Œù |S )zÉ
        Get a printable string describing in more detail all the attributes
        comprising an object. Useful for debugging when one graph hashes
        to a different value than another.
        c                ó0  •— t        | t        j                  «      rt        t	        ‰j
                  | «      «      S t        | t        «      ryt        | «      ‰j                  v r*t         ‰j                  t        | «         | «      d   «      S t        | «      S )Nz<bytes>r+   )	r  ru   r    rÀ   rU  rk  r  ÚtypeÚdispatch_table)ry  rx  s    €rd   Úget_strz0FxGraphCachePickler.debug_lines.<locals>.get_strq  sx   ø€ Ü˜#œuŸ|™|Ô,ÜÔ@ÀÇÁÐRUÓVÓWÐWÜ˜C¤Ô'Ø Ü�c“˜c×0Ñ0Ñ0äÐ8˜3×-Ñ-¬d°3«iÑ8¸Ó=¸aÑ@ÓAÐAä˜3“x�rf   ú[z] z]: z: ©ry  r   rÃ   rÀ   )	Úvarsrù   r  ÚlistÚrangeÚlenr&  ÚappendÚdict)
rx  Úinpr‚  ÚlinesÚattrry  ÚiiÚhÚkÚvs
   `         rd   Údebug_lineszFxGraphCachePickler.debug_linesi  s(  ø€ õ		 ð ˆÜ˜c›Ÿ™Ó*ò 	>‰IˆD�#Ü˜#œtÔ$Ü¤ C£›/ò L�BØŸ™ S¨¡WÓ-�AØ—L‘L 1 Q C r¨$¨¨q°°°C¹ÀÀBÁÓ8HÐ7IÐ!JÕKñLô ˜C¤Ô&ØŸI™I›Kò E‘D�A�qØŸ™ Q›�AØ—L‘L 1 Q C r¨$¨¨q°°°3±w¸q³z°lÐ!CÕDñEð —L‘L Ó%�Ø—‘˜q   2 d V¨2©g°c«l¨^Ð<Õ=ð	>ð ˆrf   N)ry  r   rÃ   r  r„  )r‹  ÚFxGraphHashDetailsrÃ   ú	List[str])rÇ   rÈ   rÉ   rF  rk  rG  Úcopyregr�  r   rË   r
   rX  rL   ra  ru   r    re  r   rg  ÚfxÚexperimentalÚ_backward_stateÚBackwardStateÚclassmethodr    r&  r’  r`   rf   rd   ri  ri  :  sÑ   … ñð 57€KÐ1Ó6à×+Ñ+×0Ñ0Ó2€NØ!2 ×!2Ñ!2Ð3FÈÓ!T€N�:ÑØ#4 9×#4Ñ#4°^À[Ó#Q€N�5—<‘<Ñ Ø#1€N�5—<‘<Ñ ð 	ð Ø�‰×Ñ×-Ñ-×;Ñ;ñð ò%ó ð%ð" ò,ó ð,ð òó ñrf   ri  c                óü  — t        t        j                  | |«      d„ ¬«      D ]Ë  }|j                  j	                  |j
                  d «      }|€J ‚|j                  }|€J ‚t        |d«      5 }|j                  |j
                  j                  d«      «       |j                  |j                  «       «       d d d «       |j                  sŒ¨t        |j                  |j
                  › d�|«       ŒÍ y # 1 sw Y   Œ=xY w)Nc                ó   — | j                   S r_   )r�   rI  s    rd   ú<lambda>z!build_code_hash.<locals>.<lambda>�  s
   € ÈÏÉ€ rf   ©rÒ   Úrbr”   ro   )ÚsortedÚpkgutilÚiter_modulesÚmodule_finderÚ	find_specr�   Úoriginr´   Úupdater¡   ÚreadÚispkgÚbuild_code_hashÚsubmodule_search_locations)ÚrootsÚprefixÚhasherÚlibÚspecÚmoduler?  s          rd   r©  r©  Œ  sÚ   € ô ”g×*Ñ*¨5°&Ó9Ñ?OÔPò 
VˆØ× Ñ ×*Ñ*¨3¯8©8°TÓ:ˆØÐÐÐØ—‘ˆØÐ!Ð!Ð!Ü�&˜$Óð 	$ 1Ø�M‰M˜$Ÿ)™)×*Ñ*¨7Ó3Ô4Ø�M‰M˜!Ÿ&™&›(Ô#÷	$ð �9‹9ä˜D×;Ñ;ÀÇ	Á	¸{È!¸_ÈfÕUñ
V÷
	$ð 	$ús   Á,A
C2Ã2C;	c                 ó²   — t        j                  «       sdd„}  | t        «      S ddlm} |j                  d«      j                  «       j                  d«      S )zS
    Compute a key that contains relevant information about torch source files
    c                ó>  — d}t         j                  j                  t        «      }|D �cg c]"  }t         j                  j	                  ||«      ‘Œ$ }}t        j                  «       }|j                  t        j                  j                  d«      «       t        | gd|«       |D ]V  }t         j                  j                  |«      sŒ#t        |d«      5 }|j                  |j                  «       «       d d d «       ŒX |j                  «       S c c}w # 1 sw Y   ŒwxY w)N)z"codegen/aoti_runtime/interface.cppz'codegen/aoti_runtime/implementation.cppúcodegen/cpp_prefix.hú	script.ldr”   rp   rŸ  )r}   r~   ÚdirnameÚ__file__r   r�   rž   r¦  ru   Ú__version__r¡   r©  r  r´   r§  r
  )ÚrootÚextra_filesÚinductor_rootrJ  r­  r~   r?  s          rd   Úget_code_hashz torch_key.<locals>.get_code_hash£  sá   € ðˆKô ŸG™GŸO™O¬HÓ5ˆMØCNÖO¸aœ2Ÿ7™7Ÿ<™<¨°qÕ9ÐOˆKÐOÜ—^‘^Ó%ˆFØ�M‰Mœ%×+Ñ+×2Ñ2°7Ó;Ô<Ü˜T˜F B¨Ô/Ø#ò 0�Ü—7‘7—>‘> $Õ'Ü˜d DÓ)ð 0¨QØŸ™ a§f¡f£hÔ/÷0ð 0ð0ð —=‘=“?Ð"ùò P÷0ð 0ús   ª'DÃ DÄD	r   ©Úparutilztorch/src_hash.txtÚascii)r¸  rÀ   rÃ   r  )r$   Ú	is_fbcodeÚ_TORCH_PATHÚlibfb.pyr½  Úget_file_contentsÚrstripr¡   )r»  r½  s     rd   Ú	torch_keyrÄ  œ  sK   € ô
 ×ÑÔó	#ñ* œ[Ó)Ð)å à×$Ñ$Ð%9Ó:×AÑAÓC×JÑJÈ7ÓSÐSrf   c                 óH   — t         j                  j                  t        «      S r_   )r}   r~   rµ  r¶  r`   rf   rd   Úget_inductor_rootrÆ  ¿  s   € Ü�7‰7�?‰?œ8Ó$Ð$rf   c                  ó   — e Zd ZU dZded<   y)ÚOrderedSetHolderzb
    See FxGraphHashDetails. Holds a sorted list to support stable hashing
    of set kwargs.
    rC  rù   NrE  r`   rf   rd   rÈ  rÈ  Ã  s   … ñð
 Ôrf   rÈ  c                  ó   — e Zd ZdZy)r[  zI
    Exception to indicate that the FxGraphCache should be bypassed.
    N)rÇ   rÈ   rÉ   rF  r`   rf   rd   r[  r[  Í  s   „ òrf   r[  c                  ó:   — e Zd ZdZdgZ	 	 	 	 	 	 	 	 	 	 dd„Zdd„Zy)r“  zz
    Object to capture all the details for a compiled FX graph relevant to computing
    a safe and stable cache key.
    Úgraph_idc                óN  — || _         || _        i | _        t        |«      D ]\  }|| j                  vsŒt        ||   «      t        u r%t        t        ||   «      «      | j                  |<   ŒK||   | j                  |<   Œ^ || _        t        j                  «       t        j                  «       t        j                  j                  j                  f| _        t        j                   j"                  j$                  j&                  t        j                   j"                  j$                  j(                  t        j                   j"                  j$                  j*                  f| _        t/        «       | _        t2        j5                  «       | _        t9        j:                  «       | _        y r_   )ÚgmÚexample_inputsÚ	fx_kwargsr   ÚEXCLUDED_KWARGSr€  ÚsetrÈ  Úinputs_to_checkru   Ú$are_deterministic_algorithms_enabledÚ-is_deterministic_algorithms_warn_only_enabledÚutilsÚdeterministicÚfill_uninitialized_memoryÚ!deterministic_algorithms_settingsÚbackendsrw   ÚmatmulÚ
allow_tf32Ú&allow_fp16_reduced_precision_reductionÚ&allow_bf16_reduced_precision_reductionÚcuda_matmul_settingsrÄ  Útorch_versionrŽ   r¦   Úsystem_infor$   Úsave_config_portableÚinductor_config)r¯   rÍ  rÎ  rÏ  rÒ  r�  s         rd   r°   zFxGraphHashDetails.__init__Ü  sE  € ð ˆŒØ,ˆÔð ˆŒÜ˜	Ó"ò 	5ˆAØ˜×,Ñ,Ò,Ü˜	 !™Ó%¬Ñ,ô )9¼À	È!ÁÓ9MÓ(N�D—N‘N 1Ò%à(1°!©�D—N‘N 1Ò%ð	5ð  /ˆÔô ×6Ñ6Ó8Ü×?Ñ?ÓAÜ�K‰K×%Ñ%×?Ñ?ð2
ˆÔ.ô �N‰N×Ñ×&Ñ&×1Ñ1Ü�N‰N×Ñ×&Ñ&×MÑMÜ�N‰N×Ñ×&Ñ&×MÑMð%
ˆÔ!ô '›[ˆÔÜ$×/Ñ/Ó1ˆÔÜ%×:Ñ:Ó<ˆÕrf   c                ó,   — t         j                  | «      S )zË
        Get a printable string describing in more detail all the attributes
        comprising this object. Useful for debugging when one graph hashes
        to a different value than another.
        )ri  r’  r®   s    rd   r’  zFxGraphHashDetails.debug_lines  s   € ô #×.Ñ.¨tÓ4Ð4rf   N)
rÍ  útorch.fx.GraphModulerÎ  úList[torch.Tensor]rÏ  rÄ   rÒ  úSequence[int]rÃ   rÆ   ©rÃ   r”  )rÇ   rÈ   rÉ   rF  rÐ  r°   r’  r`   rf   rd   r“  r“  Ó  sK   „ ñð "�l€Oð)=à ð)=ð +ð)=ð "ð	)=ð
 'ð)=ð 
ó)=ôV5rf   r“  c                óÎ   — t        | |||«      }dt        j                  |«      z   }|j                  «       }dj	                  |«      }t
        j                  d|› d|› �«       ||fS )z=
    Generate a unique hash of the FX graph for caching.
    r?  ú
z$FX graph cache hash details for key z:
)r“  ri  r&  r’  r   ru  Údebug)rÍ  rÎ  rÏ  rÒ  ÚdetailsrÒ   r’  Ú	debug_strs           rd   Úcompiled_fx_graph_hashrí    sm   € ô !  ^°YÀÓP€Gð Ô#×,Ñ,¨WÓ5Ñ
5€CØ×%Ñ%Ó'€KØ—	‘	˜+Ó&€IÜ‡I�IÐ4°S°E¸¸Y¸KÐHÔIØ�ÐÐrf   ÚCompiledFxGraphc                óÌ  ‡‡— |j                   €J ‚|j                  €J ‚|j                  }|j                  }|j                  }|j                  }|j
                  d   }|j
                  d   }|�s |j
                  }	|	d   }
|j                  }|j                  }t        j                  j                  s-| D ](  }t        |t        j                  «      sŒt        |«       Œ* |�1|s/|s-|j                  t!        t#        |j$                  «      «      «       ddlm} |j                   }|€J ‚ |||
t!        t#        |j$                  «      «      |||t+        |j,                  j/                  «       «      |t+        |j0                  «      ¬«	      |_         yt3        j4                  |«       |rt        j                  j                  re|€J ‚|j6                  €J ‚|j                   Št        j8                  j                  j;                  |j6                  d¬	«      Š‰€J ‚dˆˆfd
„}||_         d|j<                  v r1|j>                  rtA        |j>                  «       ytA        d|› �«       yy)z¡
    Checks for any reasons not to run cudagraphs and then
    runs it on compiled_graph.
    Mutates the `compiled_graph.current_callable` and `cudagraphs`
    NÚis_inferenceÚis_backwardÚstatic_input_idxsr+   )Úcudagraphify)rò  Údevice_indexÚstack_tracesrñ  rð  Ú	constantsÚplaceholdersÚmutated_input_idxsF)Úcreate_if_none_existsc                ó4   •— ‰j                  «         ‰| «      S r_   )Úset_to_running_backward)Ú
new_inputsÚcompiled_graph_callableÚmanagers    €€rd   Úcompiled_artifactz1cudagraph_post_compile.<locals>.compiled_artifactj  s   ø€ Ø×/Ñ/Ô1Ù.¨zÓ:Ð:rf   rw   úskipping cudagraphs due to )rü  rC  rÃ   úCallable[..., Any])!Úcurrent_callableÚcudagraph_infoÚcudagraph_fail_reasonsrÒ  Úboxed_forward_device_indexrÏ  r÷  rõ  r$   r‘   Úcudagraph_treesr  ru   r   ÚintrÑ  ÚnextÚiterÚdevice_idxsÚ
compile_fxró  Útuplerö  rD  rø  rE   Údisabler×   Ú	_inductorÚget_managerÚdevice_typesÚdisabled_cudagraphs_reasonr=   )rÎ  Úcompiled_graphÚ
cudagraphsÚcached_infor  rÒ  r  rð  rñ  rÏ  rò  r÷  rõ  rS  ró  r  rÿ  rý  rþ  s                    @@rd   Úcudagraph_post_compiler  #  sO  ù€ ð ×*Ñ*Ð6Ð6Ð6Ø×(Ñ(Ð4Ð4Ð4Ø ×/Ñ/€KØ(×?Ñ?ÐØ$×4Ñ4€OØ!/×!JÑ!JÐØ!×+Ñ+¨NÑ;€LØ ×*Ñ*¨=Ñ9€Kâ!Ø"×,Ñ,ˆ	Ø%Ð&9Ñ:Ðà"×/Ñ/ˆØ"×/Ñ/ˆÜ�}‰}×,Ò,à#ò �Ü˜a¤§¡Õ.Ü˜•Fðð
 'Ð2Ù Ùà&×*Ñ*¬4´°^×5OÑ5OÓ0PÓ+QÔRå,à)×:Ñ:ÐØÐ+Ð+Ð+Ù*6ØØ/Üœd >×#=Ñ#=Ó>Ó?Ø%Ø#Ø%Ü˜N×4Ñ4×;Ñ;Ó=Ó>Ø%Ü$ ^×%FÑ%FÓGô
+
ˆÕ'ô 	×Ñ˜*Ô%ñ
 œ6Ÿ=™=×8Ò8Ø-Ð9Ð9Ð9Ø-×3Ñ3Ð?Ð?Ð?Ø&4×&EÑ&EÐ#ä—o‘o×5Ñ5×AÑAØ*×0Ñ0Èð Bó ˆGð Ð&Ð&Ð&ö;ð /@ˆNÔ+à�^×0Ñ0Ñ0ð ×8Ò8Ü3Ø"×=Ñ=õô 4Ø1Ð2HÐ1IÐJõð 1rf   c                ó~   — | s;|j                   €J ‚t        |j                   |«      }||j                   ur||_         yyy)zÃ
    Realigns input strides from inputs_to_check if
    we didn't end up running cudagraphs. Mutates
    `compiled_graph.current_callable` if cudagraphs
    was run. Otherwise, does nothing.
    N)r  rD   )Úran_cudagraphsr  rÒ  Únew_callables       rd   Úmaybe_realign_inputsr  }  sP   € ñ Ø×.Ñ.Ð:Ð:Ð:Ü3Ø×+Ñ+¨_ó
ˆð ˜~×>Ñ>Ñ>Ø.:ˆNÕ+ð ?ð rf   c                óÖ  — t         j                  j                  «       rt         j                  j                  «       syt	        | dz  «      }t        j                  «       rJt         j                  j                  d«      }t        j                  d||«       |t	        ||z  dz  «      z  }t        j                  d|«       t        j                  j                  t        |¬«      «       |S )z}
    Ephemerally increases the NCCL timeout when compiling for a distributed job
    Returns amount of seconds increased
    r   g    eÍÍAz>pytorch/remote_cache:ephemeral_timeout_fudge_factor_percentagezNEphemeral NCCL timeout increase fudge factor %d and original increase value %déd   zIncreasing NCCL timeout by %d)Úseconds)ru   ÚdistributedÚis_availableÚis_initializedr  r$   r¿  Ú_utils_internalÚjustknobs_getval_intru  ÚinfoÚdistÚdistributed_c10dÚ"_add_ephemeral_timeout_for_all_pgsr	   )Útime_saved_nsÚincreased_timeout_secÚfudge_factors      rd   Ú.add_ephemeral_timeout_increase_for_distributedr)  ‘  sÈ   € ô
 ×Ñ×)Ñ)Ô+´5×3DÑ3D×3SÑ3SÔ3UØä °Ñ 4Ó5Ðä×ÑÔÜ×,Ñ,×AÑAØLó
ˆô 	�‰Ø\ØØ!ô	
ð
 	¤Ð%:¸\Ñ%IÈCÑ%OÓ!PÑPÐä‡H�HÐ,Ð.CÔDÜ×Ñ×<Ñ<ÜÐ/Ô0ôð !Ð rf   c                  ó  — e Zd ZdZedd„«       Zedd„«       Zedd„«       Zedd„«       Ze	 	 	 	 	 	 	 	 	 	 dd„«       Z	e	 	 	 	 	 	 	 	 dd„«       Z
e	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Zedd	„«       Ze	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd
„«       Zedd„«       Zy)ÚFxGraphCachea7  
    Supports caching and reusing compiled Fx graphs.

    The overall strategy is as follows:
    - This cache stores entries on disk. When saving an entry, we can't
      serialize callables (that could be C++, Triton, etc.), so we serialize
      their own disk cache location. We then recreate the compiled artifact
      after fetching from disk.
    - For indexing the cache, we gather the fields relevant to identifying an
      FxGraph (the graph module, graph inputs, system settings etc.) into an
      FxGraphCacheDetails object, pickle it, and compute a hash for the key.
      See FxGraphCachePickler.
    - Among the metadata we store, we also include a guards expression that's
      appropriate for validating any symbols for Tensor arguments that have
      symbolic bounds. On cache lookup then, we evaluate those guards in the
      current context to validate that a cached entry can be served.
    - A given graph could have multiple compiled versions, corresponding to
      different sets of guards. Therefore, we store cache entries in the form:
          <temp dir>/<fx graph hash>/<serialized metatdata>
    - On lookup, we compute the key from the graph details, iterate over all
      leaf files in the corresponding subdirectory, deserialize the entry, and
      evaluate its guards expression. If the evaluation succeeds, we have a
      cache hit. If it fails, we compile the graph and store a new entry.
    - Finally, on a cache hit, we need to make sure any guards that would
      have been created during compilation are added to the current context.
    c                 óR   — t         j                  j                  t        «       d«      S )zS
        Get the toplevel temporary directory for storing compiled graphs.
        Úfxgraph)r}   r~   r   rA   r`   rf   rd   Ú_get_tmp_dirzFxGraphCache._get_tmp_dirË  s   € ô
 �w‰w�|‰|œI›K¨Ó3Ð3rf   c                ón   — t         j                  j                  t        j	                  «       | dd | «      S )zA
        Return the disk location for a given cache key.
        r+   r  )r}   r~   r   r+  r.  rž  s    rd   Ú_get_tmp_dir_for_keyz!FxGraphCache._get_tmp_dir_for_keyÒ  s*   € ô
 �w‰w�|‰|œL×5Ñ5Ó7¸¸Q¸q¸À3ÓGÐGrf   c                óz   — | D �cg c]+  }t        |t        j                  «      sŒt        |«      sŒ*|‘Œ- c}S c c}w )z�
        Get the backed SymInt objects from the input list. Note that we can never
        have guards that depend on unbacked symint.
        )r  ru   r   rN   )rë   rd  s     rd   Ú_filter_backed_symintsz#FxGraphCache._filter_backed_symintsÙ  s+   € ð "ÖQ�a¤Z°´5·<±<Õ%@ÄXÈaÅ[’ÒQÐQùÒQs   …8¥8±8c                 ó„   — t         j                  j                  j                  «       } | sy| j                  j
                  S )zG
        Helper to get the shape env from the tracing context.
        N)ru   Ú_guardsÚTracingContextÚtry_getÚ	fake_modeÚ	shape_env)Úctxs    rd   Ú_get_shape_envzFxGraphCache._get_shape_envá  s2   € ô
 �m‰m×*Ñ*×2Ñ2Ó4ˆÙØØ�}‰}×&Ñ&Ð&rf   c                ój  ‡ ‡‡‡‡— t         j                  «       }|€J ‚t         j                  |«      }|D �cg c]  }t        |«      ‘Œ }}dˆ ˆˆfd„}d}	 |«       D ]`  }
|
j                  s|
}	 nPt        |j                  |
j                  |«      «      }t        j                  d‰ |
j                  ||«       |sŒ^|
}	 n |	€yt        |	j                  d«      d   Š|	j                  Št        j                  j                  ‰«      sÉt        d   dxx   dz  cc<   t!        t        j                  j#                  ‰«      «      j%                  d	d	¬
«       t'        «       }t        j                  j)                  |«      ‰v rC|‰v rn>dt        j                  j)                  |«      › d�}t+        j,                  |d|› d�‰«      Št/        ‰‰d	¬«       	 t0        j3                  |	j                  ‰|	j4                  |	j6                  «      j8                  |	_        |	j                  rLt        |j                  |	j                  |«      «      }|d	u sJ ‚t        j                  d‰ |j@                  «       tB        jD                  jG                  |	jH                  «       t        dxx   |	jJ                  z  cc<   ddl&m'}  |jP                  ‰«       tR        j                  d‰«       tR        j                  d‰«       tU        dˆfd„ˆfd„¬«       |	S c c}w # t<        $ r t        j?                  d‰«       Y yw xY w)z˜
        Lookup a compiled graph in the cache by key. On a hit, return the
        deserialized CompiledFxGraph object. On a miss, return None.
        Nc               3  óì  •K  — ‰r¢t         j                  ‰«      } t        j                  j	                  | «      rnt        t        j                  | «      «      D ]M  }	 t        t        j                  j                  | |«      d«      5 }t        j                  |«      –— d d d «       ŒO ‰rq	 ‰j                  ‰«      x}�\t        |t         «      sJ ‚|d   }t        |t"        t$        f«      sJ ‚t'        j(                  |«      }t        j*                  |«      –— y y y # 1 sw Y   ŒxY w# t        $ r t        j                  dd¬«       Y Œòw xY w# t        $ r t        j                  dd¬«       Y y w xY w­w)NrŸ  z,fx graph cache unable to load compiled graphTrm  r  )r+  r0  r}   r~   r  r   Úlistdirr´   r   Úpicklerµ   Ú	Exceptionru  rv  rå   r  rŠ  rÀ   r  r  Ú	b64decodeÚloads)	r  r~   r?  Ú
cache_datar  r$  rÒ   ÚlocalÚremote_caches	         €€€rd   Úiterate_over_candidatesz;FxGraphCache._lookup_graph.<locals>.iterate_over_candidatesü  sN  øè ø€ ÙÜ%×:Ñ:¸3Ó?�Ü—7‘7—>‘> &Ô)Ü &¤r§z¡z°&Ó'9Ó :ò ˜ðÜ!%¤b§g¡g§l¡l°6¸4Ó&@À$Ó!Gð 5È1Ü&,§k¡k°!£nÒ 4÷5øðñ ð
Ø&2×&6Ñ&6°sÓ&;Ð;˜
ÐHÜ)¨*´dÔ;Ð;Ð;Ø)¨&Ñ1˜Ü)¨$´´e°Ô=Ð=Ð=Ü"(×"2Ñ"2°4Ó"8˜Ü$Ÿl™l¨7Ó3Ó3ð Ið ÷5ð 5ûä(ò ÜŸK™KØ NØ)-ð (ö ðûô !ò Ü—K‘KØFÐQUð  ö ðüsg   ƒAE4Á*D(ÂDÂD(Â&E4Â+A.E ÄE4ÄD%	Ä!D(Ä( EÅE4Å
EÅE4Å E1Å.E4Å0E1Å1E4zEfx graph cache key %s evaluating guards [%s] with values %s => hit=%srq   é   ÚinductorÚfxgraph_lookup_write_filer+   Tr1  z#include\s*"[^"]+ú"ú
#include "r½   z"Failed to load cached artifact: %sz*fx graph cache key %s post-load guards: %srR   úOutput code written to: %szOutput code: 
%sÚinductor_output_codec                 ó   •— d‰ iS )NÚfilenamer`   )Úartifact_paths   €rd   r�  z,FxGraphCache._lookup_graph.<locals>.<lambda>n  s   ø€ �Z Ð/€ rf   c                 ó   •— ‰ S r_   r`   )r  s   €rd   r�  z,FxGraphCache._lookup_graph.<locals>.<lambda>o  s   ø€ ˜t€ rf   ©Ú
payload_fn)rÃ   z&Generator[CompiledFxGraph, None, None])+r+  r:  r2  rO   Úguards_exprró   Úevaluate_guards_expressionru  rê  r  Ú	cache_keyÚsource_coder}   r~   r  r!   r   rµ  r7  Úcpp_prefix_pathr  ÚreÚsubr¿   ÚPyCodeCacheÚload_by_key_pathÚcache_linemaprö  Úcallr  ÚOSErrorÚerrorÚguardsr&   ÚCachedMetricsHelperÚapply_deltasÚmetrics_deltasÚcounter_deltasÚgraphrS   Úsave_output_codeÚoutput_code_logrJ   )rÒ   rÎ  rC  rD  r8  Úsymintsrd  ÚhintsrE  re  Ú	candidaterç   Úcpp_ppÚpatternÚcheckrS   rO  r  s   ` ``            @@rd   Ú_lookup_graphzFxGraphCache._lookup_graphë  sç  ü€ ô !×/Ñ/Ó1ˆ	ØÐ$Ð$Ð$ä×5Ñ5°nÓEˆØ&-Ö. ”˜!•Ð.ˆÐ.÷	ð: ˆá0Ó2ò 	ˆIØ×(Ò(à!�Ùô Ø×4Ñ4°Y×5JÑ5JÈEÓRóˆCô �I‰IØWØØ×%Ñ%ØØôò Ø!�Ùð-	ð0 ˆ=Øô ! §¡°$Ó7¸Ñ:ˆØ× Ñ ˆÜ�w‰w�~‰~˜mÔ,Ü�ZÑ Ð!<Ó=ÀÑBÓ=Ü”—‘—‘ Ó/Ó0×6Ñ6¸tÈdÐ6ÔSÜ$Ó&ˆFÜ�w‰w×Ñ Ó'¨4Ñ/Ø˜T‘>àð "3´2·7±7×3CÑ3CÀFÓ3KÐ2LÈAÐN�GÜŸ6™6 '¨Z¸°x¸qÐ+AÀ4ÓH�Dä˜¨¸Õ=ð	Ü%0×%AÑ%AØ—‘ØØ×#Ñ#Ø—‘ó	&÷
 ‰dð Ô"ð ×ÒÜØ×4Ñ4°U×5FÑ5FÈÓPóˆEð ˜D‘=Ð �=Ü�I‰IØ<¸cÀ9×CSÑCSôô 	×#Ñ#×0Ñ0°×1EÑ1EÔFÜ�Ó × 4Ñ 4Ñ4Óå(à&ˆ×&Ñ& tÔ,Ü×ÑÐ:¸MÔJÜ×ÑÐ1°4Ô8äØ"Û/Û#õ	
ð
 ˆùòo /øôl ò 	ô �I‰IÐ:¸MÔJÙð		ús   ·LÇAL ÌL2Ì1L2c                ó(  — t        || «       |rj| j                  rQd| j                  v rt        d| j                  › �«       nt        d   dxx   dz  cc<   t        j                  |«       nt        || |«       | j                  }t        || |«       | S )a—  
        Run a set of post processing steps after loading from the cache. These involve:
         - Setting the tracing context output strides
         - Running cudagraphs if enabled
         - Realigning inputs

        This runs whether or not we have a cache hit, and always runs directly after we get a CompiledFxGraph.
        The results of this function are *not* saved in the cache itself.
        rw   r   rG  Úcudagraph_skipsr+   )
rI   r  r  r=   r!   rE   r  r  rÒ  r  )r  rÎ  r  rÒ  s       rd   Úpost_compilezFxGraphCache.post_compiles  s¢   € ô 	+¨>¸>ÔJáð ×8Ò8Ø˜^×8Ñ8Ñ8Ü7Ø5°n×6_Ñ6_Ð5`Ðaõô ˜ZÑ(Ð):Ó;¸qÑ@Ó;Ü×!Ñ! *Õ-ä&Ø"Ø"Øôð
 )×8Ñ8ˆô 	ØØØô	
ð Ðrf   c                ó¢  — t        |«      }d|_        t        j                  «       }|€J ‚t        j	                  |«      }|j                  |«      }|j                  ||¬«      |_        	 t        j                  |«      }		 |r‚t        j                  | «      }
t        j                   j#                  |
«      st        j$                  |
d¬	«       t        j                   j'                  |
t)        |	«      «      }t+        ||	d¬
«       |rVt-        |j.                  xs ddz  «      }t1        j2                  |	«      j5                  d«      |dœ}|j7                  | |«       yy# t        $ r. t        j                  dd¬«       t        d   dxx   dz  cc<   Y yw xY w# t        $ r. t        j                  dd¬«       t        d   dxx   dz  cc<   Y yw xY w)z=
        Store a serialized CompiledFxGraph on disk.
        N)r÷  r`  z1fx graph cache unable to serialize compiled graphTrm  rG  Úfxgraph_cache_pickle_errorr+   rs   r½   r   g    €„.Ar¾  )r  Útime_taken_msz!fx graph unable to write to cacheÚfxgraph_cache_write_error)r   r  r+  r:  r2  Úget_pruned_guardsÚproduce_guards_expressionrS  r>  r    r?  ru  rv  r!   r0  r}   r~   r  r€   r   r  r¿   r  Ú_time_taken_nsr  Ú	b64encoder  Úput)rÒ   r  rÎ  rC  rD  Údisk_compiled_graphr8  rh  r`  r$  r  r~   rt  rB  s                 rd   Ú_save_graphzFxGraphCache._save_graph¡  s»  € ô # >Ó2Ðð
 04ÐÔ,ô !×/Ñ/Ó1ˆ	ØÐ$Ð$Ð$Ü×5Ñ5°nÓEˆØ×,Ñ,¨WÓ5ˆØ*3×*MÑ*MØ ¨ð +Nó +
ÐÔ'ð	Ü—l‘lÐ#6Ó7ˆGð	CÙÜ%×:Ñ:¸3Ó?�Ü—w‘w—~‘~ fÔ-Ü—K‘K °Õ6ô
 —w‘w—|‘| F¬K¸Ó,@ÓA�Ü˜T 7°dÕ;áÜ #Ð%8×%GÑ%GÒ%LÈ1ÐQTÑ$TÓ U�ä"×,Ñ,¨WÓ5×<Ñ<¸WÓEØ%2ñ*�
ð × Ñ   jÕ1ð øô' ò 	Ü�K‰KØCÈdð ô ô �ZÑ Ð!=Ó>À!ÑCÓ>Ùð	ûô4 ò 	CÜ�K‰KÐ;ÀdˆKÔKÜ�ZÑ Ð!<Ó=ÀÑBÕ=ð	Cús%   Á*E Â CF Å4FÆFÆ4GÇGc                ó$  — t         j                  st         j                  j                  rt	        d«      ‚t
        j                  «       € t        j                  d«       t	        d«      ‚| j                  j                  D ]Ž  }t        |j                  t        j                  j                  «      rt	        d«      ‚|j                   dk(  sŒLt        t#        | |j                  «      t        j$                  j&                  «      sŒ…t	        d«      ‚ y)z“
        Check some conditions that would preclude caching and raise BypassFxGraphCache
        to bypass in case caching is not possible.
        z@Freezing may introduce constants that aren't static across runs.Nzfx graph cache no shape envzNo shape env.z!Can't cache HigherOrderOperators.ÚgetattrzCan't cache torchbind objects.)r$   ÚfreezingÚaot_inductorÚuse_runtime_constant_foldingr[  r+  r:  ru  rê  re  Únodesr  Útargetru   Ú_opsÚHigherOrderOperatorrì   r~  Ú_CÚScriptObject)rÍ  Únodes     rd   Ú_check_can_cachezFxGraphCache._check_can_cacheà  sÌ   € ô �?Š?œf×1Ñ1×NÒNÜ$ØRóð ô ×&Ñ&Ó(Ð0Ü�I‰IÐ3Ô4Ü$ _Ó5Ð5ð
 —H‘H—N‘Nò 	KˆDÜ˜$Ÿ+™+¤u§z¡z×'EÑ'EÔFÜ(Ð)LÓMÐMØ�w‰w˜)Ó#¬
Ü˜˜DŸK™KÓ(¬%¯(©(×*?Ñ*?õ)ô )Ð)IÓJÐJñ	Krf   c                ór  ‡— |s	|sJ d«       ‚d}d}d}	i Š	 t         j                  |«       t        ||||«      \  }
}|
‰d<   |‰d<   d}|r4d}	 t        j                  «       rddlm}  ||«      }nddlm}  ||«      }t         j                  |
|||«      }|€~t        j                  d|
«       t        d   dxx   dz  cc<   d}t!        «       }|}	 | ||||«      }t!        «       |z
  |_        |j"                  ‰d<   t         j%                  |
||||«       n^t        j                  d|
«       t        d   dxx   dz  cc<   d}t!        «       }	|j"                  x}�|‰d<   t'        |«      x}dk7  r|‰d<   |
|_        |s | ||||«      }|€J ‚|‰d<   t3        «       }|j5                  d|› �|	‰¬«       t6        j8                  j;                  d d!„ ˆfd"„¬#«       t         j=                  |||d$   «       |S # t        $ r#}d}t        j                  d	|«       Y d}~�Œ�d}~wt        $ r d}t        j                  d
d¬«       Y �ŒÅw xY w# t*        $ rf}t        d   dxx   dz  cc<   d}t        j-                  d|«       t/        |«      ‰d<   |rt1        dt/        |«      «       t!        «       }	Y d}~�Œ6d}~ww xY w)%z�
        Load a compiled graph from the cache. If a cached entry does not exist,
        compile the graph and save it to the cache.
        z(at least one of them needs to be enabledNrÒ   Ú
componentszfx-graph-v1r   )ÚFbRemoteFxGraphCache)ÚRemoteFxGraphCachez#Unable to create a remote cache: %szUnable to create a remote cacheTrm  zfx graph cache miss for key %srG  Úfxgraph_cache_missr+   ÚmissÚtime_taken_nszfx graph cache hit for key %sÚfxgraph_cache_hitrç   r&  Úephemeral_timeout_increaseÚfxgraph_cache_bypassÚbypassz%Bypassing FX Graph Cache because '%s'Úcache_bypass_reasonÚbypass_fx_graphÚcache_stateÚfx_graph_cache_)rW  Úartifactc                 ó   — dddœS )NÚfx_graph_cache_hashrŸ   )r�   r5  r`   r`   rf   rd   r�  z#FxGraphCache.load.<locals>.<lambda>e  s   € Ø-Ø"ñ!€ rf   c                 ó.   •— t        j                  ‰ «      S r_   )rŸ   r    )Ú
cache_infos   €rd   r�  z#FxGraphCache.load.<locals>.<lambda>i  s   ø€ œtŸz™z¨*Ó5€ rf   )Úmetadata_fnrR  r  )r+  r‰  rí  r$   r¿  Útorch._inductor.fb.remote_cacherŒ  Útorch._inductor.remote_cacher�  r—   ru  rv  r?  rn  rê  r!   r   rx  r|  r)  Ú_fx_graph_cache_keyr[  r"  rÀ   r*   r#   Úlog_instant_eventru   Ú_loggingrJ   rq  )Úcompile_fx_fnrÍ  rÎ  rÏ  rÒ  rC  Úremoter  r—  Úcache_event_timerÒ   r’  rD  Úcache_idrŒ  r�  rÿ   Ú
start_timer&  Úephemeral_increaseÚchromium_logr�  s                        @rd   rµ   zFxGraphCache.loadý  s'  ø€ ñ ™ÐJÐ JÓJˆØˆØˆØÐØ%'ˆ
ðG	)Ü×)Ñ)¨"Ô-Ü5Ø�N I¨ó ÑˆC�ð !$ˆJ�uÑØ'2ˆJ�|Ñ$à>BˆLÙØ(�ðRÜ×'Ñ'Ô)ÝXá';¸HÓ'E™åSá'9¸(Ó'C˜ô *×7Ñ7Ø�^ U¨LóˆNð Ð%Ü—	‘	Ð:¸CÔ@Ü˜Ñ$Ð%9Ó:¸aÑ?Ó:Ø$�Ü$›Y�
Ø#-Ð Ù!.Ø˜¨¸ó"�ô 18³	¸JÑ0F�Ô-Ø.<×.KÑ.K�
˜?Ñ+Ü×(Ñ(ØØ"Ø"ØØ õô —	‘	Ð9¸3Ô?Ü˜Ñ$Ð%8Ó9¸QÑ>Ó9Ø#�Ü#*£9Ð Ø%3×%BÑ%BÐB�MÐOØ2?�J˜Ñ/ä.\Ø)ó/ð Ð*ð ò	ð
 DV˜
Ð#?Ñ@Ø14ˆNÔ.ñ Ù*Ø�N O°YóˆNð Ð)Ð)Ð)Ø$/ˆ
�=Ñ!Ü0Ó2ˆØ×&Ñ&Ø˜k˜]Ð+Ð-=È
ð 	'ô 	
ô 	�‰×'Ñ'Øñó 6ð 	(ô 	
ô 	×!Ñ!Ø˜N¨I°lÑ,Cô	
ð ÐøôW +ò Jà#'�LÜ—K‘KÐ EÀq×IÒIûÜ ò RØ#'�LÜ—K‘KÐ AÈD�K×QðRûôP "ò 	)Ü�ZÑ Ð!7Ó8¸AÑ=Ó8Ø"ˆKÜ�H‰HÐ<¸aÔ@Ü03°A³ˆJÐ,Ñ-ÙÜ Ð!2´C¸³FÔ;Ü&›yÖûð	)úsO   –6I Á1G4 Á>C=I Ç4	IÇ=HÈI È%IÉ I ÉIÉI É	J6ÉAJ1Ê1J6c                 ór   — 	 t        j                  t        j                  «       «       y# t        $ r Y yw xY w)z.
        Clear out the on-disk cache.
        N)ÚshutilÚrmtreer+  r.  ÚFileNotFoundErrorr`   rf   rd   ÚclearzFxGraphCache.clearq  s.   € ð
	Ü�M‰Mœ,×3Ñ3Ó5Õ6øÜ ò 	Ùð	ús   ‚'* ª	6µ6N©rÃ   rÀ   )rÒ   rÀ   rÃ   rÀ   )rë   rC  rÃ   zList[torch.SymInt])rÃ   zOptional[ShapeEnv])
rÒ   rÀ   rÎ  rå  rC  ró   rD  ú!Optional[RemoteCache[JsonDataTy]]rÃ   zOptional[CompiledFxGraph])r  rî  rÎ  rå  r  rE   rÃ   rî  )rÒ   rÀ   r  rî  rÎ  rå  rC  ró   rD  r±  rÃ   rÆ   )rÍ  rä  rÃ   rÆ   )r¤  r  rÍ  rä  rÎ  rå  rÏ  rÄ   rÒ  ræ  rC  ró   r¥  ró   rÅ   )rÇ   rÈ   rÉ   rF  rÊ   r.  r0  r2  r:  rn  rq  r|  r‰  rµ   r¯  r`   rf   rd   r+  r+  ­  s½  „ ñð: ò4ó ð4ð òHó ðHð òRó ðRð ò'ó ð'ð ðEØðEà*ðEð ðEð 8ð	Eð
 
#òEó ðEðN ð+Ø'ð+à*ð+ð ð+ð 
ò	+ó ð+ðZ ð<CØð<Cà'ð<Cð +ð<Cð ð	<Cð
 8ð<Cð 
ò<Có ð<Cð| òKó ðKð8 ðqØ)ðqà ðqð +ðqð "ð	qð
 'ðqð ðqð òqó ðqðf òó ñrf   r+  r   Ú_StrideExprStrc                  óL  — e Zd ZU dZded<   ded<    ej                  d¬«      Zded<   d	ed
<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   d ed!<   d"ed#<   d$ed%<   d&Zd'ed(<   d&Z	d)ed*<   d&Z
ded+<   	 	 	 	 	 	 	 	 	 	 	 	 	 	 d.d,„Zd/d-„Zy&)0rî  zr
    Class holding a compiled FX graph. This is the object serialized on disk
    to support FxGraph caching.
    úOptional[Callable[..., Any]]r  rÀ   rU  F)r#  rV  úOptional[List[Tuple[int, str]]]r\  zSet[str]r  zSet[int]r
  Úmutated_inputsrø  zDict[str, torch.Tensor]rö  z Dict[str, torch._C.ScriptObject]Útorchbind_constantsz4Optional[List[Optional[Tuple[_StrideExprStr, ...]]]]Úoutput_stridesúOptional[str]r  úmetrics.CachedMetricsDeltasrc  úCounter[str]rd  rS  zOptional[CudagraphCachedInfo]r  rÄ   rÏ  ræ  rÒ  zOptional[BoxedDeviceIndex]r  NzOptional[int]rx  zOptional[bool]Ú_boxed_callr¡  c                ó~  — || _         |j                  | _        |j                  r3t        |j                  «      5 }|j	                  «       | _        d d d «       |j                  | _        t        |j                  «      | _        t        |j                  «      | _	        t        |j                  «      | _
        t        |j                  «      | _        |j                  | _        |j                  | _        || _        || _        || _        || _        d | _        d | _        i | _        d| _        d | _        y # 1 sw Y   ŒäxY w)Nr`   )r  rU  Ú
cache_pathr´   r§  rV  r\  rÑ  r  r
  r¶  rø  rö  r·  r¸  r  rc  rd  rS  r  rÏ  rÒ  r  )r¯   r  re  r¸  r  rc  rd  r?  s           rd   r°   zCompiledFxGraph.__init__¤  s  € ð !1ˆÔØŸ™ˆŒØ×ÒÜ�e×&Ñ&Ó'ð ,¨1Ø#$§6¡6£8�Ô ÷,à"×0Ñ0ˆÔä × 2Ñ 2Ó3ˆÔÜ˜u×0Ñ0Ó1ˆÔÜ! %×"6Ñ"6Ó7ˆÔÜ"% e×&>Ñ&>Ó"?ˆÔØŸ™ˆŒØ#(×#<Ñ#<ˆÔ Ø,ˆÔØ*DˆÔ'Ø,ˆÔØ,ˆÔØˆÔØ"ˆÔØˆŒØ!ˆÔØ*.ˆÕ'÷%,ð ,ús   ºD3Ä3D<c                ó@   — | j                   €J ‚| j                  |«      S r_   )r  )r¯   rë   s     rd   Ú__call__zCompiledFxGraph.__call__Ä  s%   € Ø×$Ñ$Ð0Ð0Ð0Ø×$Ñ$ VÓ,Ð,rf   )r  r´  re  rS   r¸  z*List[Optional[Tuple[_StrideExprStr, ...]]]r  r¹  rc  rº  rd  r»  rÃ   rÆ   )rë   rC  rÃ   r   )rÇ   rÈ   rÉ   rF  rG  rQ  ÚfieldrV  rx  r¼  r¡  r°   rÀ  r`   rf   rd   rî  rî    sü   … ñð
 3Ó2ØƒNØ(�{×(Ñ(¨eÔ4€K�Ó4Ø2Ó2ØÓØÓØÓØ Ó Ø&Ó&Ø9Ó9ØHÓHØ -Ó-Ø/Ó/Ø Ó ð Óà1Ó1ØÓØ"Ó"Ø :Ó:à$(€N�MÓ(Ø"&€K�Ó&Ø)-Ð˜Ó-ð/à6ð/ð ð/ð Cð	/ð
 %2ð/ð 4ð/ð %ð/ð 
ó/ô@-rf   c                óÒ   — t        j                  | «      }	 t        j                  |«       y # t        j                  $ r&}t        j                  ||j                  «      |‚d }~ww xY wr_   )ÚshlexÚsplitÚ
subprocessÚ
check_callÚCalledProcessErrorr%   ÚCppCompileErrorÚoutput)Úcmd_Úcmdrÿ   s      rd   Úrun_command_and_checkrÌ  É  sR   € Ü
�+‰+�dÓ
€Cð8Ü×Ñ˜cÕ"øÜ×(Ñ(ò 8Ü×!Ñ! # q§x¡xÓ0°aÐ7ûð8ús   —- ­A&Á !A!Á!A&c                óÊ   — | j                  d«      rt        j                  j                  | «      S | j                  d«      rt        j                  j                  | «      S | dfS )zDReturns the path where the AOT Inductor compiled kernels are stored.ú.soz.pt2rp   )Úendswithr}   r~   rÄ  )r~   s    rd   Úsplit_aot_inductor_output_pathrÐ  Ñ  sK   € ð ‡}�}�UÔÜ�w‰w�}‰}˜TÓ"Ð"Ø	�‰�vÔ	Ü�w‰w�}‰}˜TÓ"Ð"à�Rˆxˆrf   c                  óv   — e Zd ZU i Zded<    eej                  «      Zedd„«       Z	edd„«       Z
ed	d„«       Zy)
ÚCudaKernelParamCachezDict[str, Dict[str, str]]r¨   c                ó¨   — t        |||t        t        j                  j                  «      d   ¬«      \  }}||t        «       <   || j                  |<   y )Nr   )r%  r  )r*  rÐ  r$   r€  Úoutput_pathrŒ   r¨   )rx  rÒ   Úparamsr   Úbin_typerr   r~   s          rd   rÑ  zCudaKernelParamCache.setá  sU   € äØØØÜ8Ü×#Ñ#×/Ñ/óàñô	
‰ˆˆ4ð 59ˆÔ.Ó0Ñ1àˆ�	‰	�#Šrf   c                ó:   — | j                   j                  |d «      S r_   )r¨   rå   )rx  rÒ   s     rd   rå   zCudaKernelParamCache.getð  s   € à�y‰y�}‰}˜S $Ó'Ð'rf   c                ó6   — | j                   j                  «       S r_   )r¨   rÐ   )rx  s    rd   Úget_keyszCudaKernelParamCache.get_keysô  s   € à�y‰y�~‰~ÓÐrf   N)
rÒ   rÀ   rÕ  zDict[str, str]r   rÀ   rÖ  rÀ   rÃ   rÆ   )rÒ   rÀ   rÃ   zOptional[Dict[str, str]])rÃ   zKeysView[str])rÇ   rÈ   rÉ   r¨   rG  rÊ   r¯  Úcache_clearrš  rÑ  rå   rÙ  r`   rf   rd   rÒ  rÒ  Ü  sU   … à')€EÐ$Ó)Ù˜uŸ{™{Ó+€Kàò ó ð ð ò(ó ð(ð ò ó ñ rf   rÒ  c                  ó2   — e Zd Ze	 	 	 	 	 	 	 	 	 	 dd„«       Zy)ÚAotCodeCompilerc           
     óÊ  ‡‡‡0‡1‡2‡3‡4‡5‡6‡7— t         j                  dk(  rt        d«      ‚t        «        t	        «       }t        ddt        ||‰j                  ¬«      ¬«      }t        |j                  «       «      }dŠ3d}t        j                  «       rPt        j                  «       Š6|s%‰j                  rt        j                  «       Š7dŠ3d}nt        j                  «       Š7nd	Š6d
Š7t!        t        j"                  j$                  «      \  }	}
t'        ‰d||	¬«      \  }Š5t(        j+                  d‰5«       t-        dˆ5fd„ˆfd„¬«       t.        j0                  j3                  t.        j0                  j5                  ‰5«      d   |«      Š2d;ˆ2ˆ3ˆˆ6ˆ7fd„}d;ˆ2fd„}ddlm} t;        «       } |t.        j0                  j3                  ||dz   «      t<        ¬«      }|5  |rKt.        j0                  j?                  ‰5«      d   dz   }tA        |d«      5 }|j'                  |«       d d d «       |
rt        j"                  j$                  n$t.        j0                  j?                  ‰5«      d   dz   }t.        j0                  j?                  ‰5«      d   dz   }tC        ˆfd„‰jD                  jG                  «       D «       «      Š1d<d„Š4tI        ˆ1ˆ4ˆfd„‰jD                  jK                  «       D «       «      }t        j                  «        xr |dkD  }t        j"                  jL                  rd}t        j"                  jN                  r�tQ        ‰5«      \  }}t        ||‰j                  d||¬ «      }t        |‰5||¬!«      }|j                  «       }|jS                  «       }t.        j0                  j?                  ‰5«      d   d"z   }|jU                  |«       nÒtQ        ‰5«      \  }}t        ||‰j                  d||¬ «      }t        |‰5||¬!«      }|j                  «       }|jS                  «       }tV        jY                  d#|«       ‰3rWt.        j0                  j?                  ‰5«      d   dz   }t[        ‰5||j5                  «       «       t/        j\                  |d$«       nt_        |«       d=d%„Š0d&j3                  ˆ0ˆ1ˆfd'„‰jD                  jG                  «       D «       «      }|s|}d}nxta        tb        te        jf                  dte        jh                  td        jj                  «      jl                  d(«      jo                  «       «      }tq        jr                  d)|d*z   |«      } ||d+œt         j                     |«      } t        j"                  jN                  �r9tQ        |«      \  }!}"t        ||‰j                  |¬,«      }#t        |!|| g|"|#¬!«      }$|$j                  «       }%|$jS                  «       }t.        j0                  j?                  ‰5«      d   d-z   }&|#jU                  |&«       dd.l:m;}' |rpt.        j0                  j?                  ‰5«      d   d/z   }(tA        |(d0«      5 })|)j'                  |«       |)j'                  tq        jr                  d1|«      «       d d d «        |'t.        j0                  j5                  ‰5«      d   «      }*|*cd d d «       S tQ        |«      \  }!}"t        ||‰j                  |¬,«      }#t        |!|| g|"|#¬!«      }$|$j                  «       }%|$jS                  «       }tV        jY                  d2|%«       ‰3ru|
rt        j"                  j$                  n$t.        j0                  j?                  ‰5«      d   dz   }t[        || g||%j5                  «       «       t/        j\                  |d3«       nt_        |%«       |r•dd l<}+|+j{                  «       },tm        d4|,«      }-tA        |d5«      5 }.|.j}                  «       }/|.j'                  d6|-|/|-z  z
  z  «       |.j'                  |«       |.j'                  tq        jr                  d1|«      «       d d d «       tA        ‰5d7«      5 }|j'                  d8«       |j'                  d9|› d8�«       |j'                  d:|%› d8�«       d d d «       d d d «       |S # 1 sw Y   �Œ‰xY w# 1 sw Y   �Œ+xY w# 1 sw Y   Œ}xY w# 1 sw Y   Œ9xY w# 1 sw Y   S xY w)>NrW   z.AotCodeCompiler not yet supported for inductorÚoÚi)Úvec_isarw   Úaot_mode©r�   ÚsourcesÚBuildOptionFTÚldÚobjcopyÚcpp)r  r  rK  Ú
graph_dumpc                 ó   •— dd‰ dœS )NÚinductor_aot_coderç  )r�   r€  rN  r`   )Ú
input_paths   €rd   r�  z)AotCodeCompiler.compile.<locals>.<lambda>3  s   ø€ Ø+ØØ&ñ€ rf   c                 ó   •— ‰ S r_   r`   )rV  s   €rd   r�  z)AotCodeCompiler.compile.<locals>.<lambda>8  s   ø€ ˜{€ rf   rQ  r   c           	     óö  •— t        | d‰¬«      \  }}t        j                  j                  |«      d   dz   }‰	rv‰› dt        j                  j	                  |«      › dt        j                  j	                  |«      › �}t        |||j                  «       «       t        j                  |d«       n‰› d|› d|› �}t        |«       t        j                  d|«       ‰
j                  t        ‰
j                  j                  «       «      z  rt        | «      d	kD  rt!        d
«      ‚d}nd}t"        t"        dz
  z  dk(  r	t"        dk\  sJ d«       ‚‰› d|› dt"        › d|› d|› �	}t        j                  d|«       t        |«       d|› �}t        j                  d|«       t        |«       ‰	r5t%        j&                  ddt        j                  j	                  |«      «      }nt%        j&                  dd|«      }g }|j)                  ‰› d|› d|› �«       |j)                  ‰› d|› d|› �«       |j)                  ‰› d|› d|› �«       t        j                  ddj+                  |«      «       |D ]  }t        |«       Œ |S )NÚbin©r  r   ú.oz -r -b binary -o ú é¤  zaot constant binary command: %sé ”5wzPModels with buffer mutation included doesn't support constants greater than 2GB!z .data=.ldataz1 .data=.lrodata,alloc,load,readonly,data,contentsr+   é@   zmust be power of 2 and >= 64z --rename-sectionz --set-section-alignment .data=z'aot constant rename section command: %szrm z$aot constant bin removal command: %sz[\W]rr   z --redefine-sym _binary_z#_start=_binary_constants_bin_start z!_size=_binary_constants_bin_size z_end=_binary_constants_bin_end z'aot constant binary redefine symbol: %s)r*  r}   r~   Úsplitextr  Úcompile_filerÄ  ÚchmodrÌ  ru  rê  Úmutated_buffersrÑ  rö  rÐ   rˆ  Ú
ValueErrorrC   rX  rY  r‰  r   )Úconstsrr   Úconsts_pathÚconsts_orË  Úrename_dataÚbodyÚsymbol_listÚconsts_specified_dirÚfbcode_aot_cpu_rere  Ú
ld_commandÚobjcopy_commands           €€€€€rd   Ú_compile_consts_linuxz6AotCodeCompiler.compile.<locals>._compile_consts_linux@  sš  ø€ Ü"ØØØ2ô‰NˆAˆ{ô —w‘w×'Ñ'¨Ó4°QÑ7¸$Ñ>ˆHÙ Ø#˜Ð$5´b·g±g×6FÑ6FÀxÓ6PÐ5QÐQRÔSU×SZÑSZ×ScÑScÐdoÓSpÐRqÐr�Ü˜[¨(°C·I±I³KÔ@Ü—‘˜ 5Õ)à#˜Ð$5°h°Z¸qÀÀÐN�Ü% cÔ*Ü�I‰IÐ7¸Ô=à×$Ñ$¤s¨5¯?©?×+?Ñ+?Ó+AÓ'BÒBô �v“; Ò.Ü$Øjóð ð .‘ð
 R�ô œ{¨Q™Ñ/Øòä" bÒ(ðIà*HóIð )ð #Ð#Ð#4Ø�-Ø1´+°Ø�H�:˜Q˜x˜jð*ð ô �I‰IÐ?ÀÔEÜ! #Ô&à˜�}Ð%ˆCÜ�I‰IÐ<¸cÔBÜ! #Ô&á Ü—v‘v˜g s¬B¯G©G×,<Ñ,<¸[Ó,IÓJ‘ä—v‘v˜g s¨KÓ8�àˆKØ×ÑØ"Ð#Ð#;¸D¸6ÐAdÐemÐdnÐoôð ×ÑØ"Ð#Ð#;¸D¸6ÐAbÐckÐblÐmôð ×ÑØ"Ð#Ð#;¸D¸6ÐA`ÐaiÐ`jÐkôô �I‰IÐ?ÀÇÁÈ+ÓAVÔWØ"ò +�Ü% cÕ*ð+àˆOrf   c                ó2  •— t         j                  j                  r't        | d‰¬«      \  }}t        j                  d|«       t        | «      dkD  }d}|dz  }|dz  }|s| D ]  }|d|› d	�z  }Œ | s |d
z  }n|dz  }|dt        | «      dz
  › d	�z  }|dz  }|dz  }t        |d‰¬«      \  }}t        j                  j                  |«      d   dz   }t        «       › d|› d|› �}t        |«       |ršt        |d«      5 }	|	j                  d«       |	j                  d«      }
|
j                  d«      }|dk7  sJ ‚|	j                  |«       d}|t        | «      k  r(|	j                  | |d  «      }||z  }|t        | «      k  rŒ(d d d «       |S |S # 1 sw Y   |S xY w)Nrî  rï  zbinary constants path: %si   z	.section	__DATA,__data
z%	.globl	__binary_constants_bin_start
z__binary_constants_bin_start:
z	.byte ré  z
	.space 1
z	.quad 0x1234567899abcdef
z	.space é   z".globl	__binary_constants_bin_end
z__binary_constants_bin_end:
ÚSr   rð  ú -c -o rñ  zr+bs   ïÍ«™xV4rÕ   )r$   r€  Údebug_dump_consts_binr*  ru  rê  rˆ  r}   r~   rõ  r7   rÌ  r´   Úseekr§  Úfind)rú  rr   Ú_binary_constants_pathÚis_large_constsÚ
consts_asmr  rû  rü  rË  r?  ÚhdrÚ	start_idxÚposÚrcr   s                 €rd   Ú_compile_consts_darwinz7AotCodeCompiler.compile.<locals>._compile_consts_darwin„  sÜ  ø€ Ü×"Ñ"×8Ò8Ü,1ØØØ"6ô-Ñ)�Ð)ô
 —	‘	Ð5Ð7MÔNä! &›k¨DÑ0ˆOØ6ˆJØÐDÑDˆJØÐ;Ñ;ˆJÙ"Øò 3�AØ H¨Q¨C¨rÐ"2Ñ2‘Jð3ñ Ø .Ñ0‘JàÐ<Ñ<�
Ø 	¬#¨f«+¸©/Ð):¸"Ð=Ñ=�
ØÐ@Ñ@ˆJØÐ9Ñ9ˆJÜ"ØØØ2ô‰NˆAˆ{ô
 —w‘w×'Ñ'¨Ó4°QÑ7¸$Ñ>ˆHÜ%Ó'Ð(¨°¨z¸¸;¸-ÐHˆCÜ! #Ô&ÙÜ˜( EÓ*ð 
"¨aØ—F‘F˜1”IØŸ&™& ›,�Cà #§¡Ð)LÓ M�IØ$¨š?Ð*˜?Ø—F‘F˜9Ô%Ø�CØ¤ F£Ò+ØŸW™W V¨C¨D \Ó2˜Ø˜r™	˜ð ¤ F£Ó+÷
"ð ˆO�8ˆO÷
"ð ˆOús   Ã<BFÆF©ÚFileLockú.lock©Útimeoutz.jsonr3  rÎ  rð  c              3  óp   •K  — | ]-  }|‰j                   vr‰j                  |«      j                  –— Œ/ y ­wr_   )Úfolded_constantsÚget_original_value_of_constantÚis_cuda)rñ   r�   re  s     €rd   rò   z*AotCodeCompiler.compile.<locals>.<genexpr>Ç  s8   øè ø€ ò àØ˜u×5Ñ5Ñ5ð ×4Ñ4°TÓ:×BÕBñùs   ƒ36c                óÆ   — | j                   r)t        j                  j                  j	                  | «      n| j                  «       j                  «       }|r|S t        |«      S r_   )rZ  ru   ÚopsÚmkldnnÚ_nbytesÚuntyped_storageÚnbytesr,   )ÚtensorÚall_cudaÚn_bytess      rd   Úget_nbytes_of_tensorz5AotCodeCompiler.compile.<locals>.get_nbytes_of_tensorÍ  sT   € ð ×'Ò'ô —I‘I×$Ñ$×,Ñ,¨VÔ4à×/Ñ/Ó1×8Ñ8Ó:ð ñ
 #+�wÐ?´°w³Ð?rf   c              3  óR   •K  — | ]  \  }}|‰j                   vr ‰|‰«      –— Œ  y ­wr_   )r  )rñ   r�   r#  r$  r&  re  s      €€€rd   rò   z*AotCodeCompiler.compile.<locals>.<genexpr>Õ  s2   øè ø€ ò á"�T˜6Ø˜u×5Ñ5Ñ5ñ % V¨X×6ñùs   ƒ$'ró  )rà  rw   rá  Úcompile_onlyÚuse_absolute_pathÚuse_mmap_weights©r�   rã  Ú
output_dirrä  z_compile_flags.jsonzaot compilation command: %srò  c                ó  — dd„}dd l }| j                  «       dk(  ry| j                  rSt        j                  j
                  j                  | «      }t        j                  j
                  j                  | «      }n>| j                  «       j                  «       }|j                  «       }|j                  «       }|j                  ||j                  |j                  |z  «      «      }t        |j                  «      }|r|S  ||«      S )Nc                ól   — | j                  t        | «      t        z   dz
  t        z  t        z  d«      }|S )Nr+   ó    )Úljustrˆ  rC   )Ú	raw_bytesÚpadded_bytess     rd   Ú_pad_to_alignmentzEAotCodeCompiler.compile.<locals>._to_bytes.<locals>._pad_to_alignment  s6   € Ø#,§?¡?Ü˜Y›¬+Ñ5¸Ñ9¼kÑIÌKÑWØó$�Lð (Ð'rf   r   rf   )r1  r  rÃ   r  )ÚctypesÚnumelrZ  ru   r  r  Údata_ptrr   r!  rm   r"  r   ÚPOINTERÚc_ubyter  Úcontents)	rS  r$  r3  r4  r6  r"  Út_cpuÚ	raw_arrayr1  s	            rd   Ú	_to_bytesz*AotCodeCompiler.compile.<locals>._to_bytes  sÐ   € ó(ó à—7‘7“9 ’>Øà—;’;Ü$Ÿy™y×/Ñ/×8Ñ8¸Ó;�HÜ"ŸY™Y×-Ñ-×5Ñ5°aÓ8‘Fà×-Ñ-Ó/×3Ñ3Ó5�EØ$Ÿ~™~Ó/�HØ"Ÿ\™\›^�Fà"ŸK™KØØ—N‘N 6§>¡>°FÑ#:Ó;ó�	ô " )×"4Ñ"4Ó5�	Ù$,�yÐNÑ2CÀIÓ2NÐNrf   rf   c              3  ój   •K  — | ]*  }|‰j                   vr ‰‰j                  |«      ‰«      –— Œ, y ­wr_   )r  r  )rñ   r�   r<  r$  re  s     €€€rd   rò   z*AotCodeCompiler.compile.<locals>.<genexpr>4  s9   øè ø€ ò *àØ˜u×5Ñ5Ñ5ñ ˜%×>Ñ>¸tÓDÀh×Oñ*ùs   ƒ03)r+   Úqqr  )ÚlinuxÚdarwin)rà  rw   rá  r)  z_linker_flags.json)Úpackage_aotiz_serialized_weights.binr4  Úqzaot linkage command: %sií  i @  za+bó    Úaré  z// Compile cmd
// z// Link cmd
// )rú  r  rÃ   rÀ   )r#  útorch.Tensorr$  ró   rÃ   r  )rS  rE  r$  ró   rÃ   r  )?ry   Úplatformrœ   r1   r:   r3   r5   rá  r#  Úget_command_liner$   r¿  rX   rå  Úobjcopy_fallbackræ  rÐ  r€  rÔ  r*  rg  r"  rJ   r}   r~   r   rÄ  Úfilelockr  r  ÚLOCK_TIMEOUTrõ  r´   rø   rö  rÐ   Úsumrù   Úforce_mmap_weightsÚpackager8   Úget_target_file_pathÚsave_flags_to_fileru  rê  rö  r÷  rÌ  r   r  ru   ÚrandintÚiinfoÚint64ÚmaxÚitemÚstructÚpackÚtorch._inductor.packagerA  ÚresourceÚgetpagesizeÚtell)8rx  re  rV  Úserialized_extern_kernel_nodesrw   Úpicked_vec_isaÚvec_isa_cmd_genÚcpp_commandr)  Úspecified_output_pathÚspecified_so_namerÒ   r  r  r  r  ÚlockÚoutput_jsonr?  Ú	output_soÚoutput_oÚconsts_sizer*  Úobject_output_nameÚobject_output_dirÚobject_build_optionsÚobject_builderÚcompile_cmdÚcompile_flagsÚserialized_weightsÚaot_constantsÚmagic_numberrü  Úoutput_namer,  Úso_build_optionsÚ
so_builderÚlink_cmdÚlinker_flagsrA  Úweight_fileÚ	f_weightsÚarchive_pathrX  Ú
page_size_Ú	page_sizeÚf_soÚso_sizer<  r$  r   r  r&  rë  r  r  s8    ``                                             @@@@@@@@rd   ÚcompilezAotCodeCompiler.compileú  s(  ÿù€ ô �<‰<˜7Ò"ÜÐOÓPÐPäÔä%›ˆÜ$ØØÜ+Ø&ØØŸ™ôô
ˆô ˜?×;Ñ;Ó=Ó>ˆà!ÐØ!ÐÜ×ÑÔÜ$Ÿ™Ó)ˆJÙ˜EŸNšNÜ"-×">Ñ">Ó"@�Ø$(Ð!Ø$(Ñ!ä"-×"5Ñ"5Ó"7‘àˆJØ'ˆOô
 +¬6×+>Ñ+>×+JÑ+JÓKñ	
Ø!ØäØØØØ/ô	
‰ˆˆZô 	×ÑÐ9¸:ÔFÜØóó
 +õ	
ô  "Ÿw™wŸ|™|¬B¯G©G¯M©M¸*Ó,EÀaÑ,HÈ#ÓNÐ÷B	ñ B	õH-	õ^ 	&ä“>ˆÙœŸ™Ÿ™ X¨s°W©}Ó=Ä|ÔTˆØñ b	=ñ .Ü Ÿg™g×.Ñ.¨zÓ:¸1Ñ=ÀÑG�Ü˜+ sÓ+ð <¨qØ—G‘GÐ:Ô;÷<ñ
 %ô ×#Ñ#×/Ò/ä—W‘W×%Ñ% jÓ1°!Ñ4°uÑ<ð ô —w‘w×'Ñ'¨
Ó3°AÑ6¸Ñ=ˆHäó à!ŸO™O×0Ñ0Ó2ôó ˆHó@ô õ à&+§o¡o×&;Ñ&;Ó&=ôó ˆKô $*×#3Ñ#3Ó#5Ð5ÒU¸+ÈÑ:UÐÜ×"Ñ"×5Ò5Ø#'Ð ä×"Ñ"×*Ò*ô ;¸:ÓFñØ&Ø%ä':Ø*ØØ"Ÿ^™^Ø!%Ø&7Ø%5ô(Ð$ô ",Ø+Ø&Ø0Ø 4ô	"�ð -×=Ñ=Ó?�Ø)×>Ñ>Ó@�ä "§¡× 0Ñ 0°Ó <¸QÑ ?ÐBWÑ W�Ø$×7Ñ7¸ÕFô ;¸:ÓFñØ&Ø%ä':Ø*ØØ"Ÿ^™^Ø!%Ø&7Ø%5ô(Ð$ô ",Ø+Ø&Ø0Ø 4ô	"�ð -×=Ñ=Ó?�Ø)×>Ñ>Ó@�ä—	‘	Ð7¸ÔEÙ$Ü!Ÿw™w×/Ñ/°
Ó;¸AÑ>ÀÑE�HÜ  ¨X°{×7HÑ7HÓ7JÔKÜ—H‘H˜X uÕ-ä)¨+Ô6óOð< "%§¡õ *à!ŸO™O×0Ñ0Ó2ô*ó "Ðñ
 $Ø 2�Ø ‘ä#ÜœŸ™ q¬%¯+©+´e·k±kÓ*B×*FÑ*FÈÓM×RÑRÓTó �ô !'§¡¨D°+À±/À<Ó P�ðØ.Ø0ñô �l‰lñð *ó+ˆHô
 ×"Ñ"×*Ó*Ü*PØó+Ñ'�˜Zô $7Ø*ØØ"Ÿ^™^Ø&7ô	$Ð ô (Ø$Ø% xÐ0Ø)Ø 0ô	�
ð &×6Ñ6Ó8�Ø&×;Ñ;Ó=�	ä!Ÿw™w×/Ñ/°
Ó;¸AÑ>ÐAUÑU�Ø ×3Ñ3°LÔAå@á#äŸ™×(Ñ(¨Ó4°QÑ7Ð:SÑSð  ô ˜k¨4Ó0ð H°IØ!Ÿ™Ð(:Ô;Ø!Ÿ™¬¯©°C¸Ó(FÔG÷Hñ  ,¬B¯G©G¯M©M¸*Ó,EÀaÑ,HÓI�Ø#÷cb	=ñ b	=ôf +QØó+Ñ'�˜Zô $7Ø*ØØ"Ÿ^™^Ø&7ô	$Ð ô (Ø$Ø% xÐ0Ø)Ø 0ô	�
ð &×6Ñ6Ó8�Ø&×;Ñ;Ó=�	ä—	‘	Ð3°XÔ>Ù$ñ -ô ×+Ñ+×7Ò7äŸW™W×-Ñ-¨jÓ9¸!Ñ<¸uÑDð ô
 ! (¨HÐ!5°yÀ(Ç.Á.ÓBRÔSÜ—H‘H˜Y¨Õ.ä)¨(Ô3á#Û#à!)×!5Ñ!5Ó!7�JÜ # E¨:Ó 6�Iä˜i¨Ó/ð C°4Ø"&§)¡)£+˜àŸ
™
 4¨9°wÀÑ7JÑ+JÑ#KÔLØŸ
™
Ð#5Ô6ØŸ
™
¤6§;¡;¨s°LÓ#AÔB÷Cô ˜* cÓ*ð =¨aØ—G‘G˜D”MØ—G‘GÐ1°+°¸bÐAÔBØ—G‘GÐ.¨x¨j¸Ð;Ô<÷=÷b	=ðH Ð÷<ñ <ú÷NHñ Hú÷VCð Cú÷=ð =ú÷b	=ðH Ðúsu   Ç4cÈb&ÈP4cÙ7b3Ú
1cÛDcß#A!c ácá<câcâ&b0	â+câ3b=	â8cã c		ãcãc	ãcãc"N)
re  rS   rV  rÀ   r[  r¹  rw   ró   rÃ   rÀ   )rÇ   rÈ   rÉ   rš  r{  r`   rf   rd   rÜ  rÜ  ù  sK   „ Øð`àð`ð ð`ð )6ð	`ð
 ð`ð 
ò`ó ñ`rf   rÜ  c                 óì   — t        t        «      j                  dz  } | j                  «       5 }|j	                  «       }t        |d«      \  }}d d d «       t        |«      S # 1 sw Y   t        «      S xY w)Nr³  r�  )r   r¶  r6  r´   r§  r*  r9   )r~   r?  r$  rr   rN  s        rd   rW  rW  ¦  sm   € ô ”‹>× Ñ Ð#9Ñ9€DØ	�‰‹ð 
˜Ø—&‘&“(ˆÜØØó
‰ˆˆ8÷
ô $ HÓ-Ð-÷
ô $ HÓ-Ð-ús   ­ A Á A3c                 ó�   — t        «       } t        j                  «       r#dt        j                  j                  | «      › d�S d| › d�S )NrJ  rI  )rW  r$   r¿  r}   r~   r  ©rN  s    rd   Ú
cpp_prefixr  ³  sF   € ÜÓ €HÜ×ÑÔð œBŸG™G×,Ñ,¨XÓ6Ð7°qÐ9Ð9à˜H˜: QÐ'Ð'rf   c                ó^   — t        d«      5  t        | ||«      cd d d «       S # 1 sw Y   y xY w)Nrö  )r"   Ú_compile_file)rë  rÔ  rË  s      rd   rö  rö  ¿  s-   € ô 
�nÓ	%ñ ;Ü˜Z¨°cÓ:÷;÷ ;ò ;ús   Œ#£,c           	     óÆ  — t        | t        «      r| gn| }|D �cg c]7  }t        j                  «       rt        j
                  j                  |«      n|‘Œ9 }}	 t        j                  «       �rËt        «       }t        j
                  j                  |«      }t        j
                  j                  |«      }t        j
                  j                  t        d«      }	t        j                  «       5 }
t        j                  |t        j
                  j                  |
|«      «       t        j                  t        t        j
                  j                  |
d«      «       t        ||«      D ]9  \  }}t        j                  |t        j
                  j                  |
|«      «       Œ; t        j
                  j                  |
d«      }t        j                   |	|«       t#        ||
|«      }t        j
                  j%                  |«      rt	        j&                  |«       t        j                  ||«       d d d «       y t)        j*                  |t(        j,                  ¬«       y c c}w # 1 sw Y   y xY w# t(        j.                  $ r]}|j0                  j3                  d«      }d|v xs d|v }|rt4        j6                  dk(  rd}||z  }t9        j:                  ||«      |‚d }~ww xY w)	NÚincluder´  )Ústderrr”   z'omp.h' file not foundÚlibompr@  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$   r¿  r}   r~   r  rW  r   rÀ  ÚtempfileÚTemporaryDirectoryr¬  r   Ú_LINKER_SCRIPTÚzipÚcopytreerY   r  ÚremoverÅ  Úcheck_outputÚSTDOUTrÇ  rÉ  r  ry   rF  r%   rÈ  )rë  rÔ  rË  Úinput_pathsÚipÚinput_filesÚheader_pathÚheader_namero  Útorch_includes_pathÚtmp_dirÚpr?  Údest_include_pathÚoutput_file_pathrÿ   rÉ  Úopenmp_problemÚinstructions                      rd   r�  r�  Æ  s2  € ô #-¨Z¼Ô"=�:‘,À:€KàEPöØ?A¤× 0Ñ 0Ô 2Œ�‰×Ñ˜Ô¸Ñ:ð€Kð ð(6Ü×ÑÕä)Ó+ˆKÜŸ'™'×*Ñ*¨;Ó7ˆKÜŸ'™'×*Ñ*¨;Ó7ˆKô #%§'¡'§,¡,¬{¸IÓ"FÐÜ×,Ñ,Ó.ð ;°'ä—‘˜K¬¯©¯©°g¸{Ó)KÔLÜ—‘œN¬B¯G©G¯L©L¸À+Ó,NÔOÜ ¨[Ó9ò =‘D�A�qÜ—K‘K ¤2§7¡7§<¡<°¸Ó#;Õ<ð=ä$&§G¡G§L¡L°¸)Ó$DÐ!Ü—‘Ð 3Ð5FÔGä#5°c¸7ÀKÓ#PÐ ä—7‘7—>‘> +Ô.Ü—I‘I˜kÔ*Ü—‘Ð,¨kÔ:÷;ð ;ô ×#Ñ# C´
×0AÑ0AÖBùò9÷;ð ;ûô  ×(Ñ(ò 6Ø—‘—‘ Ó)ˆØ1°VÐ;ÒQ¸xÈ6Ð?QˆÙœcŸl™l¨hÒ6ð2ð ð �kÑ!ˆFÜ×!Ñ! # vÓ.°AÐ5ûð6úsD   š<IÁBI0 Ã.EI$È0I0 È9%I0 É$I-É)I0 É-I0 É0K ÊAKËK zOptional[CDLL]Ú_libgompc                ó°  ‡	— d	ˆ	fd„Š	|D �cg c]
  } ‰	|«      ‘Œ }}| j                  d«      s
J | dz   «       ‚d }t        | j                  d«      «      D ]+  \  }}|dk(  rt        j                  |«      }t        ||«      }Œ- t        |«      s
J | dz   «       ‚ ||Ž }t        |t        t        f«      rT|D ]&  }t        |t        j                  «      rŒJ | dz   «       ‚ t        j                  j                  j                  |«      S t        |t        j                  «      s
J | dz   «       ‚t        j                  j                  j                  |«      S c c}w )
Nc                óè   •— t        t        | «      «      dk(  r)t        j                  j                  j                  | «      S t        | t        t        f«      r t        | «      ˆfd„| D «       «      S | S )Nz<class 'PyCapsule'>c              3  ó.   •K  — | ]  } ‰|«      –— Œ y ­wr_   r`   )rñ   rD  Úconvert_args     €rd   rò   z9custom_op_wrapper.<locals>.convert_arg.<locals>.<genexpr>  s   øè ø€ Ò9°™[¨Ÿ^Ñ9ùs   ƒ)	rÀ   r€  ru   r†  Ú_aotiÚ&alloc_tensor_by_stealing_from_void_ptrr  r†  r  )Úargrž  s    €rd   rž  z&custom_op_wrapper.<locals>.convert_argþ  sW   ø€ ÜŒt�C‹y‹>Ð2Ò2ä—8‘8—>‘>×HÑHÈÓMÐMÜ˜œd¤E˜]Ô+Ø”4˜“9Ó9°SÔ9Ó9Ð9àˆJrf   z
torch.ops.z, can not be called through custom_op_wrapperro   r   z, can not be loaded through custom_op_wrapperz returns a list of non-tensorsz returns a non-tensor)r¡  r   rÃ   r   )Ú
startswithÚ	enumeraterÄ  Ú	importlibÚimport_moduler~  Úcallabler  r†  r  ru   r    r†  rŸ  Ú#unsafe_alloc_void_ptrs_from_tensorsÚ!unsafe_alloc_void_ptr_from_tensor)
rì   rb   r¡  Úconverted_argsÚfuncrß  rd  ÚresultÚrrž  s
            @rd   Úcustom_op_wrapperr­  û  sE  ø€ õð 37Ö7¨3‘k #Õ&Ð7€NÐ7à�=‰=˜Ô&ð Ø
Ð;Ñ;óÐ&ð €DÜ˜"Ÿ(™( 3›-Ó(ò  ‰ˆˆ1Ø�Š6Ü×*Ñ*¨1Ó-ˆDÜ�t˜QÓ‰ð ô
 �DŒ>ÐN˜2Ð NÑNÓNˆ>Ù�>Ð"€FÜ�&œ4¤˜-Ô(Øò 	VˆAÜ˜a¤§¡Õ.ÐU°Ð5UÑ0UÓUÐ.ð	Vä�x‰x�~‰~×AÑAÀ&ÓIÐIä˜&¤%§,¡,Ô/ÐM°Ð6MÑ1MÓMÐ/Ü�x‰x�~‰~×?Ñ?ÀÓGÐGùò' 8s   ŒEc                  ó²   — e Zd ZU i Zded<    eej                  «      Zi Zded<   ed
d„«       Z	e
d
d„«       Ze
	 	 	 d	 	 	 	 	 	 	 	 	 dd„«       Ze
ddd	„«       Zy)ÚCppCodeCacheú0Dict[str, Callable[[], Union[CDLL, ModuleType]]]r¨   rÄ   Úcpp_compile_command_flagsc                ó,   — t        j                  | «      S r_   )r   ÚLoadLibrary)r~   rÒ   s     rd   Ú_load_library_innerz CppCodeCache._load_library_inner#  s   € ä×Ñ Ó%Ð%rf   c           	     ó¸  — 	 | j                  ||«      }||_        |S # t        t        f$ r­}dt	        |«      v rTt
        j                  j                  d«      r5t        j                  d«      a
| j                  ||«      }||_        |cY d }~S dt	        |«      v r9t        |› dt        j                  «       › dt        j                  «       › d�«      |‚‚ d }~ww xY w)NÚgompz/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´  rÒ   ÚImportErrorr^  rÀ   r}   r~   r  r   r³  rš  r†  Ú
gettempdir)rx  r~   rÒ   r«  rÿ   s        rd   Ú_load_libraryzCppCodeCache._load_library'  sâ   € ð	Ø×,Ñ,¨T°3Ó7ˆFØˆFŒJØˆMøÜœWÐ%ò 	Øœ˜Q›Ñ¤B§G¡G§N¡NÐ3LÔ$Mô  ×+Ñ+Ð,EÓF�Ø×0Ñ0°°sÓ;�Ø �”
Ø•Ø9¼SÀ»VÑCÜØ�cÐLÌX×M`ÑM`ÓMbÐLcð d3ä3;×3FÑ3FÓ3HÐ2Ið J]ð]óð
 ðð ûð	ús"   ‚ �C¬ACÂCÂACÃCNc           	     óH  ‡ ‡‡‡‡‡— i ‰ j                   ¥|t        «       |dœ¥}t        «        t        ddt	        di |¤Ž¬«      }t        |j                  «       «      }t        |d|¬«      \  Š}‰‰ j                  v�rddl	m
}	 t        j                  j                  t        «       ‰d	z   «      }
t        |«      \  }}	 |d d
 dz   }d Šd Št	        di |¤Ž}t        ||||¬«      }t!        j"                  t$        |
|||«      Št'        t)        j*                  «       r|n|j-                  «       «      Šdˆˆ ˆˆˆˆfd„}|�> |	|
t.        ¬«      5  t        j                  j1                  ‰«      s |‰«      Šd d d «       |‰ j                  ‰<   ‰ j                  ‰   S # 1 sw Y   Œ'xY w)N)rw   rà  Úextra_flagsrÞ  rß  râ  rç  ©r  r   r  r  éýÿÿÿÚsor+  c                 ór   •— ‰€3‰�‰j                  «         ‰«       } | �J ‚‰j                  ‰‰«      Š‰€J ‚‰S r_   )r«  r¹  )r«  Úbinary_pathrx  ÚfuturerÒ   r®  Ú	worker_fns    €€€€€€rd   Úload_fnz(CppCodeCache.load_async.<locals>.load_fn}  sI   ø€ à�;ØÐ)ØŸ™œÙ&›[�FØ!˜>Ð)˜>Ø×+Ñ+¨K¸Ó=�CØ˜?Ð*˜?Ø�
rf   r  r`   ©rÃ   r   )r±  r:   r1   r3   r5   r#  rG  r*  r¨   rI  r  r}   r~   r   r  r8   rË   r
   Ú_worker_compile_cppr9   r$   r¿  rN  rJ  r  )rx  rV  rw   Ú	submit_fnr»  Úcompile_commandÚcommand_genÚvec_isa_cmdrë  r  Ú	lock_pathro  r,  Úfb_output_pathÚcpp_build_optionÚcpp_builderrÃ  rÀ  rÁ  rÒ   r®  rÂ  s   `                @@@@@rd   Ú
load_asynczCppCodeCache.load_async>  s   ý€ ð
Ø×+Ñ+ð
àÜ#“~Ø&ò	
ˆô 	Ôä Ø˜cÔ/BÑ/UÀ_Ñ/Uô
ˆô ˜;×7Ñ7Ó9Ó:ˆÜ ¨U¸+ÔF‰ˆˆZà�c—i‘iÒÝ)äŸ™Ÿ™¤\£^°S¸7±]ÓCˆIÜ&LÈZÓ&XÑ#ˆK˜ðð (¨¨˜_¨tÑ3ˆNØ,0ˆFØˆCä2ÑE°_ÑEÐÜ$Ø Ø"Ø%Ø,ô	ˆKô "×)Ñ)Ü#ØØØØóˆIô 3ä×#Ñ#Ô%ñ à ×5Ñ5Ó7óˆK÷	ò 	ð Ð$Ù˜i´Ô>ñ 6ÜŸ7™7Ÿ>™>¨+Ô6Ù!*¨9Ó!5˜÷6ð %ˆC�I‰I�c‰Nà�y‰y˜‰~Ð÷6ð 6ús   Å
(FÆF!c                ó0   —  | j                  ||«      «       S r_   )rÎ  )rx  rV  rw   s      rd   rµ   zCppCodeCache.load‘  s   € à0ˆs�~‰~˜k¨4Ó0Ó2Ð2rf   )r~   rÀ   rÒ   rÀ   rÃ   zUnion[CDLL, ModuleType])FNr`   )
rV  rÀ   rw   ró   rÆ  r   r»  úSequence[str]rÃ   r   )F)rV  rÀ   rw   ró   rÃ   r   )rÇ   rÈ   rÉ   r¨   rG  rÊ   r¯  rÚ  r±  r´  rš  r¹  rÎ  rµ   r`   rf   rd   r¯  r¯    s·   … à>@€EÐ;Ó@Ù˜uŸ{™{Ó+€KØ02Ð˜~Ó2àò&ó ð&ð òó ðð, ð ØØ%'ðPàðPð ðPð ð	Pð
 #ðPð 
òPó ðPðd ó3ó ñ3rf   r¯  c           	     ó†  — ddl m}  || t        ¬«      5  t        j                  «       r|n|j                  «       }t        j                  j                  |«      sSt        j                  «       r/t        ||t        j                  |j                  «       «      «       n|j                  «        d d d «       y # 1 sw Y   y xY w)Nr   r  r  )rI  r  rJ  r$   r¿  rN  r}   r~   r  rö  rÃ  rÄ  rG  Úbuild)rÊ  rÍ  Úfb_input_pathrË  r  rÀ  s         rd   rÅ  rÅ  –  s“   € õ "á	�)¤\Ô	2ñ $ä$×.Ñ.Ô0‰N°k×6VÑ6VÓ6Xð 	ô �w‰w�~‰~˜kÔ*Ü×ÑÔ!ÜØ!Ø"Ü—K‘K × <Ñ <Ó >Ó?õð ×!Ñ!Ô#÷$÷ $ñ $ús   •BB7Â7C c                  óÔ   — e Zd ZU i Zded<    eej                  «      ZdddœZdZ	dZ
dZ ej                  d	«      Zedd
„«       Ze	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Zedd„«       Zy)ÚCppPythonBindingsCodeCacher°  r¨   FT©Úinclude_pytorchÚsharedÚkernelzkernel(%s);Py_RETURN_NONE;rp   aå  
        // Python bindings to call %s():
        #define PY_SSIZE_T_CLEAN
        #include <Python.h>
        #include <sstream>
        #include <cstdlib>

        #ifndef _MSC_VER
        #if __cplusplus < 202002L
        // C++20 (earlier) code
        // https://en.cppreference.com/w/cpp/language/attributes/likely
        #define likely(x)       __builtin_expect(!!(x), 1)
        #define unlikely(x)     __builtin_expect(!!(x), 0)
        #endif
        #else
        #define likely(x) (x)
        #define unlikely(x) (x)
        #endif

        // This is defined in guards.cpp so we don't need to import PyTorch headers that are slooow.
        // We manually link it below to workaround issues with fbcode build.
        static void* (*_torchinductor_pyobject_tensor_data_ptr)(PyObject* obj);

        template <typename T> static inline T parse_arg(PyObject* args, size_t n) {
            static_assert(std::is_pointer<T>::value, "arg type must be pointer or long");
            return static_cast<T>(_torchinductor_pyobject_tensor_data_ptr(PyTuple_GET_ITEM(args, n)));
        }
        template <> inline int64_t parse_arg<int64_t>(PyObject* args, size_t n) {
            auto result = PyLong_AsSsize_t(PyTuple_GET_ITEM(args, n));
            if(unlikely(result == -1 && PyErr_Occurred()))
                throw std::runtime_error("expected int arg");
            return result;
        }
        template <> inline uintptr_t parse_arg<uintptr_t>(PyObject* args, size_t n) {
            auto result = PyLong_AsVoidPtr(PyTuple_GET_ITEM(args, n));
            if(unlikely(result == reinterpret_cast<void*>(-1) && PyErr_Occurred()))
                throw std::runtime_error("expected int arg");
            return reinterpret_cast<uintptr_t>(result);
        }

        %s

        static PyObject* %s_py(PyObject* self, PyObject* args) {
            try {
                if(unlikely(!PyTuple_CheckExact(args)))
                    throw std::runtime_error("tuple args required");
                if(unlikely(PyTuple_GET_SIZE(args) != %s))
                    throw std::runtime_error("requires %s args");
                %s
            } catch(std::exception const& e) {
                PyErr_SetString(PyExc_RuntimeError, e.what());
                return nullptr;
            } catch(...) {
                PyErr_SetString(PyExc_RuntimeError, "unhandled error");
                return nullptr;
            }
        }

        static PyMethodDef py_methods[] = {
            {"%s", %s_py, METH_VARARGS, ""},
            {NULL, NULL, 0, NULL}};

        static struct PyModuleDef py_module =
            {PyModuleDef_HEAD_INIT, "%s", NULL, -1, py_methods};

        PyMODINIT_FUNC PyInit_%s(void) {
            const char* str_addr = std::getenv("_TORCHINDUCTOR_PYOBJECT_TENSOR_DATA_PTR");
            if(!str_addr) {
                PyErr_SetString(PyExc_RuntimeError, "_TORCHINDUCTOR_PYOBJECT_TENSOR_DATA_PTR must be set");
                return nullptr;
            }
            std::istringstream iss(str_addr);
            uintptr_t addr = 0;
            iss >> addr;
            _torchinductor_pyobject_tensor_data_ptr =
                reinterpret_cast<decltype(_torchinductor_pyobject_tensor_data_ptr)>(addr);
            return PyModule_Create(&py_module);
        }
        c                óà  — t        t        j                  j                  j                  j
                  «      t        j                  d<   |› d| j                  › �}	 t        j                  |   S # t        $ r Y nw xY wt        j                  j                  ||«      }|€J ‚t        j                  j                  |«      }|t        j                  |<   |j                   j#                  |«       |S )NÚ'_TORCHINDUCTOR_PYOBJECT_TENSOR_DATA_PTRro   )rÀ   ru   r†  Ú_dynamor`  Ú'_torchinductor_pyobject_tensor_data_ptrr}   ÚenvironÚentry_functionry   ÚmodulesÚKeyErrorr¤  ÚutilÚspec_from_file_locationÚmodule_from_specÚloaderÚexec_module)rx  r~   rÒ   Úmodule_namer¯  r°  s         rd   r´  z.CppPythonBindingsCodeCache._load_library_inner	  sÊ   € ä@CÜ�H‰H×Ñ×#Ñ#×KÑKóA
Œ�
‰
Ð<Ñ=ð ˜˜Q˜s×1Ñ1Ð2Ð3ˆð	Ü—;‘;˜{Ñ+Ð+øÜò 	Ùð	úä�~‰~×5Ñ5°kÀ4ÓHˆØÐÐÐÜ—‘×0Ñ0°Ó6ˆØ#)Œ�‰�KÑ Ø�‰×Ñ Ô'Øˆs   ÁA. Á.	A:Á9A:Nc                ó°  ‡ ‡
‡— dj                  d„ t        |«      D «       «      }‰ j                  ‰ j                  ‰ j                  r‰ j                  |z  nd‰ j                  t        |«      t        |«      ‰ j                  |z  ‰ j                  ‰ j                  ‰ j                  ‰ j                  f
z  }‰ j                  ||z   |||¬«      Š
dŠdˆ ˆ
ˆfd„}	|	S )a5  
        Wrap a C++ function in fast Python bindings.

        Args:
            argtypes: The types of args to ENTRY_FUNCTION(), e.g. ["float*", "long"]
            source_code: C++ source code containing a ENTRY_FUNCTION() function

        Returns:
            A python version of ENTRY_FUNCTION()
        ú, c              3  óT   K  — | ]   \  }}d |j                  dd«      › d|› d�–— Œ" y­w)z
parse_arg<zconst rp   z>(args, ú)N)rx   )rñ   ÚnÚargtypes      rd   rò   zBCppPythonBindingsCodeCache.load_pybinding_async.<locals>.<genexpr>1	  s7   è ø€ ò 
á��7ð ˜Ÿ™¨°2Ó6Ð7°xÀ¸sÀ!ÔDñ
ùs   ‚&(rp   )rÆ  r»  Nc                 óf   •— ‰€ ‰«       Št        ‰t        «      sJ ‚t        ‰‰ j                  «      S r_   )r  r   r~  rß  )rx  Ú
get_resultr«  s   €€€rd   rÁ  z?CppPythonBindingsCodeCache.load_pybinding_async.<locals>.futureF	  s2   ø€ àˆ~Ù#›�Ü! &¬*Ô5Ð5Ð5Ü˜6 3×#5Ñ#5Ó6Ð6rf   rÄ  )r   r£  Úsuffix_templaterß  Úextra_parse_argrˆ  Úcall_entry_functionrÎ  )rx  ÚargtypesrV  rw   Únum_outputsrÆ  r»  Ú	parseargsÚsuffixrÁ  rï  r«  s   `         @@rd   Úload_pybinding_asyncz/CppPythonBindingsCodeCache.load_pybinding_async	  sÜ   ú€ ð( —I‘Iñ 
ä'¨Ó1ô
ó 
ˆ	ð ×$Ñ$Ø×ÑØ14×1DÒ1DˆC×Ñ +Ò-È"Ø×ÑÜ�‹MÜ�‹MØ×#Ñ# iÑ/Ø×ÑØ×ÑØ×ÑØ×Ñð(
ñ 
ˆð —^‘^Ø˜&Ñ  $°)Èð $ó 
ˆ
ð ˆ÷	7ð ˆrf   c                ó0   —   | j                   |i |¤Ž«       S r_   )r÷  ©rx  rb   rc   s      rd   Úload_pybindingz)CppPythonBindingsCodeCache.load_pybindingO	  s    € à8Ð'ˆs×'Ñ'¨Ð8°Ñ8Ó:Ð:rf   )r~   rÀ   rÒ   rÀ   rÃ   r   )FrÕ   Nr`   )ró  r”  rV  rÀ   rw   ró   rô  r  rÆ  r   r»  rÐ  rÃ   r   )rb   r   rc   r   rÃ   r   )rÇ   rÈ   rÉ   r¨   rG  rÊ   r¯  rÚ  r±  rß  rò  rñ  ÚtextwrapÚdedentrð  rš  r´  r÷  rú  r`   rf   rd   rÕ  rÕ  ®  sä   … à>@€EÐ;Ó@Ù˜uŸ{™{Ó+€Kð !Øñ!Ðð
 €NØ6ÐØ€OØ%�h—o‘oðN	óP€Oðd òó ðð  ð
 ØØØ%'ð/àð/ð ð/ð ð	/ð
 ð/ð ð/ð #ð/ð 
ò/ó ð/ðb ò;ó ñ;rf   rÕ  c                  óv   — e Zd ZU i Zded<    eej                  «      ZdddœZdZ	dZ
 ej                  d«      Zy)	ÚCppWrapperCodeCacher°  r¨   TrÖ  Úinductor_entry_cppzreturn inductor_entry_cpp(%s);aË  
        #include <torch/csrc/inductor/aoti_torch/c/shim.h>

        static inline std::vector<AtenTensorHandle> unpack_tensor_handle_list(PyObject* pyvec) {
            std::vector<AtenTensorHandle> result;
            size_t result_len = PyList_GET_SIZE(pyvec);
            result.reserve(result_len);
            for (size_t i = 0; i < result_len; i++) {
                // AtenTensorHandle is essentially a pointer
                void* elem = PyCapsule_GetPointer(PyList_GET_ITEM(pyvec, i), NULL);
                result.push_back(reinterpret_cast<AtenTensorHandle>(elem));
            }
            return result;
        }

        static inline PyObject* pack_tensor_handle_list(const std::vector<AtenTensorHandle>& cppvec) {
            size_t result_len = cppvec.size();
            PyObject* result = PyList_New(static_cast<Py_ssize_t>(result_len));
            for (size_t i = 0; i < result_len; i++) {
                PyObject *elem =
                    cppvec[i] == nullptr
                        ? Py_None
                        // Store AtenTensorHandle as PyCapsulate
                        : PyCapsule_New(reinterpret_cast<void*>(cppvec[i]), NULL, NULL);
                PyList_SET_ITEM(result, i, elem);
            }
            return result;
        }

        template <> inline std::vector<AtenTensorHandle> parse_arg<std::vector<AtenTensorHandle>>(PyObject* args, size_t n) {
            return unpack_tensor_handle_list(PyTuple_GET_ITEM(args, n));
        }

        PyObject* inductor_entry_cpp(std::vector<AtenTensorHandle>&& input_handles) {
            // For outputs, we only allocate a vector to hold returned tensor handles,
            // not allocating the actual output tensor storage here
            std::vector<AtenTensorHandle> output_handles(%s);
            try {
                inductor_entry_impl(input_handles.data(), output_handles.data());
                return pack_tensor_handle_list(output_handles);
            } catch(std::exception const& e) {
                PyErr_SetString(PyExc_RuntimeError, e.what());
                return {};
            } catch(...) {
                PyErr_SetString(PyExc_RuntimeError, "unhandled error");
                return {};
            }
        }
        N)rÇ   rÈ   rÉ   r¨   rG  rÊ   r¯  rÚ  r±  rß  rò  rû  rü  rñ  r`   rf   rd   rþ  rþ  T	  sK   … à>@€EÐ;Ó@Ù˜uŸ{™{Ó+€KàØñ!Ðð *€NØ:ÐØ%�h—o‘oð0	ó2�Orf   rþ  c                  ó  — e Zd ZU i Zded<    eej                  «      ZdZded<    e	j                  d«      Ze e	j                  d«      z   Ze e	j                  d«      z   Z e	j                  d	«      Zedd
„«       Zedd„«       Ze ej&                  d«      dd„«       «       Zedd„«       Ze ej&                  d«      dd„«       «       Ze ej&                  d«      dd„«       «       Ze	 d	 	 	 	 	 	 	 dd„«       Zedd„«       Zedd„«       Zy)ÚHalideCodeCachez0Dict[str, Callable[[], Union[ModuleType, CDLL]]]r¨   Nr¹  Ú_standalone_runtime_pathaØ  
        #include "{halideruntime_h}"
        #include "{headerfile}"
        #include <stdexcept>
        #include <cmath>

        namespace c10 {{
            inline long div_floor_integer(long a, long b) {{
                if ((a<0) != (b<0)) {{
                    const auto quot = a / b;
                    const auto rem = a % b;
                    return rem ? quot - 1 : quot;
                }}
                return a / b;
            }}
        }}
        zÌ
        void kernel({argdefs}) {{
            {buffers}
            int err = halide_kernel({buffer_names});
            if(err != 0) throw std::runtime_error("halide_kernel failed");
        }}
        a{  
        #include <cuda.h>
        static const halide_device_interface_t* cuda_interface = halide_cuda_device_interface();

        void kernel({argdefs}, uintptr_t stream) {{
            {buffers}
            int err = halide_kernel(reinterpret_cast<void*>(stream), {buffer_names});
            if(err != 0) throw std::runtime_error("halide_kernel failed");
        }}
        aÎ  
        #include "{}"
        #include <cuda.h>

        static int acquire_context(void* user_context,
                                   void** cuda_context_out,
                                   bool create) {{
            return cuCtxGetCurrent(reinterpret_cast<CUcontext*>(cuda_context_out));
        }}

        static int release_context(void* user_context) {{
            return 0;
        }}

        static int get_stream(void* user_context,
                              void* cuda_context,
                              void** stream_out) {{
            *stream_out = user_context;
            return 0;
        }}

        static int register_halide_hooks() {{
            halide_set_cuda_acquire_context(&acquire_context);
            halide_set_cuda_release_context(&release_context);
            halide_set_cuda_get_stream(&get_stream);
            return 0;
        }}

        int inductor_register_halide_hooks_result = register_halide_hooks();
        c                óŒ  — |j                   €J ‚|j                  �+t        |j                   «      t        |j                  «      k(  sJ ‚|j                  €J ‚|j                  xs |j
                  › d|j                  › �}|rd|› d�}d}d}d}nd}d}d|› d�}d	}g }	t        |j                   |j                  «      D ]  \  }
}|	j                  d
|
› d|› d�«       Œ d|› d�d|› ddj                  |	«      › d�|› d|› d�|› d|› d�|› d|› d�|› d|› d�|› d|j                  «       › d�|› dt        |	«      › d�|› d|› d�|› d�g
S )Nz + zreinterpret_cast<uint64_t>(rë  Úcuda_interfaceÚnullptrÚhalide_buffer_flag_device_dirtyÚ0zreinterpret_cast<uint8_t*>(Úhalide_buffer_flag_host_dirtyzhalide_dimension_t(0, ré  zhalide_buffer_t ú;zhalide_dimension_t z_dims[] = {z};z
.device = z.device_interface = z.host = z	.flags = z.type = z.dimensions = z.dim = z_dims;z.padding = nullptr;)
ÚshapeÚstriderˆ  ÚoffsetÚalias_ofr�   r‰  r‰  r   Úhalide_type)rx  r�   r¡  rw   r6  r’   Údevice_interfaceÚhostÚflagsÚdimsÚsizer  s               rd   Ú_codegen_bufferzHalideCodeCache._codegen_bufferá	  s¬  € à�y‰yÐ$Ð$Ð$Ø�z‰zÐ%¬#¨c¯i©i«.¼CÀÇ
Á
»OÒ*KÐKÐKØ�z‰zÐ%Ð%Ð%Ø—l‘lÒ. c§h¡hÐ/¨s°3·:±:°,Ð?ˆÙØ2°8°*¸AÐ>ˆFØ/ÐØˆDØ5‰EàˆFØ(ÐØ0°°
¸!Ð<ˆDØ3ˆEàˆÜ §	¡	¨3¯:©:Ó6ò 	D‰LˆD�&Ø�K‰KÐ0°°°b¸¸ÀÐBÕCð	Dð ˜t˜f AÐ&Ø! $  |°D·I±I¸d³OÐ3DÀCÐHØˆf�J˜v˜h aÐ(ØˆfÐ(Ð)9Ð(:¸!Ð<Øˆf�H˜T˜F !Ð$Øˆf�I˜e˜W AÐ&Øˆf�H˜SŸ_™_Ó.Ð/¨qÐ1Øˆf�N¤3 t£9 +¨QÐ/Øˆf�G˜D˜6 Ð(ØˆfÐ'Ð(ð
ð 	
rf   c           	     óä  — |j                  «       }|d|j                  v u sJ ‚d|j                  v sJ ‚g }g }t        |j                  «      D ]z  \  }}|j	                  «       r:|j                  d|› �«       |j                  | j                  d|› �||«      «       ŒPd|j                  vsJ ‚|j                  |j                  «       Œ| dj                  |D �cg c]  }d|› �‘Œ	 c}«      j                  «       }|r| j                  n| j                  }	|	j                  | j                  |rdnd	«      |d
j                  d„ |j                  D «       «      |d
j                  |«      ¬«      }
|
S c c}w )NÚuser_contextÚ
no_runtimez&hl_buf_Úhl_buf_Ú*ré  ú    úHalideRuntimeCuda.hzHalideRuntime.hré  c              3  ór   K  — | ]/  }|j                   €!|j                  «       › d|j                  › �–— Œ1 y ­w)Nrñ  )r  Úbindings_typer�   )rñ   rD  s     rd   rò   z0HalideCodeCache._codegen_glue.<locals>.<genexpr>
  s9   è ø€ ò àØ—:‘:Ð%ð —?‘?Ó$Ð% Q q§v¡v hÔ/ñùs   ‚57)Úhalideruntime_hÚ
headerfileÚargdefsÚbuffersÚbuffer_names)r  rƒ  r£  ró  Ú	is_bufferr‰  Úextendr  Úctyper�   r   ÚlstripÚglue_template_cudaÚglue_template_cppÚformatÚfind_header)rx  rT  r  r  r!  r"  rß  r¡  ÚlineÚglue_templateÚ	glue_codes              rd   Ú_codegen_gluezHalideCodeCache._codegen_glue
  sh  € à—,‘,“.ˆØ˜>¨T¯[©[Ð8Ñ9Ð9Ð9Ø˜tŸ{™{Ñ*Ð*Ð*ØˆØˆÜ §¡Ó.ò 	.‰FˆAˆsØ�}‰}ŒØ×#Ñ# h¨q¨c NÔ3Ø—‘˜s×2Ñ2°W¸Q¸C°=À#ÀwÓOÕPà #§)¡)Ñ+Ð+Ð+Ø×#Ñ# C§H¡HÕ-ð	.ð —)‘)°wÖ?¨t˜t D 6š]Ò?Ó@×GÑGÓIˆá29˜×.Ò.¸s×?TÑ?TˆØ!×(Ñ(ØŸO™OÙ)0Ñ%Ð6Góð "Ø—I‘Iñ àŸ™ôó ð
 ØŸ™ <Ó0ð )ó 
ˆ	ð Ðùò! @s   ÃE-c                óä   — t        ddt        «       ¬«      }|j                  «       }t        dj	                  | j
                  | j                  | j                  |g«      j                  d«      «      S )NÚOÚIrâ  ré  r”   )	r3   r4   rG  r  r   r(  r'  Ústandalone_runtime_cuda_initr¡   )rx  rÈ  Úcommand_lines      rd   Úconfig_hashzHalideCodeCache.config_hash#
  sp   € ô !ØØÜ"›ô
ˆð
 #×3Ñ3Ó5ˆÜØ�I‰Ià×)Ñ)Ø×*Ñ*Ø×4Ñ4Ø ð	ó÷ ‰f�W‹oó	
ð 		
rf   c                óX  — t         j                  j                  j                  d«      }|�|j                  st        d«      ‚	 |j                  d   }t        j                  |«      D ]þ  }|j                  d«      sŒ	 t        j                  dt        j                  j                  ||«      g«      }t        j                  d|j!                  d«      «      }|sŒst        j                  j                  t        j                  j#                  |j%                  d«      «      | «      }t        j                  j'                  |«      sŒßt        j                  j#                  |«      c S  	 t        |«      ‚# t        j                  $ r Y �Œ#w xY w# t(        $ r}t        |«      |‚d }~ww xY w)	NÚhalidez$halide python bindings not installedr   rÎ  Úlddz(/.*)/libHalide.sor”   r+   )r¤  Ú	machineryÚ
PathFinderr¤  rª  rœ   r}   r=  rÏ  rÅ  rŒ  r~   r   ÚSubprocessErrorrX  Úsearchr  ÚabspathÚgroupr  r?  )	rö  Úerrmsgr¯  r;  ÚfileÚoutÚmr~   rÿ   s	            rd   Ú_search_for_filez HalideCodeCache._search_for_file7
  sL  € ä×"Ñ"×-Ñ-×7Ñ7¸ÓAˆØˆ<˜t×>Ò>ÜÐEÓFÐFð	.Ø×4Ñ4°QÑ7ˆFÜŸ
™
 6Ó*ò 9�Ø—=‘= Õ'ð!Ü(×5Ñ5Ø"¤B§G¡G§L¡L°¸Ó$>Ð?ó˜ô
 Ÿ	™	Ð"7¸¿¹ÀGÓ9LÓM�AÚÜ!Ÿw™wŸ|™|¬B¯G©G¯O©O¸A¿G¹GÀA»JÓ,GÈÓP˜ÜŸ7™7Ÿ>™>¨$Õ/Ü#%§7¡7§?¡?°4Ó#8Ò8ñ9ô ˜6Ó"Ð"øô &×5Ñ5ò !Ú ð!ûô ò 	.Ü˜vÓ&¨AÐ-ûð	.úsO   Á8F Á>5E5Â3'F ÃA+F Å F Å(F Å5FÆF ÆFÆF Æ	F)ÆF$Æ$F)c                ó*  — d| j                  «       › d�}dt        j                  v rRt        j                  j	                  t        j                  d   |«      }t        j                  j                  |«      r|S d|› d�}t        j                  ||«      S )NÚlibautoschedule_rÎ  Ú
HALIDE_LIBúCan't find z3, set env HALIDE_LIB to the directory containing it)r  r}   rÞ  r~   r   r  r  rB  )r�   Úsofiler~   r>  s       rd   Úfind_libautoschedulez$HalideCodeCache.find_libautoscheduleO
  s}   € ð $ D§J¡J£L >°Ð5ˆØœ2Ÿ:™:Ñ%Ü—7‘7—<‘<¤§
¡
¨<Ñ 8¸&ÓAˆDÜ�w‰w�~‰~˜dÔ#Ø�à˜&˜Ð!TÐUð 	ô ×/Ñ/°¸Ó?Ð?rf   c                ó  — dt         j                  v rRt         j                  j                  t         j                  d   | «      }t         j                  j	                  |«      r|S dt         j                  v rrt         j                  j                  t         j                  j                  t         j                  d   d| › �«      «      }t         j                  j	                  |«      r|S d| › d�}t        j                  d| › �|«      S )NÚHALIDE_INCLUDErE  z../include/rF  z7, set env HALIDE_INCLUDE to the directory containing it)r}   rÞ  r~   r   r  r<  r  rB  )r�   r~   r>  s      rd   r*  zHalideCodeCache.find_header\
  sÈ   € ð œrŸz™zÑ)Ü—7‘7—<‘<¤§
¡
Ð+;Ñ <¸dÓCˆDÜ�w‰w�~‰~˜dÔ#Ø�Øœ2Ÿ:™:Ñ%Ü—7‘7—?‘?Ü—‘—‘œRŸZ™Z¨Ñ5¸ÀTÀFÐ7KÓLóˆDô �w‰w�~‰~˜dÔ#Ø�à˜$˜ÐVÐWð 	ô ×/Ñ/°+¸d¸VÐ0DÀfÓMÐMrf   c                ó  ‡‡— t        t        t        |t        | j	                  «       |f«      ¬«      d«      d   «      }t        j                  |d¬«       d Št        |dz  «      }t        |dz  «      }t        |dz  «      }t        |d	z  «      }t        |d
z  «      }	t
        j                  j                  |«       }
g }|
r±t        ||«       t        j                  |ddd|› ddddg
}|j                  r,|j                  d| j                  |j                  «      g«       |j                  |j!                  «       «       |j#                  t%        j&                  t(        j*                  |«      «       |j,                  D �cg c]  }|j.                  �Œ|j1                  «       ‘Œ! }}|j3                  «       r|j#                  d«       | j5                  || j7                  ||«      || j9                  «       f|
r|j"                  nd |j3                  «       ¬«      Š|
r`|j#                  t%        j&                  t:        |«      «       t%        j&                  t<        |	|«      }|r ||«      j>                  Šn |«        dˆˆfd„}|S c c}w )Nr¼  r6  rF  Trs   zgenerate_kernel.pyzhalide_kernel.azhalide_kernel.hÚdonera  ú-grÙ  ú-oz-fÚhalide_kernelz-ezstatic_library,h,schedulez-pÚ	uintptr_t)r»  rÆ  rw   c                 ó$   •— ‰r ‰«         ‰ «       S r_   r`   )Úbindings_futureÚwait_for_compiles   €€rd   rµ   z3HalideCodeCache.generate_halide_async.<locals>.load¬
  s   ø€ ÙÙ Ô"Ù"Ó$Ð$rf   )rÃ   úCallable[[], Any]) r   r  r  r#  r4  r}   r€   rÀ   r~   r  r¿   ry   Ú
executableÚ	schedulerr$  rH  rb   r‰  rË   r
   rÅ  rÆ  ró  r  r  r  r÷  r.  Úbuild_standalone_runtimeÚtouchÚ_worker_task_halider«  )rx  rT  rV  rÆ  ÚdirpathÚgenfileÚlibfiler  ÚdonefileÚlockfileÚneed_compileÚjobsrË  r¡  Úbinding_typesÚtaskrµ   rR  rS  s                    @@rd   Úgenerate_halide_asyncz%HalideCodeCache.generate_halide_asyncn
  sI  ù€ ô ÜÜØÜ §¡Ó 1°4Ð8Ó9ôð óð ñó
ˆô 	�‰�G dÕ+ØÐÜ�gÐ 4Ñ4Ó5ˆÜ�gÐ 1Ñ1Ó2ˆÜ˜Ð#4Ñ4Ó5ˆ
Ü�w Ñ'Ó(ˆÜ�w Ñ'Ó(ˆÜŸ7™7Ÿ>™>¨(Ó3Ð3ˆØˆÙÜ˜ +Ô.ä—‘ØØØØØ�)ØØØØ+ðˆCð �~Š~Ø—
‘
˜D #×":Ñ":¸4¿>¹>Ó"JÐKÔLØ�J‰J�t—y‘y“{Ô#Ø�K‰Kœ	×)Ñ)¬*×*?Ñ*?ÀÓEÔFð ,0¯=©=ö
Ø$'¸C¿L¹LÑ<PˆC×ÑÕð
ˆð 
ð �<‰<Œ>Ø× Ñ  Ô-Ø×2Ñ2ØØ×Ñ˜d JÓ/Ø  #×">Ñ">Ó"@ÐAÙ%1�d—k’k°tØ—‘“ð 3ó 
ˆñ Ø�K‰Kœ	×)Ñ)¬%°Ó:Ô;Ü×$Ñ$Ô%8¸(ÀDÓIˆDÙÙ#,¨T£?×#9Ñ#9Ñ á”ö	%ð
 ˆùò5
s   ÆJÆJc                ó0   —   | j                   |i |¤Ž«       S r_   )rc  rù  s      rd   Úgenerate_halidezHalideCodeCache.generate_halide³
  s    € à9Ð(ˆs×(Ñ(¨$Ð9°&Ñ9Ó;Ð;rf   c           	     ól  — | j                   r5t        j                  j                  | j                   «      r| j                   S t        j
                  j                  «       }d}|rdnd}| j                   r6t        j                  j                  | j                   «      rJ ‚t        «       }n
t        «       }t        |«      d|› d| j                  «       › �z  }t        j                  |d¬«       t        |dz  «      }t        |d	z  «      }t        |d
z  «      }t        |dz  «      }	t        ||z  «      }
t        j                  j                  |«      �s!dd l}dd l}|j                  |t         «      5  t        j                  j                  |«      sÛt#        |d«      5 }|r9|j%                  | j&                  j)                  | j+                  d«      «      «       d d d «       |j-                  |	|j/                  |«      «       t1        |
«      \  }}t3        |||	g|t5        |¬«      ¬«      }t7        j8                  t;        j<                  |j?                  «       «      «       tA        |«       d d d «       t        j                  j                  |
«      sJ ‚|
| _         |
S # 1 sw Y   ŒÆxY w# 1 sw Y   Œ?xY w)NzlibStandaloneHalideRuntime.soz	host-cudar  zhalide-runtime-ú-Trs   rL  ra  z	hooks.cppzstandalone_halide_runtime.ar   r3  r  ©rw   r+  )!r  r}   r~   r  ru   rw   r  rB   rA   r   r4  r€   rÀ   rI  r6  r  rJ  r´   r*  r2  r)  r*  Úcompile_standalone_runtimeÚTargetr8   r3   r5   rÅ  rÆ  rÃ  rÄ  rG  rX  )rx  r  Úlibnamerƒ  ÚbaserZ  r]  r^  ÚhookfileÚafilerG  rI  Úhlr?  r�   r,  Úhalide_cmd_gens                    rd   rW  z(HalideCodeCache.build_standalone_runtime·
  s@  € à×'Ò'¬B¯G©G¯N©NØ×(Ñ(ô-
ð ×/Ñ/Ð/Ü—*‘*×)Ñ)Ó+ˆØ1ˆÙ '‘¨VˆØ×'Ò'Ü—w‘w—~‘~ c×&BÑ&BÔCÐCÐCô
 %Ó&‰Dä“;ˆDÜ�t“* °°¸¸#¿/¹/Ó:KÐ9LÐMÑMˆÜ
�‰�G dÕ+Ü�w Ñ'Ó(ˆÜ�w Ñ'Ó(ˆÜ�w Ñ,Ó-ˆÜ�GÐ;Ñ;Ó<ˆÜ�W˜wÑ&Ó'ˆÜ�w‰w�~‰~˜hÕ'ÛÛà×"Ñ" 8¬\Ó:ñ $Ü—w‘w—~‘~ hÔ/Ü˜h¨Ó,ð °Ù"ØŸG™GØ #× @Ñ @× GÑ GØ$'§O¡OÐ4IÓ$Jó!"ô÷ð ×1Ñ1°%¸¿¹À6Ó9JÔKä'MÈfÓ'UÑ$�D˜*Ü%/Ø!Ø!)¨5Ð 1Ø#-Ü$7Ø!(ô%ô	&�Nô ×)Ñ)ÜŸ™ N×$CÑ$CÓ$EÓFôô ˜(”O÷1$ô2 �w‰w�~‰~˜fÔ%Ð%Ð%Ø'-ˆÔ$Øˆ÷3ð ú÷$ð $ús%   Å1,J*Æ<JÇBJ*ÊJ'	Ê#J*Ê*J3)r�   rÀ   r¡  rU   rw   ró   rÃ   r”  )rT  rV   r  ÚobjectrÃ   rÀ   r°  )rö  rÀ   r>  rÀ   rÃ   rÀ   ©r�   rÀ   rÃ   rÀ   r_   )rT  rV   rV  rÀ   rÆ  r   rÃ   rT  )rb   r   rc   r   rÃ   rT  )rÇ   rÈ   rÉ   r¨   rG  rÊ   r¯  rÚ  r  rû  rü  r¬  r(  r'  r2  rš  r  r.  rË   rÌ   r4  rB  rH  r*  rc  re  rW  r`   rf   rd   r  r  “	  s´  … à>@€EÐ;Ó@Ù˜uŸ{™{Ó+€KØ.2Ð˜mÓ2ØˆX�_‰_ð	ó€Fð&   §¡ð	ó"ñ Ðð   / (§/¡/ð		ó#ñ Ðð $3 8§?¡?ð	ó$Ð ðB ò
ó ð
ðB òó ðð> Ø€Y×Ñ˜Óò
ó ó ð
ð$ ò#ó ð#ð. Ø€Y×Ñ˜Óò	@ó ó ð	@ð Ø€Y×Ñ˜ÓòNó ó ðNð  àBFðBØðBØ,/ðBØ<?ðBà	òBó ðBðH ò<ó ð<ð ò7ó ñ7rf   r  c                óB  — ddl m} 	  || t        «      5  |D ]	  } |«        Œ 	 d d d «       y # 1 sw Y   y xY w# t        j                  $ �rP}t
        j                  j                  d«      dk(  �r't        |dd«      ^}}}t
        j                  j                  |«      j                  d«      rét        |«      j                  «       }d}	|j                  |	«      d	k(  sJ ‚ G d
„ d«      }
 |
«       ||j                  d«      d	z   <   t!        j"                  t!        j$                  ddg|¢›d�«      d«      }|j'                  |	|«      }t        dd«      5 }|j)                  |j+                  «       «       d d d «       n# 1 sw Y   nxY wt-        d|› �«      |‚‚ d }~ww xY w)Nr   r  ÚHALIDE_REPROÚ1rË  )rp   rp   rp   Úpythonz    hl.main()r+   c                  ó   — e Zd Zdd„Zy)ú _worker_task_halide.<locals>.Outc                 ó   — y)Nr@  r`   r®   s    rd   Ú__repr__z)_worker_task_halide.<locals>.Out.__repr__  s   € Ø$rf   Nr°  )rÇ   rÈ   rÉ   rz  r`   rf   rd   ÚOutrx    s   „ ô%rf   r{  rN  z—                        import sys, tempfile
                        with tempfile.TemporaryDirectory() as out:
                            sys.argv = zrepro.pyz?
                            hl.main()
                        r  r3  zwrote repro.py: )rI  r  rJ  rÅ  r:  r}   rÞ  rå   r~  r~   r  r¢  r´   r§  ÚcountÚindexrû  r¼   rü  rx   r*  r&  rœ   )r^  r`  r  Újobrÿ   rv  ÚscriptrË  r  Úmainr{  ÚreplÚfds                rd   rY  rY  ò
  s‰  € Ý!ð Ù�h¤Ó-ñ 	Øò �Ù•ñ÷	÷ 	ñ 	ûô ×%Ñ%ó Ü�:‰:�>‰>˜.Ó)¨SÓ0Ü#*¨1¨e°\Ó#BÐ ˆF�F˜SÜ�w‰w×Ñ Ó'×2Ñ2°8Ô<Ü˜F“|×(Ñ(Ó*�Ø&�Ø—z‘z $Ó'¨1Ò,Ð,Ð,÷%ñ %ñ ,/«5��C—I‘I˜d“O aÑ'Ñ(Ü—‘Ü—O‘Oð(ð *4Ð(:°cÐ(:Ð'=ð >ðóð ó
�ð —|‘| D¨$Ó/�Ü˜* cÓ*ð ,¨bØ—H‘H˜TŸ[™[›]Ô+÷,÷ ,ñ ,úä"Ð%5°a°SÐ#9Ó:ÀÐAØûð9úsB   ˆ: •.¥: ®7³: ·: ºFÁDFÅ E=Å4	FÅ=F	ÆFÆFc                ó8   — t        | d«      j                  «        y )NrD  )r´   Úcloser~  s    rd   rX  rX    s   € Üˆ�3Ó×ÑÕrf   c                  ó   — e Zd ZU i Zded<   i Zded<    eej                  «      Ze	d
dd„«       Z
e		 	 	 d	 	 	 	 	 	 	 	 	 dd„«       Ze		 	 d	 	 	 	 	 	 	 	 	 dd„«       Ze	 ej                  d«      	 	 	 	 	 	 dd	„«       «       Zy)rZ  zDict[str, ModuleType]r¨   z Dict[str, List[Tuple[Any, ...]]]Úlinemapsc                ó   — t        |d|¬«      S ©Nrq   r¼  r-  )rx  rV  r  s      rd   r*  zPyCodeCache.write"  s   € ä�[ $¨eÔ4Ð4rf   Nc                óL   — t        |d|¬«      \  }}| j                  ||||«      S rˆ  )r*  r[  )rx  rV  r  ÚlinemapÚattrsrÒ   r~   s          rd   rµ   zPyCodeCache.load&  s-   € ô ˜+ t°5Ô9‰	ˆˆTØ×#Ñ# C¨¨w¸Ó>Ð>rf   c                óf  — |€g }|| j                   vr‘t        ||«      }| j                   j                  ||«       t        t	        |Ž «      | j
                  |<   |�%|j                  «       D ]  \  }}t        |||«       Œ |s"|s t        j                  t        ||«      |_        | j                   |   S r_   )r¨   r?   rÖ   r†  r‰  r†  rù   ÚsetattrrË   r
   r@   Ú_reload_in_subproc)rx  rÒ   r~   rŠ  r‹  Úmodr�  r‘  s           rd   r[  zPyCodeCache.load_by_key_path1  s¯   € ð ˆ?ØˆGØ�c—i‘iÑÜ'¨¨TÓ2ˆCð �I‰I× Ñ   cÔ*ä!%¤c¨7 mÓ!4ˆC�L‰L˜ÑàÐ Ø!ŸK™K›Mò '‘D�A�qÜ˜C  AÕ&ð'ñ ™uÜ)2×):Ñ):Ü4°c¸4ó*�Ô&ð �y‰y˜‰~Ðrf   c                ó–   — || j                   vry | j                   |   \  }}t        ||«      }|dk(  ry ||dz
     }|sy dd„} ||«      S )Nr   r+   c           	     óœ   — d}t        j                  || «      }t        |«      D ���cg c]  \  }}}|t        |«      |dœ‘Œ c}}}S c c}}}w )Nz"File "(.+)", line (\d+), in (.+)\n)rN  r+  r�   )rX  ÚfindallÚreversedr  )Ústack_traceÚregexÚmatchesr?  Úlrì  s         rd   Úparse_stack_tracez<PyCodeCache.stack_frames_for_code.<locals>.parse_stack_trace^  sV   € ð :ˆEÜ—j‘j ¨Ó4ˆGô  (¨Ó0÷ð á�A�q˜!ð ¬¨A«¸Ó:ôð ùô s   ¨A)r”  rÀ   rÃ   zList[Dict[str, Any]])r†  r   )rx  r~   ÚlinenorŒ  r‚  r•  Úentryr˜  s           rd   Ústack_frames_for_codez!PyCodeCache.stack_frames_for_codeN  s`   € ð
 �s—|‘|Ñ#Øà—|‘| DÑ)‰ˆˆuÜ˜ Ó'ˆØ�Š6ØØ�a˜!‘e‘ˆÙØó	ñ ! Ó'Ð'rf   ©rp   )rV  rÀ   r  rÀ   rÃ   úTuple[str, str])rp   NN)
rV  rÀ   r  rÀ   rŠ  rµ  r‹  rÙ   rÃ   r   )NN)
rÒ   rÀ   r~   rÀ   rŠ  rµ  r‹  rÙ   rÃ   r   )r~   rÀ   r™  r  rÃ   zOptional[List[Dict[str, Any]]])rÇ   rÈ   rÉ   r¨   rG  r†  rÊ   r¯  rÚ  rš  r*  rµ   r[  rË   rÌ   r›  r`   rf   rd   rZ  rZ    s  … à#%€EÐ Ó%Ø13€HÐ.Ó3Ù˜uŸ{™{Ó+€Kàó5ó ð5ð ð Ø37Ø*.ð?àð?ð ð?ð 1ð	?ð
 (ð?ð 
ò?ó ð?ð ð
 48Ø*.ðàðð ðð 1ð	ð
 (ðð 
òó ðð8 Ø€Y×Ñ˜Óð(Øð(Ø #ð(à	'ò(ó ó ñ(rf   rZ  c                  ó   — e Zd Zedd„«       Zy)ÚTritonCodeCachec                ó@   — t        t        j                  |«      |«      S r_   )r>   rZ  rµ   )rx  Úkernel_namerV  s      rd   rµ   zTritonCodeCache.loadl  s   € ä'¬×(8Ñ(8¸Ó(EÀ{ÓSÐSrf   N)r¡  rÀ   rV  rÀ   rÃ   r   )rÇ   rÈ   rÉ   rš  rµ   r`   rf   rd   rŸ  rŸ  k  s   „ ØòTó ñTrf   rŸ  c                 óŽ  — t        j                  t        j                  j                  «      rt        j                  j                  S t        j
                  «       r3t        j                  j                  t        j                  «       dd«      S t        j                  t        j                  d«      «      rt        j                  dd«      S t        j                  t        j                  d«      «      rQt        j                  j                  t        j                  j                  t        j                  dd«      d«      «      S y)Nrî  ÚnvccÚCUDACXXrp   Ú	CUDA_HOMEzbin/nvcc)r'   Ú
nvcc_existr$   rw   Úcuda_cxxr¿  r}   r~   r   rX   ÚgetenvÚrealpathr`   rf   rd   Ú_cuda_compilerrª  q  sÇ   € Ü×Ñœ6Ÿ;™;×/Ñ/Ô0Ü�{‰{×#Ñ#Ð#Ü×ÑÔÜ�w‰w�|‰|œK×,Ñ,Ó.°°vÓ>Ð>Ü×Ñœ2Ÿ9™9 YÓ/Ô0Ü�y‰y˜ BÓ'Ð'Ü×Ñœ2Ÿ9™9 [Ó1Ô2Ü�w‰w×Ñ¤§¡§¡¬R¯Y©Y°{ÀBÓ-GÈÓ TÓUÐUØrf   c            	     ór  — t        j                  «       rddlm}  | j	                  d«      }nt         j
                  j                  }t        j                  j                  t        j                  j                  |d«      «      t        j                  j                  t        j                  j                  |d«      «      t        j                  j                  t        j                  j                  |d«      «      t        j                  j                  t        j                  j                  |d«      «      gS )Nr   r¼  zcutlass-3-headersrƒ  ztools/library/includeztools/library/srcztools/util/include)r$   r¿  rÁ  r½  Úget_dir_pathrw   Úcutlass_dirr}   r~   r©  r   )r½  Úcutlass_paths     rd   Ú_cutlass_include_pathsr¯  }  sÄ   € Ü×ÑÔÝ$à×+Ñ+Ð,?Ó@‰ä—{‘{×.Ñ.ˆô 	�‰×ÑœŸ™Ÿ™ l°IÓ>Ó?Ü
�‰×ÑœŸ™Ÿ™ lÐ4KÓLÓMÜ
�‰×ÑœŸ™Ÿ™ lÐ4GÓHÓIÜ
�‰×ÑœŸ™Ÿ™ lÐ4HÓIÓJðð rf   c                 óB  — t        «        ddlm}  | j                  d¬«      t	        j
                  d«      gz   }g }t        «       rPt        |«       |D ]  }|j                  d|› �dd|› �g«       Œ |j                  d	«       |j                  d
«       |S t        d«      ‚)Nr   )Úcpp_extensionTrh  ÚLIBDIRz-Lz-Xlinkerz-rpath=z-lcudaz-lcudartzMUnsupported env, failed to find cuda libs! Currently only Linux is supported.)r1   Útorch.utilsr±  Úlibrary_pathsÚ	sysconfigÚget_config_varrG   r2   r$  r‰  ÚNotImplementedError)r±  ÚlpathsÚextra_ldflagsr~   s       rd   Ú_cuda_lib_optionsrº  �  s·   € ÜÔÝ)à×(Ñ(¨dÐ(Ó3Ü× Ñ  Ó*ð7ñ €Fð  "€MÜ„zÜ˜fÔ%Øò 	NˆDð × Ñ  B t f +¨z¸WÀTÀFÐ;KÐ!LÕMð	Nð 	×Ñ˜XÔ&Ø×Ñ˜ZÔ(ð
 Ðô "Ø[ó
ð 	
rf   c                 ó
   — g d¢S )N)z-fPICz-fno-strict-aliasingz-fvisibility=hiddenz-Wconversionr`   r`   rf   rd   Ú_nvcc_host_compiler_optionsr¼  ¤  s   € òð rf   c            	     óÀ  — t        j                  «       } | dk(  rd} d| › �d| › �g}t        j                  j                  r	|d| › �gz  }dddd	| › d
dj                  |«      › d�t        j                  j                  dddg}t        j                  «       rB|j                  dt        j                  j                  t        j                  «       «      g«       t        j                  j                  r|j                  g d¢«       t        j                  j                  r|j                  g d¢«       t        j                  j                   r|j                  ddg«       |S )NÚ90Ú90aÚsm_Úcompute_Últo_z-t=0z"-DCUTLASS_ENABLE_TENSOR_CORE_MMA=1z-wz-gencode=arch=compute_z,code=[ú,ú]z
-std=c++17z--expt-relaxed-constexprz-DNDEBUGz-ccbin)z	-lineinforM  z-DCUTLASS_DEBUG_TRACE_LEVEL=1)z--keepz,--ptxas-options=--warn-on-local-memory-usagez --ptxas-options=--warn-on-spillsz--resource-usagez--source-in-ptxz--use_fast_mathz -DCUTLASS_USE_TANH_FOR_SIGMOID=1)r'   Úget_cuda_archr$   rw   Úenable_cuda_ltor   Úcompile_opt_levelr¿  r$  r}   r~   rµ  rX   ÚgccÚenable_debug_infoÚenable_ptxas_infoÚuse_fast_math)Úarchr  Úoptionss      rd   Ú_nvcc_compiler_optionsrÎ  ­  s+  € Ü×!Ñ!Ó#€DØˆt‚|àˆØ�$�ˆL˜H T FÐ+Ð,€DÜ‡{�{×"Ò"Ø�4˜�v��ÑˆàØ,ØØ
    g¨c¯h©h°t«nÐ-=¸QÐ?Ü�‰×%Ñ%ØØ"Øð	€Gô ×ÑÔØ�‰˜¤"§'¡'§/¡/´+·/±/Ó2CÓ"DÐEÔFÜ‡{�{×$Ò$Ø�‰ÒKÔLÜ‡{�{×$Ò$Ø�‰òô	
ô ‡{�{× Ò Ø�‰à!Ø2ðô	
ð €Nrf   c                ór  — |€g }t        «       }t        «       }t        «       }t        «       }||z   |D �cg c]  }d|v rd|› �nd|› �‘Œ c}z   |D �	cg c]  }	d|	z   ‘Œ	 c}	z   |z   }
dj	                  | «      }d}|dk(  r%t        «       › ddj	                  |
«      › d|› d|› �}nt|d	k(  r6|
j                  d
«       t        «       › ddj	                  |
«      › d|› d|› �}n9|dk(  r%t        «       › ddj	                  |
«      › d|› d|› �}nt        d|› d�«      ‚t        j                  d|«       |S c c}w c c}	w )Nú=z-Xcompiler z-Xcompiler=z-Irñ  rp   rÞ  r  r¾  z-sharedz -o ÚexezUnsupported output file suffix ú!zCUDA command: %s)
r¯  rº  r¼  rÎ  r   rª  r‰  r·  ru  rê  )Ú	src_filesÚdst_fileÚdst_file_extÚ
extra_argsÚinclude_pathsÚcuda_lib_optionsÚnvcc_host_compiler_optionsÚnvcc_compiler_optionsÚoptr~   rÍ  Úsrc_fileÚress                rd   Úcuda_compile_commandrÞ  ×  s†  € ð ÐØˆ
Ü*Ó,€MÜ(Ó*ÐÜ!<Ó!>ÐÜ2Ó4ÐàØ
ñ	ð 2ö
àð $'¨#¡:ˆk˜#˜Ñ°[ÀÀÐ3FÑFò
ñ	
ð $1Ö
1˜4ˆ4�$‹;Ò
1ñ	2ð ñ	ð ð �x‰x˜	Ó"€HØ
€CØ�sÒÜÓ!Ð" ! C§H¡H¨WÓ$5Ð#6°g¸h¸ZÀqÈÈ
ÐS‰Ø	˜Ò	Ø�‰�yÔ!ÜÓ!Ð" ! C§H¡H¨WÓ$5Ð#6°d¸8¸*ÀAÀhÀZÐP‰Ø	˜Ò	ÜÓ!Ð" ! C§H¡H¨WÓ$5Ð#6°d¸8¸*ÀAÀhÀZÐP‰ä!Ð$CÀLÀ>ÐQRÐ"SÓTÐTÜ‡I�IÐ  #Ô&Ø€Jùò'
ùò 2s   µD/ÁD4c                  óP   — e Zd ZdZ	 	 	 	 d
d„Zdd„Zdd„Zdd„Zdd„Zdd„Z	dd„Z
y	)Ú
DLLWrapperz A wrapper for a dynamic library.c                ób   — || _         d| _        t        j                  |«      | _        d| _        y )NFT)Úlib_pathÚis_openr   r³  ÚDLL)r¯   râ  s     rd   r°   zDLLWrapper.__init__ÿ  s+   € ð !ˆŒØˆŒÜ×#Ñ# HÓ-ˆŒØˆ�rf   c                óL   — | j                   r| j                  «        d| _         y y rj   )rã  Ú_dlcloser®   s    rd   r„  zDLLWrapper.close  s   € Ø�<Š<Ø�M‰MŒOØ ˆD�Lð rf   c                ó   — d }t        «       r;t        d «      }t        |d«      st        d«      }t        |d«      rF|j                  }n9t	        «       r$dd l}|j                  dd¬«      }|j                  }nt        d«      ‚|�wt        «       r)t        g|_	         || j                  j                  «       y t	        «       r9dd l}ddlm} |j                  g|_	         || j                  j                  «       y y t        j                  d	«       y )
NÚdlclosezlibc.sor   Úkernel32T)Úuse_last_errorz&Unsupported env, failed to do dlclose!)ÚwintypeszKdll unloading function was not found, library may not be unloaded properly!)rG   r   rP  rè  rH   r4  ÚFreeLibraryr·  r   ró  rä  Ú_handlerë  ÚHMODULEru  rv  )r¯   Ú	f_dlcloseÚsymsr4  ré  rë  s         rd   ræ  zDLLWrapper._dlclose  s×   € Øˆ	äŒ:Ü˜“:ˆDÜ˜4 Ô+ä˜I“�ä�t˜YÔ'Ø ŸL™L‘	ÜŒ\Ûà—{‘{ :¸d�{ÓCˆHà ×,Ñ,‰Iä%Ð&NÓOÐOàÐ ÜŒzÜ&. Z�	Ô"Ù˜$Ÿ(™(×*Ñ*Õ+Ü”ÛÝ+à&.×&6Ñ&6Ð%7�	Ô"Ù˜$Ÿ(™(×*Ñ*Õ+ð ô �K‰KØ]õrf   c                óˆ   ‡— | j                   st        d| j                  › �«      ‚t        | j                  |«      Šdˆfd„}|S )NzCannot use closed DLL library: c                 óD   •—  ‰| Ž }|rt        d‰j                  › �«      ‚y )NzError in function: )rœ   rÇ   )rb   ÚerrÚmethods     €rd   Ú_wrapped_funcz-DLLWrapper.__getattr__.<locals>._wrapped_func6  s,   ø€ Ù˜$�-ˆCÙÜ"Ð%8¸¿¹Ð8IÐ#JÓKÐKð rf   ©rb   r   rÃ   rÆ   )rã  rœ   râ  r~  rä  )r¯   r�   rõ  rô  s      @rd   Ú__getattr__zDLLWrapper.__getattr__0  s?   ø€ Ø�|Š|ÜÐ!@ÀÇÁÀÐPÓQÐQä˜Ÿ™ 4Ó(ˆõ	Lð
 Ðrf   c                ó   — | S r_   r`   r®   s    rd   Ú	__enter__zDLLWrapper.__enter__=  s   € Øˆrf   c                ó$   — | j                  «        y r_   ©r„  )r¯   rb   s     rd   Ú__exit__zDLLWrapper.__exit__@  ó   € Ø�
‰
�rf   c                ó$   — | j                  «        y r_   rû  r®   s    rd   Ú__del__zDLLWrapper.__del__C  rý  rf   N)râ  rÀ   rÃ   rÆ   rÅ   )r�   rÀ   rÃ   zCallable[..., None])rÃ   rà  rö  )rÇ   rÈ   rÉ   rF  r°   r„  ræ  r÷  rù  rü  rÿ  r`   rf   rd   rà  rà  ü  s;   „ Ù*ðàðð 
óó!ó
!óFóóôrf   rà  c                  ó¾   — e Zd ZU ej                   G d„ d«      «       Zi Zded<    eej                  «      Z
dZed
d„«       Ze	 d	 	 	 	 	 	 	 dd„«       Zedd	„«       Zy)ÚCUDACodeCachec                  ó"   — e Zd ZU ded<   ded<   y)úCUDACodeCache.CacheEntryrÀ   rë  rÔ  N©rÇ   rÈ   rÉ   rG  r`   rf   rd   Ú
CacheEntryr  I  ó   … à‹ØÔrf   r  úDict[str, CacheEntry]r¨   rn   c                ón   — t        t        dgd|«      «      }t        || j                  |¬«      \  }}||fS ©z 
        Writes source code into a file with dst_file_ext as the file extension.
        Returns the hash key of source code, and the path to the file.
        Údummy_inputÚdummy_outputr¼  )r#  rÞ  r*  Ú_SOURCE_CODE_SUFFIX©rx  rV  rÕ  Úcuda_commandrÒ   rë  s         rd   r*  zCUDACodeCache.writeR  óE   € ô Ü  - °.À,ÓOó
ˆô  Ø˜×0Ñ0¸ô
‰ˆˆZð �JˆÐrf   Nc                óÎ  — | j                  ||«      \  }}|| j                  v�r^ddlm} t	        «       } |t
        j                  j                  ||dz   «      t        ¬«      }|5  |dt        | j                  «        |z   }	t
        j                  j                  |	«      s t        |g|	||«      }
t        «       }t        j                  d|
«       |
j!                  d«      }	 t#        j$                  |t"        j&                  t
        j(                  ¬«       t        «       }d	||z
  › d
|
› �}t        j3                  |«       nt        j                  d|«       t4        j7                  ||	«      | j                  |<   ddd«       | j                  |   j8                  ||fS # t"        j*                  $ r&}t-        j.                  ||j0                  «      |‚d}~ww xY w# 1 sw Y   ŒaxY w)z™
        Compiles CUDA source_code into a file with dst_file_ext extension.
        Returns a tuple of dst_file_path, hash_key, source_code_path
        r   r  r  r  NzCUDA Compilation: %srñ  )r„  ÚenvzCUDA Compilation took ú seconds. Compile command: z8CUDA Compilation skipped: %s since output already exists)r*  r¨   rI  r  r  r}   r~   r   rJ  rˆ  r  r  rÞ  r   ru  rê  rÄ  rÅ  rŒ  r�  rÞ  rÇ  r%   ÚCUDACompileErrorrÉ  r"  r  r  rÔ  )rx  rV  rÕ  rÖ  rÒ   rë  r  r  ra  rÔ  rË  r¨  Ú	cmd_partsr_  Úend_timeÚlog_duration_msgs                   rd   r{  zCUDACodeCache.compilea  s©  € ð Ÿ)™) K°Ó>‰ˆˆZØ�c—i‘iÒÝ)ä#“~ˆHÙœBŸG™GŸL™L¨°3¸±=ÓAÌ<ÔXˆDØñ SØ(Ð)H¬C°×0GÑ0GÓ,HÐ+HÐIÈLÑX�Ü—w‘w—~‘~ kÔ2Ü.Ø#˜ k°<Àó�Cô "&£�JÜ—I‘IÐ4°cÔ:Ø #§	¡	¨#£�IðWÜ"×/Ñ/Ø%¬j×.?Ñ.?ÄRÇZÁZõô
  $›v�HØ)?ÀÈ:Ñ@UÐ?VÐVqÐruÐqvÐ'wÐ$Ü—H‘HÐ-Õ.ä—I‘IØRØ"ôô "/×!9Ñ!9¸*ÀkÓ!R�—	‘	˜#‘÷/Sð2 —	‘	˜#‘×*Ñ*¨C°Ð<Ð<øô &×8Ñ8ò WÜ!×2Ñ2°9¸e¿l¹lÓKÐQVÐVûðWú÷Sð Sús2   Á&A<GÃ#4FÄA$GÆGÆ2!GÇGÇGÇG$c                óv   — |dk7  rt        d|› d|› �«      ‚| j                  ||«      \  }}}t        |«      ||fS ©zŠ
        Compiles source code and loads the generated .so file.
        Returns a tuple of DLLWrapper, hash_key, source_code_path
        r¾  zCOnly support loading a .so file for now. Requested file extension: z. Source code: ©rœ   r{  rà  ©rx  rV  rÕ  Údst_file_pathrä   Úsource_code_paths         rd   rµ   zCUDACodeCache.loadŠ  óa   € ð ˜4ÒÜð-Ø-9¨N¸/È+ÈðXóð ð 58·K±KØ˜ó5
Ñ1ˆ�xÐ!1ô ˜=Ó)¨8Ð5EÐFÐFrf   ©rV  rÀ   rÕ  rÀ   rÃ   r�  r_   ©rV  rÀ   rÕ  rÀ   rÖ  úOptional[List[str]]rÃ   úTuple[str, str, str]©rV  rÀ   rÕ  rÀ   rÃ   zTuple[DLLWrapper, str, str])rÇ   rÈ   rÉ   rQ  Ú	dataclassr  r¨   rG  rÊ   r¯  rÚ  r  rš  r*  r{  rµ   r`   rf   rd   r  r  G  s    … à×Ñ÷ð ó ðð $&€EÐ Ó%Ù˜uŸ{™{Ó+€KØÐàòó ðð àTXð&=Øð&=Ø-0ð&=Ø>Qð&=à	ò&=ó ð&=ðP òGó ñGrf   r  c                  óÂ   — e Zd ZU ej                   G d„ d«      «       Zi Zded<    eej                  «      Z
dZdZedd„«       Ze	 d	 	 	 	 	 	 	 dd	„«       Zedd
„«       Zy)ÚROCmCodeCachec                  ó"   — e Zd ZU ded<   ded<   y)úROCmCodeCache.CacheEntryrÀ   rë  rÔ  Nr  r`   rf   rd   r  r'  ž  r  rf   r  r  r¨   rç  Fc                ón   — t        t        dgd|«      «      }t        || j                  |¬«      \  }}||fS r	  )r#  r(   r*  r  r  s         rd   r*  zROCmCodeCache.write¨  r  rf   Nc                óT  — | j                   s6d| _         t        j                  t        t	        t        «       «      «      «       | j                  ||«      \  }}|| j                  v�r_ddlm	} t        «       } |t        j                  j                  ||dz   «      t        ¬«      }|5  |dt        | j                   «        |z   }	t        j                  j#                  |	«      s¡t%        |g|	||«      }
t'        «       }|
j)                  d«      }	 t+        j,                  |t*        j.                  dt        j0                  ¬«      }t        j                  d	|«       t'        «       }d
||z
  › d|
› �}t        j;                  |«       nt        j                  d|«       t<        j?                  ||	«      | j                  |<   ddd«       | j                  |   j@                  ||fS # t*        j2                  $ r&}t5        j6                  ||j8                  «      |‚d}~ww xY w# 1 sw Y   ŒaxY w)zÖ
        Compiles source_code into a file with dst_file_ext extension,
        using the compile command specific for the ROCm platform.
        Returns a tuple of dst_file_path, hash_key, source_code_path
        Tr   r  r  r  Nrñ  )r„  r.  r  zCompilation output: %szCompilation took r  z3Compilation skipped: %s since output already exists)!Ú_logged_compiler_versionru  rê  r6   rÀ   r)   r*  r¨   rI  r  r  r}   r~   r   rJ  rˆ  r  r  r(   r   rÄ  rÅ  rŒ  r�  rÞ  rÇ  r%   r  rÉ  r"  r%  r  rÔ  )rx  rV  rÕ  rÖ  rÒ   rë  r  r  ra  rÔ  rË  r¨  r  rÉ  r_  r  r  s                    rd   r{  zROCmCodeCache.compile·  sÜ  € ð ×+Ò+Ø+/ˆCÔ(Ü�I‰IÔ/´´M³OÓ0DÓEÔFàŸ)™) K°Ó>‰ˆˆZØ�c—i‘iÒÝ)ä#“~ˆHÙœBŸG™GŸL™L¨°3¸±=ÓAÌ<ÔXˆDØñ SØ(Ð)H¬C°×0GÑ0GÓ,HÐ+HÐIÈLÑX�Ü—w‘w—~‘~ kÔ2Ü.Ø#˜ k°<Àó�Cô "&£�JØ #§	¡	¨#£�Ið	WÜ!+×!8Ñ!8Ø%Ü#-×#4Ñ#4Ø!%Ü "§
¡
ô	"˜ô Ÿ	™	Ð":¸FÔCô  $›v�HØ):¸8ÀjÑ;PÐ:QÐQlÐmpÐlqÐ'rÐ$Ü—H‘HÐ-Õ.ä—I‘IØMØ"ôô "/×!9Ñ!9¸*ÀkÓ!R�—	‘	˜#‘÷5Sð8 —	‘	˜#‘×*Ñ*¨C°Ð<Ð<øô &×8Ñ8ò WÜ!×2Ñ2°9¸e¿l¹lÓKÐQVÐVûðWú÷!Sð Sús3   Â(A&HÄAG"ÅA$HÇ"HÇ5!HÈHÈHÈH'c                óv   — |dk7  rt        d|› d|› �«      ‚| j                  ||«      \  }}}t        |«      ||fS r  r  r  s         rd   rµ   zROCmCodeCache.loadè  r  rf   r  r_   r  r"  )rÇ   rÈ   rÉ   rQ  r#  r  r¨   rG  rÊ   r¯  rÚ  r  r*  rš  r*  r{  rµ   r`   rf   rd   r%  r%  œ  s¦   … à×Ñ÷ð ó ðð $&€EÐ Ó%Ù˜uŸ{™{Ó+€KØÐØ$Ðàòó ðð àTXð.=Øð.=Ø-0ð.=Ø>Qð.=à	ò.=ó ð.=ð` òGó ñGrf   r%  c                  ó   — e Zd Zdd„Zy)ÚCodeCacheFuturec                ó   — t         ‚r_   )r·  r®   s    rd   r«  zCodeCacheFuture.resultû  s   € Ü!Ð!rf   NrÅ   )rÇ   rÈ   rÉ   r«  r`   rf   rd   r-  r-  ú  s   „ ô"rf   r-  c                  ó4   — e Zd ZU ded<   	 	 	 	 	 	 dd„Zdd„Zy)ÚTritonFuturer   rÙ  c                ó    — || _         || _        y r_   )rÙ  rÁ  )r¯   rÙ  rÁ  s      rd   r°   zTritonFuture.__init__  s   € ð
 ˆŒØˆ�rf   c                ó°   — | j                   �?| j                   j                  «       }|�J ‚d | _         | j                  j                  «        | j                  S r_   )rÁ  r«  rÙ  Ú
precompile)r¯   r«  s     rd   r«  zTritonFuture.result
  sI   € Ø�;‰;Ð"à—[‘[×'Ñ'Ó)ˆFØ�>Ð!�>ØˆDŒKØ�K‰K×"Ñ"Ô$Ø�{‰{Ðrf   N)rÙ  r   rÁ  zOptional[Future[Any]]rÃ   rÆ   )rÃ   r   )rÇ   rÈ   rÉ   rG  r°   r«  r`   rf   rd   r0  r0  ÿ  s.   … ØÓðàðð &ðð 
ó	ôrf   r0  c                  ó   — e Zd Zdd„Zdd„Zy)ÚLambdaFuturec                ó   — || _         y r_   ©Ú	result_fn)r¯   r8  s     rd   r°   zLambdaFuture.__init__  s	   € Ø"ˆ�rf   c                ó"   — | j                  «       S r_   r7  r®   s    rd   r«  zLambdaFuture.result  s   € Ø�~‰~ÓÐrf   N)r8  r  rÃ   rÆ   )rÃ   r  )rÇ   rÈ   rÉ   r°   r«  r`   rf   rd   r5  r5    s   „ ó#ô rf   r5  )rb   r   rc   r   rÃ   rÆ   )rÃ   ró   rr  r°  )r  r  rÃ   rÀ   rœ  )r  úUnion[str, bytes]r  rÀ   rÃ   rÀ   )r  rÀ   r  rÀ   r  rÀ   rÃ   r!  )rp   r  )r$  r:  r  rÀ   r%  rÀ   rÃ   rÀ   )rp   r  rp   )r$  r:  r  rÀ   r  rÀ   r%  rÀ   r  rÀ   rÃ   r�  )r.  rÀ   rÃ   rÀ   )FF)
r<  rÀ   r$  r:  r¾   ró   r)  ró   rÃ   rÆ   )rJ  r-   rÃ   r-   )rR  rj  rS  r    rÃ   rM   )rR  rj  rS  r    rÃ   z.Tuple[Callable[[T], T], Tuple[TensorMetadata]])rR  rj  rS  r    rÃ   z7Tuple[Callable[[T], T], Tuple[TensorMetadataAndValues]])rd  r   rÃ   z#Tuple[Callable[[T], T], Tuple[str]])rd  r   rÃ   r   )r«  zList[str] | Noner¬  rÀ   r­  zhashlib._HashrÃ   rÆ   )rÃ   r  )
rÍ  rä  rÎ  rå  rÏ  rÄ   rÒ  ræ  rÃ   zTuple[str, List[str]])rÎ  rC  r  rî  r  rE   rÃ   rÆ   )r  rE   r  rî  rÒ  ræ  rÃ   rÆ   )r&  r  rÃ   r  )rÊ  rÀ   rÃ   rÆ   )r~   rÀ   rÃ   r�  )rë  zUnion[str, List[str]]rÔ  rÀ   rË  r”  rÃ   rÆ   )rì   rÀ   rb   r   rÃ   zUnion[list[c_void_p], c_void_p])
rÊ  rÀ   rÍ  r3   rÓ  rÀ   rË  rÀ   rÃ   rÆ   )r^  rÀ   r`  zList[partial[Any]]rÃ   rÆ   )rN  rÀ   )rÃ   r¹  rç  r_   )
rÓ  r”  rÔ  rÀ   rÕ  rÀ   rÖ  r   rÃ   rÀ   )ìÚ
__future__r   r  r•  rQ  rË   r�   r¤  ro  rŸ   Úloggingr}   r>  r¡  rX  rÃ  r¬  rU  rÅ  ry   rµ  r†  rû  r9  r]  Úbisectr   r   r4  r   r   r   Údatetimer	   r
   Úpathlibr   r   r   Útypesr   Útypingr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Útyping_extensionsr   ru   Útorch.distributedr  r#  r   r    Útorch._dynamo.utilsr!   r"   r#   Útorch._inductorr$   r%   r&   Útorch._inductor.codegen.cudar'   Ú,torch._inductor.codegen.rocm.compile_commandr(   r)   Útorch._utils_internalr*   rÕ  r,   r-   Úcollections.abcr.   rD  r/   r0   Útorch._inductor.cpp_builderr1   r2   r3   r4   r5   r6   r7   r8   r9   Útorch._inductor.cpu_vec_isar:   Útorch._inductor.cudagraph_utilsr;   r<   r=   Ú%torch._inductor.runtime.compile_tasksr>   r?   r@   Ú%torch._inductor.runtime.runtime_utilsrA   rB   Útorch._inductor.utilsrC   rD   rE   rF   rG   rH   rI   Útorch._loggingrJ   Útorch._subclasses.fake_tensorrK   rL   rM   Ú%torch.fx.experimental.symbolic_shapesrN   rO   rP   Úconcurrent.futuresrQ   Útorch._inductor.graphrS   Útorch._inductor.irrT   Útorch._inductor.runtime.hintsrU   rV   r~   r<  r¶  Ú_HERErµ  rÀ  r   rˆ  rF  Ú_IS_WINDOWSr¿  Ú	triton.fbrX   Útriton.fb.buildrY   Útorch._inductor.fb.utilsrZ   r[   r\   r]   r£  ÚgetArtifactLoggerrÇ   rg  rJ  Ú	getLoggerru  r‡   rŒ   rŽ   rÎ   rÛ   r  r  r  r  r&  r*  r/  r¿   r#  rA  rK  rU  rX  ra  re  rg  ÚPicklerri  r©  rÌ   rÄ  rÆ  rÈ  r?  r[  r“  rí  r  r  r)  r+  rÀ   r²  rG  rî  rÌ  rÐ  rÒ  rÜ  rW  r  rö  r�  rš  r­  r¯  rÅ  rÕ  rþ  r  rY  rX  rZ  rŸ  rª  r¯  rº  r¼  rÎ  rÞ  rà  r  r%  r-  r0  r5  r`   rf   rd   ú<module>r_     sy  ðÞ "ã Û Û Û Û Û Û 	Û Û Û 	Û Û Û 	Û Û Û Û Û 
Û Û Û Û Û Ý Ý ß 'Ñ 'Ý Ý Ý ß Ý ÷÷ ÷ ÷ ñ õ" (ã Ý  ß  ß QÑ Qß 0Ñ 0Ý 1÷õ 3å ñ ˆCƒL€ñ Ý(ç5ð÷
÷ 
õ 
õ 5÷ñ ÷
ñ ÷
 O÷÷ ñ õ ,÷ñ ÷
 OÑ Nñ Ý)å3Ý/ßIð 	�Š�Š˜Ó!€Ø�gŠg�oŠo˜bŸgšgŸošo¨eÓ4Ó5€Ø—’—’˜kÐ+@ÓA€à�lŠl˜gÑ%€à€6×ÒÔÝ%Ý2÷ô óóóóð —.’.×2Ò2°8¸]ÓK€à€à�lŠl˜gÑ%€ð €g×Ò˜Ó!€ó'óG÷G
ñ G
ôT'�ô 'ô2X�iô XóvóXô
*ð 9;ð"Øð"Ø!ð"Ø25ð"àó"ð CIð;Øð;Ø'*ð;Ø<?ð;àó;ð ØØðØðàðð ðð ð	ð
 ðð óó$!ð Øð	Øðàðð ðð ð	ð
 
óð* ×Ò÷ð ó ðóðØ0ðØ5;ðàóð2!Ø0ð!Ø5;ð!à3ó!ðBØ0ðBØ5;ðBà<óBóBó4ôO˜&Ÿ.š.ô OðdVØðVØ%(ðVØ2?ðVà	óVð  €×Ò�TÓòTó ðTóD%ð ×Ò÷ð ó ðô˜ô ÷:5ñ :5ðzØðà&ðð ðð #ð	ð
 óð&WØðWà#ðWð ðWð 
ó	Wðt;Øð;à#ð;ð #ð;ð 
ó	;ó(!÷8Lñ Lð^  €�	Ó ð ×Ò÷F-ð F-ó ðF-óR8ð €×Ò�TÓòó ðð ÷ ð  ó ð ÷8bñ bðZ Ø
×Òò.ó ó ð.ó(ð;Ø%ð;Ø47ð;Ø>Gð;à	ó;ð/6Ø%ð/6Ø47ð/6Ø>Gð/6à	ó/6ðd  €ˆ.Ó óHðD ÷u3ð u3ó ðu3ðp$Øð$àð$ð ð$ð ð	$ð
 
ó$ð0 ôb; ó b;ó ðb;ðJ ô;Ð4ó ;ó ð;ð| ô[Ð0ó [ó ð[ó|
#óL ð ÷K(ð K(ó ðK(÷\Tñ Tó	óó ó.ó'ð\ '+ð	"Øð"àð"ð ð"ð $ð	"ð
 	ó"÷JHñ HðV ÷QGð QGó ðQGðh ÷ZGð ZGó ðZG÷z"ñ "ô
�?ô ô* �?õ  rf   