Ë
    ÃÓ^j&Ì  ã                  óØ  — 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mZmZmZ d dlmZmZmZ d dlmZmZmZmZ d dlm Z m!Z!m"Z" d dl#Z#d dl$Z#d dl%m&Z& d dl'm(Z( d d	l)m*Z* d d
l+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5m6Z6m7Z7m8Z8m9Z9 d dl:m;Z; d dl<m=Z=  e>e
j~                  j�                  dd«      «      ZAe"rd dlBmCZC d dlDmEZEmFZFmGZG ddlHmIZI ddlJmKZK ddlLmMZM dZN e;eOd«      ZP G d„ deQ«      ZR G d„ d«      ZS G d„ d«      ZTe*jª                  e*j¬                  z  ZWej°                   G d„ d «      «       ZYej°                   G d!„ d"«      «       ZZ G d#„ d$eZ«      Z[ G d%„ d&«      Z\ G d'„ d(«      Z] G d)„ d*eZ«      Z^ G d+„ d,e\e^«      Z_ G d-„ d.e]e^«      Z` G d/„ d0eZ«      Za G d1„ d2e\ea«      Zb G d3„ d4e]ea«      Zc G d5„ d6eZ«      Zd G d7„ d8e\ed«      Ze G d9„ d:e]ed«      Zf G d;„ d<e\eZ«      Zg G d=„ d>e]eZ«      Zh G d?„ d@e\eZ«      ZiejÔ                  dLdA„«       Zk	 	 	 	 dMdB„Zl G dC„ dD«      ZmdNdE„ZndOdF„Zo	 	 	 	 dPdG„Zp G dH„ dI«      Zq G dJ„ dK«      Zry)Qé    )ÚannotationsN)ÚCallableÚIterableÚSequence)ÚFutureÚProcessPoolExecutorÚThreadPoolExecutor)ÚbyrefÚc_size_tÚc_void_pÚCDLL)ÚAnyÚIOÚTYPE_CHECKING)Úget_interface_for_device)Úrand_strided)Úir)ÚCppCodeCacheÚCUDACodeCacheÚ
DLLWrapperÚget_hashÚPyCodeCacheÚXPUCodeCache)ÚTimer)Údo_bench_using_profilingÚget_gpu_typeÚget_ld_library_pathÚis_gpuÚpython_subprocess_env)ÚgetArtifactLogger)Ú
OrderedSetÚ.TORCHINDUCTOR_AUTOTUNE_POOL_INACTIVITY_TIMEOUTÚ600)Ú
ModuleType)ÚChoiceCallerÚPartialRenderÚTritonTemplateCalleré   )Úconfig)Úbenchmarker)ÚVÚCUDA_VISIBLE_DEVICESÚ
autotuningc                  ó   — e Zd Zy)Ú!NonzeroWorkspaceNotSupportedErrorN©Ú__name__Ú
__module__Ú__qualname__© ó    úk/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_inductor/autotune_process.pyr/   r/   K   ó   „ Ør5   r/   c                  ó¬   — e Zd ZdZedd„«       Ze	 d	 	 	 	 	 	 	 dd„«       Zedd„«       Zdd„Zd„ Z	dd„Z
ddd	„Zddd
„Zddd„Zdd„Zdd„Zdd„Zdd„Zy)ÚTuningProcesszF
    Class to launch and interact with a benchmarking subprocess.
    c                óÖ   ‡ ‡— t         j                  dt        j                  «       t        j                  j                  t        «      «       ˆ ˆfd„}	  |«        y# t        $ r Y yw xY w)z4
        Entry point for the child process.
        z3Started autotune subprocess %s. Visible devices: %sc                 óì   •— 	 t         j                  ‰«      \  } }| €y 	 |rt        j                  j	                  |«        | «       }t         j                  |‰«       Œ[# t
        $ r}|}Y d }~Œ'd }~ww xY w©N)r9   ÚrecvÚosÚenvironÚupdateÚ	ExceptionÚsend)ÚjobÚ	extra_envÚresultÚeÚ	read_pipeÚ
write_pipes       €€r6   Úworkloopz,TuningProcess.process_main.<locals>.workloop_   sq   ø€ ØÜ!.×!3Ñ!3°IÓ!>‘��YØ�;àðÙ ÜŸ
™
×)Ñ)¨)Ô4Ù ›U�Fô ×"Ñ" 6¨:Ô6ð øô !ò Ø•Fûðús   Ÿ(A Á	A3Á'A.Á.A3N)Úautotuning_logÚdebugr>   Úgetpidr?   Úgetr,   ÚEOFError)rG   rH   rI   s   `` r6   Úprocess_mainzTuningProcess.process_mainT   sQ   ù€ ô
 	×ÑØAÜ�I‰I‹KÜ�J‰J�N‰NÔ/Ó0ô	
õ	7ð	Ù�JøÜò 	áð	ús   ÁA Á	A(Á'A(Nc                óT   — t        j                  | |f|«       |j                  «        y r<   )ÚpickleÚdumpÚflush)ÚobjrH   rD   s      r6   rB   zTuningProcess.sends   s#   € ô 	�‰�S˜)Ð$ jÔ1Ø×ÑÕr5   c                ó,   — t        j                  | «      S r<   )rQ   Úload)rG   s    r6   r=   zTuningProcess.recvz   s   € ä�{‰{˜9Ó%Ð%r5   c                ó2   — || _         | j                  «        y r<   )ÚdeviceÚstart)ÚselfrX   s     r6   Ú__init__zTuningProcess.__init__~   s   € ØˆŒØ�
‰
�r5   c                ó´  — t         j                  j                  t         j                  j                  t        «      d«      }t        j
                  «       \  }}t        j
                  «       \  }}t        j                  |d«      | _        t        j                  |d«      | _        t        j                  «       | _        | j                  j                  | j                  t        j                  «       t        j                  |dt        j                   «       › �dt#        |«      › �dt#        |«      › �g}i t%        «       ¥dt'        «       t(        j*                  rdndd	œ¥}| j,                  �t#        | j,                  «      |t.        <   t1        j2                  ||||f¬«      | _        t        j6                  |«       t        j6                  |«       d| _        y
)z4
        Start the benchmarking subprocess.
        z__autotune_main__.pyÚwbÚrbz	--parent=z
--read-fd=z--write-fd=Ú0Ú1)ÚTORCH_WARM_POOLÚLD_LIBRARY_PATHÚ3TORCHINDUCTOR_PROFILE_WITH_DO_BENCH_USING_PROFILINGN)ÚenvÚpass_fdsT)r>   ÚpathÚjoinÚdirnameÚ__file__ÚpipeÚfdopenrH   rG   Ú	selectorsÚDefaultSelectorÚselectorÚregisterÚ
EVENT_READÚsysÚ
executablerL   Ústrr   r   r)   Ú/profile_bandwidth_with_do_bench_using_profilingrX   r,   Ú
subprocessÚPopenÚprocessÚcloseÚrunning)rZ   ÚentryÚsubproc_read_fdÚwrite_fdÚread_fdÚsubproc_write_fdÚcmdrd   s           r6   rY   zTuningProcess.start‚   sw  € ô —‘—‘œRŸW™WŸ_™_¬XÓ6Ð8NÓOˆä$&§G¡G£IÑ!ˆ˜Ü$&§G¡G£IÑ!ˆÐ!ÜŸ)™) H¨dÓ3ˆŒÜŸ™ 7¨DÓ1ˆŒä!×1Ñ1Ó3ˆŒØ�‰×Ñ˜tŸ~™~¬y×/CÑ/CÔDô �N‰NØØœŸ	™	›�}Ð%Øœ˜_Ó-Ð.Ð/Øœ#Ð.Ó/Ð0Ð1ð
ˆð
Ü#Ó%ð
ð  #ä2Ó4ô ×EÒEñ DGàò
ˆð �;‰;Ð"Ü(+¨D¯K©KÓ(8ˆCÔ$Ñ%Ü!×'Ñ'ØØØ%Ð'7Ð8ô
ˆŒô
 	�‰�Ô!Ü
�‰Ð!Ô"àˆ�r5   c                óV   — | j                   xr | j                  j                  «       du S )z:
        True if the subprocess is still running.
        N)ry   rw   Úpoll©rZ   s    r6   ÚalivezTuningProcess.alive¯   s%   € ð �|‰|Ò; §¡× 1Ñ 1Ó 3°tÐ ;Ð;r5   c                óˆ   — | j                  «       s| j                  «        t        j                  || j                  |¬«       y)z8
        Push a work item to the child process.
        ©rD   N)rƒ   rY   r9   rB   rH   )rZ   ÚreqrD   s      r6   ÚputzTuningProcess.putµ   s/   € ð �z‰zŒ|Ø�J‰JŒLÜ×Ñ˜3 §¡¸9ÐÕEr5   c                óÞ  — 	 | j                   j                  |«      s"t        d| j                  j                  › �«      ‚t
        j                  | j                  «      \  }}t        |t        «      r|‚|S # t        $ r | j                  «        ‚ t        $ r | j                  «        ‚ t        $ r< t        j                  d| j                  j                  «       | j                  «        ‚ w xY w)z‹
        Get a response from the child process. Raises TimeoutError on timeout;
        raises EOFError if the subprocess crashes.
        zTimeout in autotune subprocess z.Unexpected exception in autotune subprocess %s)rn   ÚselectÚTimeoutErrorrw   Úpidr9   r=   rG   ÚkillrN   rx   rA   rJ   Ú	exceptionÚ
isinstance)rZ   ÚtimeoutrE   Ú_s       r6   rM   zTuningProcess.get½   sÉ   € ð
	Ø—=‘=×'Ñ'¨Ô0Ü"Ð%DÀTÇ\Á\×EUÑEUÐDVÐ#WÓXÐXÜ%×*Ñ*¨4¯>©>Ó:‰IˆF�Aô �fœiÔ(ØˆLØˆøô! ò 	Ø�I‰IŒKØÜò 	à�J‰JŒLØÜò 	Ü×$Ñ$Ø@À$Ç,Á,×BRÑBRôð �I‰IŒKØð	ús   ‚AA5 Á5A7C,c                óŠ   — | j                  «       r t        j                  d| j                  «       |r| j	                  «        yy)zC
        Signal the child process to shut down gracefully.
        N)rƒ   r9   rB   rH   Úwait©rZ   r’   s     r6   ÚshutdownzTuningProcess.shutdownØ   s2   € ð �:‰:Œ<Ü×Ñ˜t T§_¡_Ô5ÙØ�I‰I�Kð r5   c                óx   — | j                  «       r| j                  j                  «        | j                  «        y)z5
        Wait for the child process to exit.
        N)rƒ   rw   r’   rx   r‚   s    r6   r’   zTuningProcess.waitá   s&   € ð �:‰:Œ<Ø�L‰L×ÑÔØ�
‰
�r5   c                ó®   — | j                   j                  «        | j                  j                  «        | j                  j                  «        d| _        y)z"
        Close resources.
        FN)rn   rx   rG   rH   ry   r‚   s    r6   rx   zTuningProcess.closeé   s;   € ð 	�‰×ÑÔØ�‰×ÑÔØ�‰×ÑÔØˆ�r5   c                óÌ   — | j                  «       rDt        j                  d| j                  j                  «       | j                  j                  «        | j                  «        y)z6
        Send a SIGKILL to the child process.
        z)Sending SIGKILL to autotune subprocess %dN)rƒ   rJ   Úerrorrw   r‹   rŒ   rx   r‚   s    r6   rŒ   zTuningProcess.killò   sF   € ð �:‰:Œ<Ü× Ñ Ø;Ø—‘× Ñ ôð �L‰L×ÑÔØ�
‰
�r5   c                óH   — | j                  d¬«       | j                  «        y)z8
        Gracefully restarts the child process.
        T©r’   N)r”   rY   r‚   s    r6   ÚrestartzTuningProcess.restartþ   s   € ð 	�‰˜4ˆÔ Ø�
‰
�r5   )rG   ú	IO[bytes]rH   rœ   ÚreturnÚNoner<   )rT   r   rH   rœ   rD   údict[str, str] | Noner�   rž   )rG   rœ   r�   r   )rX   ú
int | None©r�   Úbool)r†   r   rD   rŸ   r�   rž   )g      ^@)r�   Úfloatr�   r   )T)r’   r¢   r�   rž   ©r�   rž   )r1   r2   r3   Ú__doc__ÚstaticmethodrO   rB   r=   r[   rY   rƒ   r‡   rM   r”   r’   rx   rŒ   r›   r4   r5   r6   r9   r9   O   sš   „ ñð òó ðð< àLPðØðØ'ðØ4Iðà	òó ðð ò&ó ð&óò+óZ<ôFôô6óóó
ôr5   r9   c                  óJ   — e Zd ZdZdd„Zed	d„«       Zdd„Zd
d„Z	 	 	 	 dd„Z	y)ÚTuningProcessPoolzß
    Maintains a pool of TuningProcesses to benchmark kernels in parallel
    across devices. By default, we create one TuningProcess per device and
    set the sub-process environment to make only that device visible.
    c                óV  — | j                  «       }t        j                  d|«       |D �cg c]  }t        |¬«      ‘Œ c}| _        t        j                  «       | _        | j                  D ]  }| j                  j                  |«       Œ t        t        |«      ¬«      | _        yc c}w )z,
        Start the child processes.
        z$Sub-process autotune device list: %s©rX   ©Úmax_workersN)Úget_device_listrJ   rK   r9   Ú	processesÚqueueÚQueueÚprocess_queuer‡   r	   ÚlenÚexecutor)rZ   ÚdevicesrX   Úps       r6   r[   zTuningProcessPool.__init__  s‹   € ð ×&Ñ&Ó(ˆÜ×ÑÐCÀWÔMð FMÖM¸6œ-¨vÖ6ÒMˆŒä9>¿¹»ˆÔØ—‘ò 	&ˆAØ×Ñ×"Ñ" 1Õ%ð	&ô +´s¸7³|ÔDˆ�ùò Ns   «B&c                 ól  — t         j                  sdgS t        «       } t        | «      }|j	                  «       }t
        t        j                  v rNt        j                  t
           j                  d«      D �cg c]  }t        |«      ‘Œ }}t        |«      |k  sJ ‚|S t        t        |«      «      S c c}w )zD
        Gather the list of devices to be used in the pool.
        Nú,)r)   Úautotune_multi_devicer   r   Údevice_countr,   r>   r?   ÚsplitÚintr²   ÚlistÚrange)Úgpu_typeÚdevice_interfaceÚcountÚdr´   s        r6   r­   z!TuningProcessPool.get_device_list   sš   € ô
 ×+Ò+à�6ˆMä“>ˆÜ3°HÓ=ÐØ ×-Ñ-Ó/ˆô  ¤2§:¡:Ñ-Ü')§z¡zÔ2FÑ'G×'MÑ'MÈcÓ'RÖS !”s˜1•vÐSˆGÐSÜ�w“< 5Ò(Ð(Ð(ØˆNä”E˜%“LÓ!Ð!ùò	 Ts   Á7B1c                óÀ   — | j                   j                  «        | j                  D ]  }|j                  d¬«       Œ | j                  D ]  }|j                  «        Œ y)z5
        Signal all child processes to exit.
        Frš   N)r³   r”   r®   r’   )rZ   rµ   s     r6   r”   zTuningProcessPool.shutdown5  sQ   € ð 	�‰×ÑÔ à—‘ò 	#ˆAØ�J‰J˜EˆJÕ"ð	#à—‘ò 	ˆAØ�F‰F�Hñ	r5   c                óR  — |j                   €J ‚ddg}|D �ci c])  }|t        j                  v sŒ|t        j                  |   “Œ+ }}| j                  j	                  «       }|j                  |j                   j                  |¬«       	 |j	                  t        j                  «      | j                  j                  |«       S c c}w # t        $ rB t        j                  d|› d�«       t        d«      cY | j                  j                  |«       S t        $ rl}t        j                  d|› d�«       t        |«      }d	|v sd
|v r|j                  «        t        d«      cY d}~| j                  j                  |«       S d}~ww xY w# | j                  j                  |«       w xY w)zà
        Entry point for the thread-pool helper threads: Wait for an open TuningProcess,
        remove it from the queue, execute the benchmark in that subprocess, and return
        the TuningProcess to the queue.
        NÚTORCHINDUCTOR_CACHE_DIRÚTRITON_CACHE_DIRr…   zTimed out benchmarking choice 'z['. It will be ignored. Please debug the root cause in case the choice can bring perf gains.ÚinfzFailed to benchmark choice 'ÚcudaErrorLaunchFailureÚcudaErrorIllegalAddress)Úbmreqr>   r?   r±   rM   r‡   Ú	benchmarkr)   Ú+max_autotune_subproc_result_timeout_secondsrŠ   ÚwarningsÚwarnr£   rA   rs   r›   )rZ   ÚchoiceÚenv_varsÚvrD   rw   Úprocess_exceptionÚ	error_msgs           r6   ÚtargetzTuningProcessPool.target@  s…  € ð �|‰|Ð'Ð'Ð'à-Ð/AÐBˆØ/7ÖK¨!¸1ÄÇ
Á
º?�QœŸ
™
 1™Ñ%ÐKˆ	ÐKØ×$Ñ$×(Ñ(Ó*ˆØ�‰�F—L‘L×*Ñ*°iˆÔ@ð	,Ø—;‘;Ü×BÑBóð4 ×Ñ×"Ñ" 7Õ+ùò= Løô ò 	 Ü�M‰MØ1°&°ð :Wð Wôô
 ˜“<Ñð" ×Ñ×"Ñ" 7Õ+ô! ò 	 Ü�M‰MØ.¨v¨hð 7Wð Wôô Ð-Ó.ˆIà(¨IÑ5Ø,°	Ñ9à—‘Ô!ä˜“<Ôà×Ñ×"Ñ" 7Õ+ûð!	 ûð  ×Ñ×"Ñ" 7Õ+úsG   —C¯CÂ	C Ã-FÃ5F	 ÄFÄAFÅ FÅ!F	 ÆFÆF	 Æ	F&c           	     óx   — t        t        || j                  j                  | j                  |«      «      «      }|S )z>
        Benchmark each choice in a separate process.
        )ÚdictÚzipr³   ÚmaprÓ   )rZ   ÚchoicesÚresultss      r6   rÊ   zTuningProcessPool.benchmarki  s/   € ô ”s˜7 D§M¡M×$5Ñ$5°d·k±kÀ7Ó$KÓLÓMˆàˆr5   Nr¤   )r�   zSequence[int | None])rÎ   r'   r�   r£   ©rØ   zlist[TritonTemplateCaller]r�   z!dict[TritonTemplateCaller, float])
r1   r2   r3   r¥   r[   r¦   r­   r”   rÓ   rÊ   r4   r5   r6   r¨   r¨     sC   „ ñóEð& ò"ó ð"ó(	ó',ðRà+ðð 
+ôr5   r¨   c                  óp   — e Zd ZU ded<   ded<   ded<   ded<   d	ed
<   dZded<   e	 	 	 	 dd„«       Zdd„Zy)Ú
TensorMetaztorch.devicerX   ztorch.dtypeÚdtypeztorch._prims_common.ShapeTypeÚsizesztorch._prims_common.StrideTypeÚstridesr»   ÚoffsetNz
str | NoneÚnamec           
     óÖ  — ddl m} t        |t        «      r4|D �cg c]  }| j	                  |«      ‘Œ }}t        d„ |D «       «      sJ ‚|S |}t        |t        j                  «      rt        j                  d|¬«      }|j                  «       }|€J ‚|j                  «       }|€J ‚t        ||t        j                  j                  j                  |j!                  «       «      t        j                  j                  j                   ||«      «      t        j                  j                  j#                  |j%                  «       j&                  «      |j)                  «       ¬«      S c c}w )Nr   )Ú#get_strides_with_layout_constraintsc              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­wr<   )rŽ   rÜ   ©Ú.0Úxs     r6   ú	<genexpr>z*TensorMeta.from_irnodes.<locals>.<genexpr>Œ  s   è ø€ ÒA°Q”z !¤Z×0ÑAùó   ‚Úfake)rá   Úlayout)rX   rÝ   rÞ   rß   rà   rá   )Ú torch._inductor.select_algorithmrã   rŽ   r   Úfrom_irnodesÚallr   ÚLayoutÚBufferÚ	get_dtypeÚ
get_devicerÜ   r+   ÚgraphÚsizevarsÚoptimization_hintsÚget_sizeÚoptimization_hintÚ
get_layoutrà   Úget_name)ÚclsÚirnodesrã   rç   rE   ÚnoderÝ   rX   s           r6   rí   zTensorMeta.from_irnodes„  s#  € õ 	Yä�gœxÔ(Ø>EÖ F¸ ×!1Ñ!1°!Õ!4Ð FˆFÐ FÜÑA¸&ÔAÔAÐAÐAØˆMàˆÜ�dœBŸI™IÔ&Ü—9‘9 &°Ô6ˆDà—‘Ó ˆØÐ Ð Ð Ø—‘Ó"ˆØÐ!Ð!Ð!äØØÜ—'‘'×"Ñ"×5Ñ5°d·m±m³oÓFÜ—G‘G×$Ñ$×7Ñ7Ù3°DÓ9óô —7‘7×#Ñ#×5Ñ5°d·o±oÓ6G×6NÑ6NÓOØ—‘“ô	
ð 		
ùò !Gs   ›E&c                ó†   — t        | j                  | j                  | j                  | j                  | j
                  ¬«      S )N)rX   rÝ   Ú
extra_size)r   rÞ   rß   rX   rÝ   rà   r‚   s    r6   Ú	to_tensorzTensorMeta.to_tensor£  s2   € ÜØ�J‰JØ�L‰LØ—;‘;Ø—*‘*Ø—{‘{ô
ð 	
r5   )rû   z)LayoutOrBuffer | Sequence[LayoutOrBuffer]r�   úTensorMeta | list[TensorMeta])r�   útorch.Tensor)r1   r2   r3   Ú__annotations__rá   Úclassmethodrí   rÿ   r4   r5   r6   rÜ   rÜ   {  sP   … àÓØÓØ(Ó(Ø+Ó+ØƒKØ€Dˆ*Óàð
Ø?ð
à	&ò
ó ð
ô<
r5   rÜ   c                  óx   — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 d	d„Z	 	 	 	 	 	 d
d„Zdd„Zddœ	 	 	 	 	 dd„Zddœ	 	 	 	 	 dd„Zy)ÚBenchmarkRequesta1  
    Only handle triton template benchmark for now. The extern kernel benchmark
    can be done inside the same process since they usually don't cause crash.

    Important: Instances of this class and subclasses have to be serializable
    across process boundaries. Do not put CUDA Tensors in here!
    c                ó  ‡— || _         t        |t        «      r	|g| _        n|| _        ‰rEt        ‰t        t
        f«      r/t        ‰«      dkD  rt        ˆfd„‰D «       «      sJ ‚‰d   | _        n‰| _        || _	        d| _
        y )Nr(   c              3  ód   •K  — | ]'  }d D ]   }t        ‰d   |«      t        ||«      k(  –— Œ" Œ) y­w))rX   rÝ   rÞ   rß   rà   r   N)Úgetattr)ræ   rç   ÚattrÚoutput_tensor_metas      €r6   rè   z,BenchmarkRequest.__init__.<locals>.<genexpr>É  sG   øè ø€ ò àØ Qòð ô Ð.¨qÑ1°4Ó8¼GÀAÀtÓ<LÕLðØLñùs   ƒ-0r   F)Úkernel_namerŽ   rÜ   Úinput_tensor_metaÚtupler¼   r²   rî   r
  Ú
extra_argsÚbenchmark_with_cudagraphs)rZ   r  r  r
  r  s      ` r6   r[   zBenchmarkRequest.__init__·  s’   ø€ ð 'ˆÔäÐ'¬Ô4Ø8IÐ7JˆDÕ"à7HˆDÔ"á¤*Ð-?Ä%ÌÀÔ"OÜÐ%Ó&¨Ò*äó à/ôô ð ð ð
 '9¸Ñ&;ˆDÕ#ð 3EˆDÔ#à$ˆŒØ).ˆÕ&r5   c               ó   — t         ‚r<   ©ÚNotImplementedError©rZ   ÚoutÚinput_tensorss      r6   Úmake_run_fnzBenchmarkRequest.make_run_fnÖ  s
   € ô "Ð!r5   c                 ó   — y r<   r4   r‚   s    r6   Úcleanup_run_fnzBenchmarkRequest.cleanup_run_fnÛ  s   € Ør5   N©r  c               ó   — t         ‚r<   r  ©rZ   Úfnr  r  s       r6   Údo_benchzBenchmarkRequest.do_benchÞ  s
   € ô "Ð!r5   c               ó¼  — t         j                  t        j                  «      }|rt	        j                  «       }|€e| j
                  r| j                  sJ d«       ‚t        |«      dk(  sJ ‚t        d„ | j
                  D «       «      }| j                  j                  «       }|r+t	        j                  «       z
  }t	        j                  «       }	 	  | j                  |d|iŽ}|r+t	        j                  «       z
  }t	        j                  «       }| j                  rt!        j"                  |«      }n | j$                  |g|¢|‘­Ž }|r0t	        j                  «       z
  }	t         j'                  d| |	«       || j                  «        S # t        $ r3 t         j                  d«       t        d«      cY | j                  «        S w xY w# | j                  «        w xY w)NzJInput and output tensor meta must be populated when input_tensors is emptyr   c              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr<   )rÿ   rå   s     r6   rè   z-BenchmarkRequest.benchmark.<locals>.<genexpr>õ  s   è ø€ Ò!P°A !§+¡+§-Ñ!Pùré   r  z0Skipping op due to nonzero workspace requirementrÆ   z6InChildProcess %s: load %f, create tensor %f, bench %f)rJ   ÚisEnabledForÚloggingÚDEBUGÚtimer  r
  r²   r  rÿ   r  r/   Úinfor£   r  r  r*   Úbenchmark_gpu_with_cuda_graphr  rK   )
rZ   r  r  rK   Ústart_tsÚcreate_tensor_elapser  Úload_elapseÚresÚbench_elapses
             r6   rÊ   zBenchmarkRequest.benchmarkæ  s¨  € ô
 ×+Ñ+¬G¯M©MÓ:ˆÙÜ—y‘y“{ˆHð ˆ;Ø×)Ò)¨d×.EÒ.Eð Ø\óÐEô �}Ó%¨Ò*Ð*Ð*Ü!Ñ!P¸×9OÑ9OÔ!PÓPˆMØ×)Ñ)×3Ñ3Ó5ˆCáÜ#'§9¡9£;°Ñ#9Ð Ü—y‘y“{ˆHð	"ð$Ø%�T×%Ñ% }Ð>¸#Ñ>�ñ Ü"Ÿi™i›k¨HÑ4�ÜŸ9™9›;�à×-Ò-Ü!×?Ñ?ÀÓC‘à#�d—m‘m BÐ<¨Ð<¸Ò<�áÜ#Ÿy™y›{¨XÑ5�Ü×$Ñ$ØLØØØ(Ø ôð à×ÑÕ!øô3 5ò $ä×#Ñ#Ð$VÔWÜ˜U“|Ñ#ð, ×ÑÕ!ð3$ûð2 ×ÑÕ!ús+   ÃF
 Ã"BG	 Æ
)GÆ3G	 ÇGÇG	 Ç	G)
r  rs   r  r   r
  r   r  úIterable[Any]r�   rž   ©r  r  r  r  r�   zCallable[[], None]r¤   ©r  r  r  útorch.Tensor | Noner�   r£   )	r1   r2   r3   r¥   r[   r  r  r  rÊ   r4   r5   r6   r  r  ­  s¬   „ ñð/àð/ð 9ð/ð :ð	/ð
 "ð/ð 
ó/ð>"Ø*ð"Ø1=ð"à	ó"ó
ð $(ñ	"ð %ð"ð !ð	"ð
 
ó"ð $(ñ1"à$ð1"ð !ð1"ð 
ô	1"r5   r  c                  óN   — e Zd ZdZ	 	 	 	 	 d	 	 	 	 	 	 	 	 	 dd„Zddœ	 	 	 	 	 dd„Zy)	Ú_TestBenchmarkRequestz�
    Supports unit testing. Defined in this file instead of the test file so the
    TuningProcess sub-process can unpickle these objects.
    Nc                óJ   — || _         || _        || _        || _        || _        y r<   )rE   rX   ÚsleepÚexcÚcrash)rZ   rE   rX   r2  r3  r4  s         r6   r[   z_TestBenchmarkRequest.__init__   s'   € ð ˆŒØˆŒØˆŒ
ØˆŒØˆ�
r5   r  c               ór  — | j                   �<t        j                  j                  t        d «      t        | j                   «      k(  sJ ‚| j                  rt        j                  | j                  «       | j                  r| j                  ‚| j                  rt        j                  d«       | j                  S )Nr(   )rX   r>   r?   rM   r,   rs   r2  r#  r3  r4  rq   ÚexitrE   r  s      r6   rÊ   z_TestBenchmarkRequest.benchmark.  sx   € ð �;‰;Ð"Ü—:‘:—>‘>Ô"6¸Ó=ÄÀTÇ[Á[ÓAQÒQÐQÐQØ�:Š:Ü�J‰J�t—z‘zÔ"Ø�8Š8Ø—(‘(ˆNØ�:Š:Ü�H‰H�QŒKØ�{‰{Ðr5   )ç        NNNF)
rE   r£   rX   r    r2  zfloat | Noner3  zException | Noner4  r¢   r-  )r1   r2   r3   r¥   r[   rÊ   r4   r5   r6   r0  r0    sq   „ ñð Ø!Ø"Ø $Øðàðð ðð ð	ð
 ðð óð HLñØ*ðØ1Dðà	ôr5   r0  c                  ó$   — e Zd Zddœ	 	 	 	 	 dd„Zy)ÚGPUDeviceBenchmarkMixinNr  c               ó   — t        d„ g |¢|‘D «       «      }t        |«      dk  s
J d|› �«       ‚t        d„ |D «       d«      }t        |«      }t        |«      dk(  rt        t	        |«      «      }n|j                  «       }|j                  |«      5  t        j                  ||¬«      }|j                  «        d d d «       |S # 1 sw Y   S xY w)Nc              3  óæ   K  — | ]i  }t        |t        j                  «      rMt        |j                  j
                  «      r.|j                  j                  �|j                  j                  –— Œk y ­wr<   )rŽ   ÚtorchÚTensorr   rX   ÚtypeÚindex©ræ   Útensors     r6   rè   z3GPUDeviceBenchmarkMixin.do_bench.<locals>.<genexpr>C  sR   è ø€ ò $
àÜ˜&¤%§,¡,Ô/Ü�v—}‘}×)Ñ)Ô*Ø—‘×#Ñ#Ð/ð	 �M‰M×Õñ$
ùs   ‚A/A1r(   zCan not mix devices c              3  ó†   K  — | ]9  }t        |j                  j                  «      r|j                  j                  –— Œ; y ­wr<   )r   rX   r>  r@  s     r6   rè   z3GPUDeviceBenchmarkMixin.do_bench.<locals>.<genexpr>L  s4   è ø€ ò àÜ˜&Ÿ-™-×,Ñ,Ô-ð —‘×"Õ"ñùs   ‚?AÚcudarª   )
r!   r²   Únextr   ÚiterÚcurrent_devicerX   r*   rÊ   Úsynchronize)	rZ   r  r  r  Údevice_idx_setÚdevice_typer¿   Ú
device_idxr)  s	            r6   r  z GPUDeviceBenchmarkMixin.do_bench=  så   € ô $ñ $
à/˜MÐ/¨3Ð/ô$
ó 
ˆô �>Ó" aÒ'ÐPÐ+?ÀÐ?OÐ)PÓPÐ'Üñà+ôð
 ó
ˆô 4°KÓ@ÐÜˆ~Ó !Ò#Üœd >Ó2Ó3‰Jà)×8Ñ8Ó:ˆJØ×$Ñ$ ZÓ0ñ 	+Ü×'Ñ'¨°;Ô?ˆCØ×(Ñ(Ô*÷	+ð ˆ
÷		+ð ˆ
ús   Â(CÃCr-  ©r1   r2   r3   r  r4   r5   r6   r9  r9  <  s*   „ ð
 $(ñ	ð %ðð !ð	ð
 
ôr5   r9  c                  ó$   — e Zd Zddœ	 	 	 	 	 dd„Zy)ÚCPUDeviceBenchmarkMixinNr  c               ó,   — t        j                  |«      S r<   )r*   Úbenchmark_cpur  s       r6   r  z CPUDeviceBenchmarkMixin.do_bench`  s   € ô ×(Ñ(¨Ó,Ð,r5   r-  rK  r4   r5   r6   rM  rM  _  s*   „ ð
 $(ñ	-ð %ð-ð !ð	-ð
 
ô-r5   rM  c                  óœ   ‡ — e Zd ZdZ	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Z	 	 	 	 	 	 d	d„Zd
d„Zd„ Zdd„Zˆ xZ	S )ÚTritonBenchmarkRequestzÊ
    Represents a standalone benchmark request for a Triton Template.

    Important: Instances of this class have to be serializable
    across process boundaries. Do not put CUDA Tensors in here!
    c                óÒ   •— t         ‰| �  ||||«       || _        || _        || _        || _        |	| _        |
| _        || _        || _	        || _
        || _        || _        d | _        y r<   )Úsuperr[   Úmodule_pathÚmodule_cache_keyÚ
num_stagesÚ	num_warpsÚnum_consumer_groupsÚnum_buffers_warp_specÚmatrix_instr_nonkdimÚwaves_per_euÚkpackÚworkspace_sizeÚworkspace_zero_fillÚ_benchmark_module)rZ   r  r  r
  r  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  Ú	__class__s                   €r6   r[   zTritonBenchmarkRequest.__init__q  sw   ø€ ô$ 	‰Ñ˜Ð&7Ð9KÈZÔXØ&ˆÔØ 0ˆÔØ$ˆŒØ"ˆŒØ#6ˆÔ Ø%:ˆÔ"Ø$8ˆÔ!Ø(ˆÔØˆŒ
Ø,ˆÔØ#6ˆÔ Ø-1ˆÕr5   c               óŽ  — t        j                  | j                  | j                  d¬«      }|| _        t
        j                  d| j                  | j                  «       t        || j                  «      j                  }t        | j                  «      }| j                  �sddlm} t        j                   | j                  ft        j"                  |j$                  ¬«      }| j&                  r|j)                  «        |j+                  |«      }|||<   d|j,                  _        i }	dd l}
d|
j3                  |«      j4                  v rd|	d<   |j$                  j6                  dk(  rd}nP|j$                  j6                  }t9        |«      }|j;                  | j<                  j$                  j*                  «      }t?        t        || j                  «      t        j@                  jB                  jD                  jF                  «      r!tI        jJ                  |g|¢|‘|¢­i |	¤d	|i¤ŽS tI        jJ                  |g|¢|‘|¢­i |	¤|d
dœ¤ŽS )NF©Úset_sys_modulesz"benchmark module key: %s, path: %sr   )ÚWORKSPACE_ARG_PLACEHOLDER©rÝ   rX   ÚwarmupÚcpuÚstreamT)rh  Úbenchmark_run)&r   Úload_by_key_pathrU  rT  r_  rJ   rK   r  r  Úrunr¼   r  r]  rì   rd  r<  ÚemptyÚuint8rX   r^  Úzero_r?  Ú__self__Úwith_bandwidth_infoÚinspectÚ	signatureÚ
parametersr>  r   Úget_raw_streamr
  rŽ   Ú	_inductorÚruntimeÚtriton_heuristicsÚDebugAutotunerÚ	functoolsÚpartial)rZ   r  r  ÚmodÚ
run_methodr  rd  Úworkspace_tensorÚworkspace_indexÚ
warmup_argrq  rh  rI  r¿   s                 r6   r  z"TritonBenchmarkRequest.make_run_fn‘  s=  € ô ×*Ñ*Ø×!Ñ!Ø×ÑØ!ô
ˆð
 "%ˆÔÜ×ÑØ0Ø×!Ñ!Ø×Ñô	
ô ˜S $×"2Ñ"2Ó3×7Ñ7ˆ
Ü˜$Ÿ/™/Ó*ˆ
ð
 ×ÑÐ*ÝRä$Ÿ{™{Ø×$Ñ$Ð&Ü—k‘kØ—z‘zô Ðð
 ×'Ò'Ø ×&Ñ&Ô(Ø(×.Ñ.Ð/HÓIˆOØ*:ˆJ�Ñ'à27ˆ
×ÑÔ/ð ˆ
Ûà�w×(Ñ(¨Ó4×?Ñ?Ñ?Ø#(ˆJ�xÑ à�:‰:�?‰?˜eÒ#Ø‰FàŸ*™*Ÿ/™/ˆKÜ7¸ÓDÐØ%×4Ñ4Ø×'Ñ'×.Ñ.×4Ñ4óˆFô Ü�C˜×)Ñ)Ó*Ü�O‰O×#Ñ#×5Ñ5×DÑDô
ô ×$Ñ$Øðàðð ðð ò	ð
 ñð òð ô ×$Ñ$Øðàðð ðð ò	ð
 ðð Ø"óð r5   c                óì  — | j                   }d | _         t        j                  j                  | j                  d «      }|€|}|�¹t        || j                  d «      }t        |dd «      }|� |«        t        |dd «      }|€|�	 |d «       nr|€pt        |dd«      xs dD ]$  }t        t        |dd «      dd «      }|€Œ |«        Œ& t        |dd«      xs dD ]$  }t        t        |dd «      dd «      }|€Œ |«        Œ& t        j                  D �	cg c]  }	t        |	d	d «      | j                  k7  r|	‘Œ  c}	t        j                  d d  t        j                  j                  | j                  d «       y c c}	w )
NÚrelease_benchmark_artifactsÚ _release_static_launchers_exceptÚ	launchersr4   ro  rx   Úcompile_resultsÚkernelri   )	r_  r   Úmodules_no_attrÚpoprT  r  r  ÚmodulesÚlinemaps)
rZ   r{  Ú
cached_modr…  r�  Úrelease_static_launchersÚlauncherrx   Úcompile_resultÚmodules
             r6   r  z%TritonBenchmarkRequest.cleanup_run_fnÝ  s•  € ð ×$Ñ$ˆØ!%ˆÔä ×0Ñ0×4Ñ4°T×5EÑ5EÀtÓLˆ
Øˆ;ØˆCàˆ?Ü˜S $×"2Ñ"2°DÓ9ˆFÜ*1ØÐ5°tó+Ð'ð +Ð6Ù+Ô-Ü'.ØÐ:¸Dó(Ð$ð ,Ð3Ø,Ð8á(¨Õ.Ø,Ð4Ü '¨°¸RÓ @Ò FÀBò  �HÜ#¤G¨H°jÀ$Ó$GÈÐRVÓW�EØÑ(Ù�ð ô '.¨fÐ6GÈÓ&LÒ&RÐPRò  �NÜ#Ü °¸$Ó?ÀÈ$ó�Eð Ñ(Ù�ð ô &×-Ñ-ö"
àÜ�v˜z¨4Ó0°D×4DÑ4DÒDò ò"
Œ×Ñ™AÐô
 	×Ñ× Ñ  ×!1Ñ!1°4Õ8ùò"
s   Ä#E1c                ó>  — 	 t        j                  | j                  | j                  d¬«      }|| _        t        || j                  «      }|j                  «        |j                  d   j                  | _	        | j                  «        y # | j                  «        w xY w)NFrb  r   )r   rj  rU  rT  r_  r  r  Ú
precompilerƒ  Ún_regsr  )rZ   r{  r…  s      r6   r�  z!TritonBenchmarkRequest.precompile	  s…   € ð	"Ü×.Ñ.Ø×%Ñ%Ø× Ñ Ø %ôˆCð
 &)ˆDÔ"Ü˜S $×"2Ñ"2Ó3ˆFØ×ÑÔà ×*Ñ*¨1Ñ-×4Ñ4ˆDŒKà×ÑÕ!øˆD×ÑÕ!ús   ‚A7B
 Â
Bc                óT   — d| j                   ›d| j                  ›d| j                  ›�S )Núself.kernel_name=z, self.module_path=z, self.module_cache_key=)r  rT  rU  r‚   s    r6   Ú__str__zTritonBenchmarkRequest.__str__  s2   € Ø#�$×"Ñ"Ð$Ð$8 t×'7Ñ'7Ð&9Ð9R¸D×<QÑ<QÐ;SÐTÐTr5   )r   r   r   r   r   NF) r  rs   r  r   r
  r   r  r+  rT  rs   rU  rs   rV  r»   rW  r»   rX  r»   rY  r»   rZ  r»   r[  r»   r\  r»   r]  r    r^  r¢   r�   rž   r,  r¤   ©r�   rs   )
r1   r2   r3   r¥   r[   r  r  r�  r”  Ú__classcell__©r`  s   @r6   rQ  rQ  i  sö   ø„ ñð" $%Ø%&Ø$%ØØØ%)Ø$)ð!2àð2ð 9ð2ð :ð	2ð
 "ð2ð ð2ð ð2ð ð2ð ð2ð !ð2ð  #ð2ð "ð2ð ð2ð ð2ð #ð2ð  "ð!2ð" 
õ#2ð@JØ*ðJØ1=ðJà	óJóX*9òX"÷Ur5   rQ  c                  ó   — e Zd Zy)ÚTritonGPUBenchmarkRequestNr0   r4   r5   r6   r™  r™    r7   r5   r™  c                  ó   — e Zd Zy)ÚTritonCPUBenchmarkRequestNr0   r4   r5   r6   r›  r›     r7   r5   r›  c                  ó„   ‡ — e Zd ZdZ	 	 d
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Z	 	 	 	 	 	 dd„Zddœdˆ fd„Zdd„Zd„ Zdd	„Z	ˆ xZ
S )ÚExternKernelBenchmarkRequesta*  
    A class to handle extern kernel benchmark requests. This allows extern kernels
    (like aten::mm) to be benchmarked in a subprocess, similar to Triton kernels.

    Important: Instances of this class have to be serializable across
    process boundaries. Do not put CUDA Tensors in here!
    Nc                ó\   •— t         ‰| �  ||||«       || _        |xs i | _        || _        y r<   )rS  r[   Úcallable_pathÚkwargsÚhas_out_variant)	rZ   r  r  r
  r  rŸ  r   r¡  r`  s	           €r6   r[   z%ExternKernelBenchmarkRequest.__init__-  s5   ø€ ô 	‰Ñ˜Ð&7Ð9KÈZÔXØ*ˆÔØ’l ˆŒØ.ˆÕr5   c               ó˜   — | j                  «       }| j                  rt        j                  |g|¢­d|iŽS t        j                  |g|¢­Ž S )Nr  )Úto_callabler¡  ry  rz  )rZ   r  r  r  s       r6   r  z(ExternKernelBenchmarkRequest.make_run_fn<  sN   € ð ×ÑÓˆØ×Òä×$Ñ$ RÐA¨-ÒA¸SÑAÐAô ×$Ñ$ RÐ8¨-Ò8Ð8r5   r  c               óR  •‡‡— |�|j                  «       dk(  ry| j                  st        ‰«      dk(  rt        ‰| �  ‰d|iŽS | j                  «       Š ‰‰Ž }|�tt        j                  j                  j                  j                  |t        |j                  «       «      t        |j                  «       «      «       |j                  |«       | j                  rt!        j"                  ˆˆfd„«      S t$        j&                  rt)        ˆˆfd„«      S t!        j                  ‰‰i «      S )Nr   r7  r  c                 ó   •—  ‰ ‰Ž S r<   r4   ©Úalgor  s   €€r6   ú<lambda>z8ExternKernelBenchmarkRequest.benchmark.<locals>.<lambda>W  s   ø€ ™D -Ð0€ r5   c                 ó   •—  ‰ ‰Ž S r<   r4   r¦  s   €€r6   r¨  z8ExternKernelBenchmarkRequest.benchmark.<locals>.<lambda>Z  s   ø€ ¹¸mÐ8L€ r5   )Únumelr¡  r²   rS  rÊ   r£  r<  Ú_CÚ_dynamoÚguardsÚassert_size_strider  ÚsizeÚstrideÚcopy_r  r*   r%  r)   rt   r   )rZ   r  r  Úout_newr§  r`  s     ` @€r6   rÊ   z&ExternKernelBenchmarkRequest.benchmarkG  só   ú€ Øˆ?˜sŸy™y›{¨aÒ/àØ×Ò¤3 }Ó#5¸Ò#:Ü‘7Ñ$ mÐ=¸Ñ=Ð=à×#Ñ#Ó%ˆDÙ˜MÐ*ˆGØˆÜ—‘× Ñ ×'Ñ'×:Ñ:ØœU 3§8¡8£:Ó.´°c·j±j³lÓ0Côð —	‘	˜'Ô"Ø×-Ò-Ü"×@Ñ@Ü0óð ô ×EÒEÜ/Ô0LÓMÐMÜ×(Ñ(¨¨}¸bÓAÐAr5   c                 ó   — y r<   r4   r‚   s    r6   r�  z'ExternKernelBenchmarkRequest.precompile]  ó   € àr5   c                ó–   — ddl m} t        || j                  «      }| j                  r t        j                  |fi | j                  ¤ŽS |S )Nr   )Úextern_kernels)rì   r¶  r  r  r   ry  rz  )rZ   r¶  r  s      r6   r£  z(ExternKernelBenchmarkRequest.to_callablea  s@   € õ 	Dä�^ T×%5Ñ%5Ó6ˆØ�;Š;Ü×$Ñ$ RÑ7¨4¯;©;Ñ7Ð7àˆ	r5   c                ó"   — d| j                   › d�S )NzExternKernelBenchmarkRequest(ú))rŸ  r‚   s    r6   r”  z$ExternKernelBenchmarkRequest.__str__m  s   € Ø.¨t×/AÑ/AÐ.BÀ!ÐDÐDr5   )NT)r  rs   r  r   r
  r   r  r+  rŸ  rs   r   zdict[str, Any] | Noner¡  r¢   r�   rž   r,  )r  r  r  r.  r¤   r•  )r1   r2   r3   r¥   r[   r  rÊ   r�  r£  r”  r–  r—  s   @r6   r�  r�  $  s�   ø„ ñð )-Ø $ð/àð/ð 9ð/ð :ð	/ð
 "ð/ð ð/ð &ð/ð ð/ð 
õ/ð	9Ø*ð	9Ø1=ð	9à	ó	9ð RV÷ Bó,ò
÷Er5   r�  c                  ó   — e Zd Zy)ÚExternKernelGPUBenchmarkRequestNr0   r4   r5   r6   rº  rº  q  ó   „ ð 	r5   rº  c                  ó   — e Zd Zy)ÚExternKernelCPUBenchmarkRequestNr0   r4   r5   r6   r½  r½  w  r»  r5   r½  c                  óh   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Z	 	 	 	 	 	 dd„Zdd„Zd	d„Zˆ xZS )
ÚSubgraphBenchmarkRequestz¨
    Benchmark request for subgraph choices.

    Pre-compiles the subgraph in the main process and stores
    the module path/cache key for loading in subprocess.
    c                óT   •— t         ‰| �  ||||«       || _        || _        || _        y r<   )rS  r[   rT  rU  Úsym_input_values)	rZ   r  r  r
  r  rT  rU  rÁ  r`  s	           €r6   r[   z!SubgraphBenchmarkRequest.__init__…  s2   ø€ ô 	‰Ñ˜Ð&7Ð9KÈZÔXØ&ˆÔØ 0ˆÔØ 0ˆÕr5   c               ó†   ‡‡‡— t        j                  | j                  | j                  d¬«      Š| j                  Šˆˆˆfd„S )NFrb  c                 ó.   •— ‰j                  g ‰¢‰ ¢«      S r<   )Úcall)r  r{  rÁ  s   €€€r6   r¨  z6SubgraphBenchmarkRequest.make_run_fn.<locals>.<lambda>ž  s   ø€ �s—x‘xÐ CÐ"2Ð C°]Ð CÓD€ r5   )r   rj  rU  rT  rÁ  )rZ   r  r  r{  rÁ  s     `@@r6   r  z$SubgraphBenchmarkRequest.make_run_fn”  s>   ú€ ô ×*Ñ*Ø×!Ñ!Ø×ÑØ!ô
ˆð
  ×0Ñ0ÐåDÐDr5   c                 ó   — y r<   r4   r‚   s    r6   r�  z#SubgraphBenchmarkRequest.precompile   r´  r5   c                ó<   — d| j                   › d| j                  › d�S )NzSubgraphBenchmarkRequest(z, r¸  )r  rT  r‚   s    r6   r”  z SubgraphBenchmarkRequest.__str__¤  s&   € Ø*¨4×+;Ñ+;Ð*<¸B¸t×?OÑ?OÐ>PÐPQÐRÐRr5   )r  rs   r  r   r
  r   r  r+  rT  rs   rU  rs   rÁ  z	list[int]r�   rž   r,  r¤   r•  )	r1   r2   r3   r¥   r[   r  r�  r”  r–  r—  s   @r6   r¿  r¿  }  s‡   ø„ ñð1àð1ð 9ð1ð :ð	1ð
 "ð1ð ð1ð ð1ð $ð1ð 
õ1ð
EØ*ð
EØ1=ð
Eà	ó
Eó÷Sr5   r¿  c                  ó   — e Zd Zy)ÚSubgraphGPUBenchmarkRequestNr0   r4   r5   r6   rÈ  rÈ  ¨  r7   r5   rÈ  c                  ó   — e Zd Zy)ÚSubgraphCPUBenchmarkRequestNr0   r4   r5   r6   rÊ  rÊ  ¬  r7   r5   rÊ  c                  óŠ   ‡ — e Zd ZdZ	 d	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zd„ Z	 	 	 	 	 	 dd„Zdd„Zd„ Zdd„Z	dd„Z
dd	„Zdd
„Zˆ xZS )ÚCUTLASSBenchmarkRequestae  
    A class to handle CUDA (CUTLASS) benchmark requests. This class is for
    managing the lifecycle of a CUDA kernel benchmark, including compiling
    the source code, managing workspace memory, and executing the kernel.

    Important: Instances of this class have to be serializable across
    process boundaries. Do not put CUDA Tensors in here!
    c                óL  •— t         ‰| �  ||||«       || _        d| _        d | _        d | _        d| _        d| _        d| _        || _	        |dk(  rt        nt        | _        t        |«      | _        | j                  j                  | j                  d«      \  | _        | _        y )Nr   FÚ ÚxpuÚso)rS  r[   Úsource_coder]  Ú	workspaceÚDLLÚ_workspace_size_updatedÚhash_keyÚsource_filerI  r   r   Úcodecache_clsr   r¿   Úwrite)rZ   r  r  r
  r  rÑ  rI  r`  s          €r6   r[   z CUTLASSBenchmarkRequest.__init__º  s    ø€ ô 	‰Ñ˜Ð&7Ð9KÈZÔXØ&ˆÔØ#$ˆÔØ.2ˆŒØ&*ˆŒØ',ˆÔ$ØˆŒØ "ˆÔØ&ˆÔØ-8¸EÒ-A�\Ä}ˆÔÜ 8¸Ó EˆÔØ*.×*<Ñ*<×*BÑ*BØ×Ñ˜dó+
Ñ'ˆŒ�tÕ'r5   c                ó¨   — t         j                  d| «       | j                  j                  | j                  d«       t         j                  d| «       y)zƒ
        Precompile the CUDA source code to populate the CUDACodeCache.
        This may happen in a separate thread pool.
        úPrecompiling %srÐ  úDone precompiling %sN)rJ   rK   r×  ÚcompilerÑ  r‚   s    r6   r�  z"CUTLASSBenchmarkRequest.precompileÒ  sB   € ô
 	×ÑÐ.°Ô5Ø×Ñ×"Ñ" 4×#3Ñ#3°TÔ:Ü×ÑÐ3°TÕ:r5   c          	     óÞ  ‡— | j                  «        | j                  «        t        |«      |gz   D �cg c]  }t        |j	                  «       «      ‘Œ }}t
        j                  d| j                  | j                  | j                  | j                  || j                  «       t        | j                  j                  | j                  j                  «       «      «      }t        | j                  | j                  «      }t        d«      }| j                   dkD  rht#        j$                  | j                   dz   dz  t"        j&                  |j(                  ¬«      | _        t        | j*                  j	                  «       «      }t-        j.                  |g|¢| j                  ¢d‘|‘|‘­Ž }	  |«        |S c c}w # t0        $ r,}	t3        |	«      Šˆfd„}
| j5                  «        |
cY d}	~	S d}	~	ww xY w)zg
        Create a function to run the CUDA/XPU kernel with the given input and output tensors.
        zqmake_run_fn: self.kernel_name=%s, self.source_file=%s, self.hash_key=%s, self.DLL=%s, args=%s, self.extra_args=%sr   é   é   re  Nc                 ó   •— t        ‰ «      ‚r<   )ÚRuntimeError)Úerr_msgs   €r6   Úraise_runtime_errorz@CUTLASSBenchmarkRequest.make_run_fn.<locals>.raise_runtime_error  s   ø€ Ü" 7Ó+Ð+r5   )Úensure_dll_loadedÚupdate_workspace_sizer¼   r   Údata_ptrrJ   rK   r  rÖ  rÕ  rÓ  r  r¿   rt  rF  r  r]  r<  ÚzerosÚfloat64rX   rÒ  ry  rz  rá  rs   r  )rZ   r  r  rA  ÚargsÚ
stream_ptrr|  Úworkspace_ptrÚretrF   rã  râ  s              @r6   r  z#CUTLASSBenchmarkRequest.make_run_fnÛ  sÃ  ø€ ð 	×ÑÔ Ø×"Ñ"Ô$Ü:>¸}Ó:MÐQTÐPUÑ:UÖV°”˜Ÿ™Ó*Õ+ÐVˆÐVÜ×ÑØØ×ÑØ×ÑØ�M‰MØ�H‰HØØ�O‰Oô	
ô Ø×!Ñ!×0Ñ0°×1FÑ1F×1UÑ1UÓ1WÓXó
ˆ
ô ˜TŸX™X t×'7Ñ'7Ó8ˆ
Ü  ›ˆØ×Ñ Ò"Ü"Ÿ[™[Ø×$Ñ$ qÑ(¨QÑ.Ü—m‘mØ—z‘zôˆDŒNô
 % T§^¡^×%<Ñ%<Ó%>Ó?ˆMô ×ÑØð
àð
ð �_‰_ð
ð ð	
ð
 ð
ð ò
ˆð		'ÙŒEð ˆ
ùò[ WøôH ò 	'Ü˜!“fˆGô,ð ×ÑÔ!Ø&Õ&ûð	'ús#   ³ F2Æ)F7 Æ7	G,Ç !G'Ç!G,Ç'G,c           
     ó  — | j                   ry | j                  «        t        t        j	                  d„ | j
                  D «       «      «      }t        |dz   «      D �cg c]  }t        d «      ‘Œ }}t        | j                  j                  | j                  j                  «       «      «      }t        | j                  | j                  «      }t        «       } |g |¢| j                  ¢t!        |«      ‘d ‘|‘­Ž  | j                  j#                  «        |j$                  | _        t(        j+                  d| j&                  | j                  | j,                  | j.                  | j                  || j                  «       d| _         y c c}w )Nc              3  ó4   K  — | ]  }|j                   –— Œ y ­wr<   )rá   )ræ   Úmetas     r6   rè   z@CUTLASSBenchmarkRequest.update_workspace_size.<locals>.<genexpr>  s   è ø€ ÒG¨˜$Ÿ)�)ÑGùs   ‚r(   z™update_workspace_size called: new workspace size=%d, self.kernel_name=%s, self.source_file=%s, self.hash_key=%s, self.DLL=%s, args=%s, self.extra_args=%sT)rÔ  rä  r²   rÕ   Úfromkeysr  r½   r   r¿   rt  rF  r  rÓ  r  r   r  r
   rG  Úvaluer]  rJ   rK   rÖ  rÕ  )rZ   Úunique_input_countr�   ré  rê  r|  Úc_workspace_sizes          r6   rå  z-CUTLASSBenchmarkRequest.update_workspace_size  si  € Ø×'Ò'ØØ×ÑÔ Ü Ü�M‰MÑG°×0FÑ0FÔGÓGó
Ðô ).Ð.@À1Ñ.DÓ(EÖF 1”˜•ÐFˆÐFÜØ×!Ñ!×0Ñ0°×1FÑ1F×1UÑ1UÓ1WÓXó
ˆ
ô ˜TŸX™X t×'7Ñ'7Ó8ˆ
ä#›:ÐÙð 	
Øð	
à�_‰_ð	
ô Ø óð	
ð ð	
ð ó	
ð 	×Ñ×)Ñ)Ô+Ø.×4Ñ4ˆÔÜ×Ñð hØ×ÑØ×ÑØ×ÑØ�M‰MØ�H‰HØØ�O‰Oô		
ð (,ˆÕ$ùò; Gs   ÁFc                óÂ   — | j                   €9| j                  j                  | j                  d«      \  | _         | _        | _        | j                   j                  «        y )NrÐ  )rÓ  r×  rV   rÑ  rÕ  rÖ  Úopenr‚   s    r6   rä  z)CUTLASSBenchmarkRequest.ensure_dll_loaded9  sJ   € Ø�8‰8ÐØ8<×8JÑ8J×8OÑ8OØ× Ñ  $ó9Ñ5ˆDŒH�d”m TÔ%5ð 	�‰�‰�r5   c                ól   — | j                   �!| j                   j                  «        d | _         d | _        y r<   )rÓ  rx   rÒ  r‚   s    r6   r  z&CUTLASSBenchmarkRequest.cleanup_run_fn@  s(   € Ø�8‰8ÐØ�H‰H�N‰NÔØˆDŒHØˆ�r5   c                óT   — d| j                   ›d| j                  ›d| j                  ›�S )Nr“  z, self.source_file=z, self.hash_key=)r  rÖ  rÕ  r‚   s    r6   r”  zCUTLASSBenchmarkRequest.__str__F  s0   € Ø#�$×"Ñ"Ð$Ð$8 t×'7Ñ'7Ð&9Ð9J¸D¿M¹MÐ;KÐLÐLr5   c                óX   — | j                   j                  «       }d |d<   d |d<   d|d<   |S )NrÓ  rÒ  FrÔ  )Ú__dict__Úcopy©rZ   Ústates     r6   Ú__getstate__z$CUTLASSBenchmarkRequest.__getstate__I  s7   € Ø—‘×"Ñ"Ó$ˆØˆˆe‰Ø!ˆˆkÑØ+0ˆÐ'Ñ(Øˆr5   c                ó:   — | j                   j                  |«       y r<   )rù  r@   rû  s     r6   Ú__setstate__z$CUTLASSBenchmarkRequest.__setstate__P  s   € Ø�‰×Ñ˜UÕ#r5   )rC  )r  rs   r  r   r
  r   r  r+  rÑ  rs   rI  rs   r�   rž   r,  r¤   r•  )r�   údict[str, Any])rü  r   r�   rž   )r1   r2   r3   r¥   r[   r�  r  rå  rä  r  r”  rý  rÿ  r–  r—  s   @r6   rÌ  rÌ  °  s™   ø„ ñð  "ð
àð
ð 9ð
ð :ð	
ð
 "ð
ð ð
ð ð
ð 
õ
ò0;ð6Ø*ð6Ø1=ð6à	ó6óp$,òLóóMó÷$r5   rÌ  c                  óZ   ‡ — e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zd„ Z	 	 	 	 	 	 dd„Zdd„Zˆ xZS )ÚCppBenchmarkRequestc                óf   •— t         ‰| �  ||||«       || _        t        |«      | _        d | _        y r<   )rS  r[   rÑ  r   rÕ  rÓ  )rZ   r  r  r
  r  rÑ  r`  s         €r6   r[   zCppBenchmarkRequest.__init__X  s5   ø€ ô 	‰Ñ˜Ð&7Ð9KÈZÔXØ&ˆÔÜ  Ó-ˆŒØ-1ˆ�r5   c                óž   — t         j                  d| «       t        j                  | j                  d¬«       t         j                  d| «       y )NrÚ  rg  ©rI  rÛ  )rJ   rK   r   rV   rÑ  r‚   s    r6   r�  zCppBenchmarkRequest.precompilee  s<   € ô 	×ÑÐ.°Ô5Ü×Ñ˜$×*Ñ*¸Õ>Ü×ÑÐ3°TÕ:r5   c               ó\  — t        j                  | j                  d¬«      | _        t	        |«      |gz   D �cg c]  }|j                  «       ‘Œ }}t        j                  d| j                  | j                  || j                  «       t        | j                  | j                  «      }t        d„ | j                  D «       «      sJ ‚t        j                  gt        |«      t        t	        | j                  «      «      z   z  |_        t!        j"                  |g|¢| j                  ¢­Ž S c c}w )Nrg  r  zJmake_run_fn: self.kernel_name=%s, self.DLL=%s, args=%s, self.extra_args=%sc              3  óP   K  — | ]  }t        |t        j                  «      –— Œ  y ­wr<   )rŽ   ÚctypesÚc_ulonglong)ræ   Úargs     r6   rè   z2CppBenchmarkRequest.make_run_fn.<locals>.<genexpr>{  s   è ø€ ÒR¸3”:˜c¤6×#5Ñ#5×6ÑRùs   ‚$&)r   rV   rÑ  rÓ  r¼   ræ  rJ   rK   r  r  r  rî   r  r	  r²   Úargtypesry  rz  )rZ   r  r  rA  ré  r|  s         r6   r  zCppBenchmarkRequest.make_run_fnl  s  € ô  ×$Ñ$ T×%5Ñ%5À5ÔIˆŒÜ04°]Ó0CÀsÀeÑ0KÖL f�—‘Õ!ÐLˆÐLÜ×ÑØXØ×ÑØ�H‰HØØ�O‰Oô	
ô ˜TŸX™X t×'7Ñ'7Ó8ˆ
äÑRÀ$Ç/Á/ÔRÔRÐRÐRÜ%×1Ñ1Ð2Ü�‹IœœD §¡Ó1Ó2Ñ2ñ
ˆ
Ôô
 × Ñ Øð
àð
ð �_‰_ò
ð 	
ùò! Ms   ¸D)c                ó    — d| j                   ›�S )Nr“  )r  r‚   s    r6   r”  zCppBenchmarkRequest.__str__‡  s   € Ø#�$×"Ñ"Ð$Ð%Ð%r5   )r  rs   r  r   r
  r   r  r+  rÑ  rs   r�   rž   r,  r•  )r1   r2   r3   r[   r�  r  r”  r–  r—  s   @r6   r  r  T  si   ø„ ð2àð2ð 9ð2ð :ð	2ð
 "ð2ð ð2ð 
õ2ò;ð
Ø*ð
Ø1=ð
à	ó
÷6&r5   r  c                  óP   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Z	 	 	 	 	 	 dd„Zˆ xZS )ÚCuteDSLBenchmarkRequestz;Benchmark request for CuteDSL (CUTLASS Python DSL) kernels.c                óŽ   •— t         ‰| �  ||||«       |j                  «       }t        j                  |«      \  | _        | _        y r<   )rS  r[   Úfinalize_allr   rØ  rU  rT  )rZ   r  r  r
  r  rÑ  Úfinalized_coder`  s          €r6   r[   z CuteDSLBenchmarkRequest.__init__Ž  sC   ø€ ô 	‰Ñ˜Ð&7Ð9KÈZÔXà$×1Ñ1Ó3ˆÜ2=×2CÑ2CÀNÓ2SÑ/ˆÔ˜tÕ/r5   c          	     óX  ‡‡‡	— t        j                  | j                  | j                  d¬«      }ddlm} | j                  › d|› �}t        ||«      s?t        |«      D �cg c]  }t        t        ||«      «      sŒ|‘Œ }}t        d|› d|› �«      ‚t        ||«      Š	ˆˆ	ˆfd„}|S c c}w )	zµ
        Create a function to run the CuteDSL kernel with the given input and output tensors.
        Similar to TritonBenchmarkRequest.make_run_fn but for CuteDSL kernels.
        Frb  r(   )ÚMAIN_SUFFIXr�   z-Could not find CuteDSL main kernel function 'z'. Available callables: c                 ó~   •— t        d«      } | j                  ‰j                  j                  «      } ‰g ‰¢‰‘­d|iŽS )NrC  rh  )r   rt  rX   r?  )r¿   rh  r  Úkernel_funcr  s     €€€r6   Ú
run_kernelz7CuteDSLBenchmarkRequest.make_run_fn.<locals>.run_kernelµ  s@   ø€ Ü7¸Ó?ÐØ%×4Ñ4°S·Z±Z×5EÑ5EÓFˆFÙÐB ÐB¨sÒB¸6ÑBÐBr5   )r   rj  rU  rT  Úcodegen.cutedsl.cutedsl_kernelr  r  ÚhasattrÚdirÚcallabler  rá  )
rZ   r  r  r{  r  Úmain_func_namerá   Ú	availabler  r  s
    ``      @r6   r  z#CuteDSLBenchmarkRequest.make_run_fn›  s¹   ú€ ô ×*Ñ*Ø×!Ñ!Ø×ÑØ!ô
ˆõ 	@à ×,Ñ,Ð-¨Q¨{¨mÐ<ˆä�s˜NÔ+Ü*-¨c«(ÖS $´h¼wÀsÈDÓ?QÕ6RšÐSˆIÐSÜØ?ÀÐ?OÐOgÐhqÐgrÐsóð ô ˜c >Ó2ˆö	Cð
 Ðùò Ts   Á B'Á;B')r  rs   r  r   r
  r   r  ztuple[Any, ...]rÑ  r&   r�   rž   r,  )r1   r2   r3   r¥   r[   r  r–  r—  s   @r6   r  r  ‹  si   ø„ ÙEðTàðTð 9ðTð :ð	Tð
 $ðTð #ðTð 
õTðØ*ðØ1=ðà	÷r5   r  c                 óX   — t        «       } t        j                  | j                  «       | S r<   )r¨   Úatexitro   r”   )Úpools    r6   Úget_tuning_process_poolr   ½  s   € äÓ€DÜ
‡O�O�D—M‘MÔ"Ø€Kr5   c                ó4   — t        «       j                  | «      S )zO
    Do benchmarking in a subprocess and return the perf number (latency).
    )r   rÊ   )rØ   s    r6   Úbenchmark_in_sub_processr"  Ä  s   € ô #Ó$×.Ñ.¨wÓ7Ð7r5   c                  óÌ   — e Zd ZU dZdZded<    ej                  «       Zded<   dZ	ded	<   d
„ Z
ed„ «       Zed„ «       Zdd„Zdd„Zdd„Zd„ Zdd„Zdd„Zdd„Zd„ Zed„ «       Zy)ÚAutotuneProcessPoolzr
    Singleton pool manager for running autotuning (precompilation + benchmarking)
    in a separate process.
    NzAutotuneProcessPool | NoneÚ	_instancezthreading.LockÚ_lockFr¢   Ú_shutdown_for_inactivityc                ót   — | j                  «       | _        d | _        d | _        | j	                  «       | _        y r<   )Ú
_init_poolÚ_poolÚ_warmup_futureÚ_warmup_start_timeÚ_init_timerÚ_timerr‚   s    r6   r[   zAutotuneProcessPool.__init__×  s0   € Ø15·±Ó1BˆŒ
Ø26ˆÔØ04ˆÔØ$(×$4Ñ$4Ó$6ˆ�r5   c                óÒ   — | j                   €9| j                  5  | j                   € | «       | _         ddd«       | j                   S | j                   S # 1 sw Y   | j                   S xY w)z*Get or create the singleton pool instance.N)r%  r&  ©rú   s    r6   Úget_instancez AutotuneProcessPool.get_instanceÝ  sY   € ð �=‰=Ð Ø—‘ñ *Ø—=‘=Ð(á$'£E�C”M÷*ð �}‰}Ðˆs�}‰}Ð÷	*ð �}‰}Ðús   ™AÁA&c                ó´   — t         j                  sJ d«       ‚| j                  €*| j                  «       | _        | j	                  «       | _        | j                  S )zGet the process pool.zFTo use AutotuneProcessPool, pipeline_max_autotune_gemm must be enabled)r)   Úpipeline_max_autotune_gemmr*  r)  r-  r.  r‚   s    r6   r  zAutotuneProcessPool.poolç  sQ   € ô ×0Ò0ð 	
ØTó	
Ð0ð �:‰:ÐØŸ™Ó*ˆDŒJØ×*Ñ*Ó,ˆDŒKØ�z‰zÐr5   c                óJ   — t         dkD  rt        t         | j                  «      S y )Nr   )Ú AUTOTUNE_POOL_INACTIVITY_TIMEOUTr   Ú_on_inactivity_timeoutr‚   s    r6   r-  zAutotuneProcessPool._init_timerò  s!   € Ü+¨aÒ/ÜÔ9¸4×;VÑ;VÓWÐWØr5   c                óR   — | j                   �| j                   j                  «        y y r<   )r.  Úrecord_callr‚   s    r6   Ú_record_activityz$AutotuneProcessPool._record_activity÷  s!   € Ø�;‰;Ð"Ø�K‰K×#Ñ#Õ%ð #r5   c                óü   — t         j                  dt        «       | j                  5  | j                  �#| j                  j                  d¬«       d | _        d | _        dt        _        d d d «       y # 1 sw Y   y xY w)NzAAutotuneProcessPool shutting down due to inactivity (timeout=%ds)Frš   T)	rJ   r$  r5  r&  r*  r”   r.  r$  r'  r‚   s    r6   r6  z*AutotuneProcessPool._on_inactivity_timeoutû  sq   € Ü×ÑØOÜ,ô	
ð
 �Z‰Zñ 		@Ø�z‰zÐ%Ø—
‘
×#Ñ#¨Ð#Ô/Ø!�”
ØˆDŒKð
 <@ÔÔ8÷		@÷ 		@ñ 		@ús   §AA2Á2A;c                ó²   — t        j                  d«      }t        d|¬«      }t        j                  | j
                  «       t        j                  d«       |S )a  
        Get or create the process pool.

        Uses ProcessPoolExecutor with 'spawn' context for CUDA safety.
        ProcessPoolExecutor is lazily initialized - workers are not spawned
        until the first submit() call, making this property non-blocking.
        Úspawnr(   )r¬   Ú
mp_contextz2AutotuneProcessPool created (workers spawn lazily))ÚmpÚget_contextr   r  ro   Ú	_shutdownrJ   r$  )rZ   Úctxr  s      r6   r)  zAutotuneProcessPool._init_pool  sH   € ô �n‰n˜WÓ%ˆÜ"ØØô
ˆô 	�‰˜Ÿ™Ô'Ü×ÑÐPÔQàˆr5   c                ó  — | j                   €Ò| j                  5  | j                   €¥t        j                  «       | _        | j
                  j                  t        t        j                  j                  j                  j                  ¬«      | _         | j                   j                  | j                  «       t        j!                  d«       ddd«       | j                   S | j                   S # 1 sw Y   | j                   S xY w)z×
        Submit a warmup job to eagerly spawn workers and initialize CUDA.

        This is optional - call it early to hide spawn latency.
        Returns the warmup future which can be ignored or awaited.
        N)Úfp32_precisionzWarmup job submitted)r+  r&  r#  Úperf_counterr,  r  ÚsubmitÚ_init_autotune_subprocessr<  ÚbackendsrC  ÚmatmulrC  Úadd_done_callbackÚ_on_warmup_completerJ   r$  r‚   s    r6   Úwarm_upzAutotuneProcessPool.warm_up   sÑ   € ð ×ÑÐ&Ø—‘ñ @Ø×&Ñ&Ð.Ü.2×.?Ñ.?Ó.A�DÔ+Ø*.¯)©)×*:Ñ*:Ü1Ü',§~¡~×':Ñ':×'AÑ'A×'PÑ'Pð +;ó +�DÔ'ð ×'Ñ'×9Ñ9¸$×:RÑ:RÔSÜ"×'Ñ'Ð(>Ô?÷@ð ×"Ñ"Ð"ˆt×"Ñ"Ð"÷@ð ×"Ñ"Ð"ús   ™B2C+Ã+C?c                ó$  — d}| j                   �!t        j                  «       | j                   z
  }	 |j                  «       }t        j                  d||«       | j                  «        y# t        $ r}t        j                  d|«       |‚d}~ww xY w)z/Callback invoked when the warmup job completes.NzEAutotuneProcessPool warmup completed successfully in %.4f seconds: %sz4AutotuneProcessPool warmup failed after %.4f seconds)	r,  r#  rD  rE   rJ   r$  r9  rA   r˜   )rZ   ÚfutureÚwarmup_elapsed_timerE   rF   s        r6   rJ  z'AutotuneProcessPool._on_warmup_complete4  sŽ   € à"ÐØ×"Ñ"Ð.Ü"&×"3Ñ"3Ó"5¸×8OÑ8OÑ"OÐð	Ø—]‘]“_ˆFÜ×ÑØWØ#Øôð
 ×!Ñ!Õ#øÜò 	Ü× Ñ ØFØ#ôð ˆGûð	ús   ±7A) Á)	BÁ2B
Â
Bc                óˆ   ‡ —  ‰ j                   j                  |g|¢­i |¤Ž}‰ j                  �|j                  ˆ fd„«       |S )z-Submit a job to the pool and return a Future.c                ó$   •— ‰j                  «       S r<   )r9  )r�   rZ   s    €r6   r¨  z,AutotuneProcessPool.submit.<locals>.<lambda>M  s   ø€ ¨t×/DÑ/DÓ/F€ r5   )r  rE  r.  rI  )rZ   r  ré  r   rM  s   `    r6   rE  zAutotuneProcessPool.submitI  sA   ø€ à!�—‘×!Ñ! "Ð6 tÒ6¨vÑ6ˆØ�;‰;Ð"Ø×$Ñ$Ó%FÔGØˆr5   c                ó¾   — | j                   �!| j                   j                  «        d| _         | j                  �$| j                  j                  d¬«       d| _        yy)zShutdown the pool on exit.NFrš   )r.  Úquitr*  r”   r‚   s    r6   r@  zAutotuneProcessPool._shutdownP  sN   € à�;‰;Ð"Ø�K‰K×ÑÔØˆDŒKØ�:‰:Ð!Ø�J‰J×Ñ UÐÔ+ØˆD�Jð "r5   c                óº   — | j                   �C| j                  5  | j                   �!| j                   j                  «        d| _         ddd«       yy# 1 sw Y   yxY w)z+Explicitly shutdown the singleton instance.N©r%  r&  r@  r0  s    r6   Úshutdown_instancez%AutotuneProcessPool.shutdown_instanceY  sU   € ð �=‰=Ð$Ø—‘ñ )Ø—=‘=Ð,Ø—M‘M×+Ñ+Ô-Ø$(�C”M÷)ð )ð %÷)ð )ús   ™.AÁA)r�   zTimer | Noner¤   )r�   úFuture[Any])rM  rV  r�   rž   )r1   r2   r3   r¥   r%  r  Ú	threadingÚLockr&  r'  r[   r  r1  Úpropertyr  r-  r9  r6  r)  rK  rJ  rE  r@  rU  r4   r5   r6   r$  r$  Í  sœ   … ñð
 -1€IÐ)Ó0Ø*˜IŸN™NÓ,€Eˆ>Ó,Ø%*Ð˜dÓ*ò7ð ñó ðð ñó ðóó
&ó@ò"ó(#ó(ó*òð ñ)ó ñ)r5   r$  c                 óH   — t         j                  xr t        j                   S r<   )r)   r3  r$  r'  r4   r5   r6   Úuse_pipelined_autotuningr[  c  s!   € ä×)Ñ)ò 	=Ü#×<Ñ<Ð<ðr5   c                ó²   — ddl }|j                  j                  «       r |j                  dd¬«       | |j                  j                  j
                  _        y)z9
    Warmup function run in the autotune subprocess.
    r   Nr(   rC  rª   T)r<  rC  Úis_availablerç  rG  rH  rC  )rC  r<  s     r6   rF  rF  j  sD   € ó ð ‡z�z×ÑÔ Øˆ�‰�A˜fÕ%à0>€E‡N�N×Ñ×ÑÔ-àr5   c                óŒ   — 	 | j                  «       }|S # t        $ r& t        j                  d| d¬«       t	        d«      cY S w xY w)a*  
    Run autotuning benchmarks in a subprocess.

    This function is submitted to AutotuneProcessPool and runs in isolation
    to prevent GPU contention with the main compilation process.

    Args:
        picklable_choices: List of picklable choice information

    Returns:
        timing
    zFailed to benchmark choice %sT)Úexc_inforÆ   )rÊ   rA   rJ   Úwarningr£   )Úbenchmark_requestÚtimings     r6   Úrun_autotune_in_subprocessrc  y  sQ   € ð à"×,Ñ,Ó.ˆàˆøäò Ü×ÑØ+ØØð 	ô 	
ô �U‹|Òðús   ‚ ”,AÁAc                  ó€   — e Zd ZU dZdZded<    ej                  «       Zd
dd„Z	e
dd„«       Zd„ Zddd„Ze
dd	„«       Zy)ÚPrecompileThreadPoolz²
    Thread pool for running precompilation asynchronously.

    This allows the main compilation process to continue while
    precompilation happens in background threads.
    NzPrecompileThreadPool | Noner%  c                ó&   — t        |¬«      | _        y )Nr«   )r	   Ú	_executor)rZ   r¬   s     r6   r[   zPrecompileThreadPool.__init__¤  s   € Ü+¸ÔDˆ�r5   c                óê   — ddl m} | j                  €?| j                  5  | j                  € |  |«       «      | _        d d d «       | j                  S | j                  S # 1 sw Y   | j                  S xY w)Nr   )Úget_num_workers)rì   ri  r%  r&  )rú   ri  s     r6   r1  z!PrecompileThreadPool.get_instance§  s`   € åDà�=‰=Ð Ø—‘ñ ;Ø—=‘=Ð(Ù$'©Ó(9Ó$:�C”M÷;ð �}‰}Ðˆs�}‰}Ð÷;ð �}‰}Ðús   ŸAÁA2c                óª   — t        j                  «       }t        j                  |j                  |«      } | j
                  j                  |g|¢­i |¤ŽS r<   )ÚcontextvarsÚcopy_contextry  rz  rk  rg  rE  )rZ   r  ré  r   rA  s        r6   rE  zPrecompileThreadPool.submit±  sG   € Ü×&Ñ&Ó(ˆä×Ñ˜sŸw™w¨Ó+ˆØ$ˆt�~‰~×$Ñ$ RÐ9¨$Ò9°&Ñ9Ð9r5   c                ó:   — | j                   j                  |¬«      S )Nrš   )rg  r”   r“   s     r6   r@  zPrecompileThreadPool._shutdown·  s   € Ø�~‰~×&Ñ&¨DÐ&Ó1Ð1r5   c                ó¾   — | j                   �E| j                  5  | j                   �#| j                   j                  d¬«       d | _         d d d «       y y # 1 sw Y   y xY w)NFrš   rT  r0  s    r6   rU  z&PrecompileThreadPool.shutdown_instanceº  sX   € à�=‰=Ð$Ø—‘ñ )Ø—=‘=Ð,Ø—M‘M×+Ñ+°Ð+Ô7Ø$(�C”M÷)ð )ð %÷)ð )ús   ™0AÁA)é   )r¬   r»   )r�   re  )F)r’   r¢   r¤   )r1   r2   r3   r¥   r%  r  rW  rX  r&  r[   r  r1  rE  r@  rU  r4   r5   r6   re  re  ™  sZ   … ñð .2€IÐ*Ó1ØˆI�N‰NÓ€EôEð òó ðò:ô2ð ò)ó ñ)r5   re  c                  óV   — e Zd ZdZi Zedd„«       Zedd„«       Ze	 	 	 	 	 	 dd„«       Z	y)	ÚAsyncAutotuneraÑ  
    Handles asynchronous autotuning of kernel choices in a separate process.

    This class manages the lifecycle of autotuning:
    1. Accepts precompiled choices from the main process
    2. Submits benchmarking work to AutotuneProcessPool
    3. Returns results via a Future

    Usage:
        autotuner = AsyncAutotuner(choices)
        autotuner.start()  # Kicks off async benchmarking
        timings = autotuner.get_results()  # Blocks until complete
    c                ó(   — | j                  «       |z   S r<   )rÕ  )rÎ   Ú
inputs_keys     r6   Úget_choice_hashzAsyncAutotuner.get_choice_hashÔ  s   € à�‰Ó  :Ñ-Ð-r5   c                ó  — |D ]„  }t         j                  ||«      }|t         j                  v rŒ,t        |dd«      €J d«       ‚t        j                  «       j                  t        |j                  «      }|t         j                  |<   Œ† y)zþ
        Start asynchronous autotuning in a subprocess.

        This method:
        1. Extracts picklable benchmark requests from choices
        2. Submits benchmarking work to AutotuneProcessPool
        3. Returns immediately (non-blocking)
        rÉ   Nzbmreq is None for choice)	rq  rt  Úchoice_hash_to_futurer  r$  r1  rE  rc  rÉ   )rú   rØ   rs  rÎ   Úchoice_hashÚautotune_futures         r6   rY   zAsyncAutotuner.startØ  s�   € ð ò 	PˆFÜ(×8Ñ8¸ÀÓLˆKàœn×BÑBÑBØä˜6 7¨DÓ1Ð=ð Ø*óÐ=ô 2×>Ñ>Ó@×GÑGÜ*Ø—‘óˆOð
 APŒN×0Ñ0°Ò=ñ	Pr5   c                óŒ   — i }|D ]<  }t         j                  ||«      }t         j                  |   j                  «       ||<   Œ> |S )zì
        Get autotuning results, blocking until complete.

        Args:
            timeout: Maximum time to wait in seconds. None means wait forever.

        Returns:
            Dict mapping ChoiceCaller to benchmark timing
        )rq  rt  rv  rE   )rú   rØ   rs  ÚtimingsrÎ   rw  s         r6   Úget_resultszAsyncAutotuner.get_resultsô  sP   € ð ˆØò 	YˆFÜ(×8Ñ8¸ÀÓLˆKÜ,×BÑBÀ;ÑO×VÑVÓXˆG�FŠOð	Yð ˆr5   N)rÎ   r%   rs  rs   r�   rs   )rØ   úlist[ChoiceCaller]rs  rs   )rØ   r|  rs  rs   r�   zdict[ChoiceCaller, float])
r1   r2   r3   r¥   rv  r¦   rt  r  rY   r{  r4   r5   r6   rq  rq  Ã  sc   „ ñð Ðàò.ó ð.ð òPó ðPð6 ðØ(ðØ69ðà	"òó ñr5   rq  )r�   r¨   rÚ   r¡   )rC  rs   r�   r¢   )ra  r  r�   r£   )sÚ
__future__r   r  rk  r  Údataclassesry  r!  Úmultiprocessingr>  r>   rQ   r¯   rl   ru   rq   rW  r#  rÌ   Úcollections.abcr   r   r   Úconcurrent.futuresr   r   r	   r
   r   r   r   Útypingr   r   r   r<  Útorch._inductor.async_compileÚtorch._dynamo.device_interfacer   Útorch._dynamo.testingr   Útorch._inductorr   Útorch._inductor.codecacher   r   r   r   r   r   Ú$torch._inductor.compile_worker.timerr   Útorch._inductor.utilsr   r   r   r   r   Útorch._loggingr    Útorch.utils._ordered_setr!   r»   r?   rM   r5  Útypesr$   rì   r%   r&   r'   rÎ  r)   Úruntime.benchmarkingr*   Úvirtualizedr+   r,   r1   rJ   rA   r/   r9   r¨   rï   rð   ÚLayoutOrBufferÚ	dataclassrÜ   r  r0  r9  rM  rQ  r™  r›  r�  rº  r½  r¿  rÈ  rÊ  rÌ  r  r  Úcacher   r"  r$  r[  rF  rc  re  rq  r4   r5   r6   ú<module>r’     s«  ðå "ã Û Û Û Û Û Û Û 	Û Û Û Û Û 
Û Û Û ß 8Ñ 8ß NÑ Nß 2Ó 2ß )Ñ )ã Û $Ý CÝ .Ý ÷÷ õ 7÷õ õ -Ý /ñ
 $'Ø‡J�J‡N�NÐCÀUÓKó$Ð  ñ Ý ÷ñ õ Ý -Ý ð .Ð á" 8¨\Ó:€ô	¨	ô 	÷tñ t÷noñ oðd —‘˜RŸY™YÑ&€ð ×Ñ÷.
ð .
ó ð.
ðb ×Ñ÷i"ð i"ó ði"ôXÐ,ô ÷D ñ  ÷F-ñ -ôpUÐ-ô pUôf	Ð 7Ð9Oô 	ô	Ð 7Ð9Oô 	ôJEÐ#3ô JEôZ	ØÐ9ô	ô	ØÐ9ô	ô(SÐ/ô (SôV	Ð"9Ð;Sô 	ô	Ð"9Ð;Sô 	ôa$Ð5Ð7Gô a$ôH4&Ð1Ð3Cô 4&ôn/Ð5Ð7Gô /ðd ‡�òó ðð8Ø'ð8à&ó8÷S)ñ S)ólóðØ'ðà
ó÷@')ñ ')÷TCò Cr5   