Ë
    ÄÓ^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mZmZ d dlmZ d dlmZmZ d dlmZmZmZmZmZ ddlmZmZmZ d dlZd d	lmZ d dl Z dd
l!m"Z" ddl#m$Z$m%Z% dZ&e"Z'dd„Z(dd„Z)d„ Z*d„ Z+ G d„ de jX                  jZ                  j\                  «      Z.d„ Z/d d„Z0e G d„ d«      «       Z1d„ Z2d„ Z3 G d„ d«      Z4 G d„ d«      Z5	 d!d„Z6y)"é    )ÚannotationsN)Ú	dataclassÚfield)ÚPath)Úcached_propertyÚpartial)ÚDictÚTupleÚListÚOptionalÚAnyé   )Ú_bench_cuda_graph_l2_rotateÚ_clone_l2_rotate_inputsÚ_pick_l2_rotate_count)ÚTensor)Ú__version__)Úmake_epilogue_source_markerÚserialize_worker_valueÚtorch_vendor_quackc                ór   — t        | t        t        f«      ryt        | «      }t        | t        «      rd|v ryy)aZ  Return True for failures that should invalidate one config only.

    Autotune candidates can be structurally invalid for a particular epilogue
    and shape (for example, a fragment layout that cannot represent a requested
    local-reduce group). Those should get an infinite timing while unexpected
    programming errors still propagate.
    Tz%expected reshaped size to be the sameF)Ú
isinstanceÚRuntimeErrorÚMemoryErrorÚstrÚ
ValueError)ÚeÚmsgs     úh/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_vendor/quack/autotuner.pyÚ$_is_expected_autotune_config_failurer    &   s8   € ô �!”l¤KÐ0Ô1ØÜ
ˆa‹&€CÜ�!”ZÔ Ð%LÐPSÑ%SØØó    c                 óš  — t         j                  j                  «       rt         j                  j                  «       syt         j                  j	                  «       } t
        j                  j                  d«      }|�@|j                  d«      D �cg c]  }|j                  «       ‘Œ }}| t        |«      k  r||    S yt        | «      S c c}w )aˆ  Return the physical CUDA device identifier for the current process.

    Maps the logical ``torch.cuda.current_device()`` index through
    ``CUDA_VISIBLE_DEVICES`` (if set) so the result is valid as a
    standalone ``CUDA_VISIBLE_DEVICES`` value (handles integer IDs,
    GPU UUIDs, and MIG IDs).

    Returns ``None`` if CUDA is not initialized or the device cannot
    be determined.
    NÚCUDA_VISIBLE_DEVICESú,)ÚtorchÚcudaÚis_availableÚis_initializedÚcurrent_deviceÚosÚenvironÚgetÚsplitÚstripÚlenr   )Úlogical_deviceÚparent_visibleÚdÚvisible_devicess       r   Ú_get_current_cuda_devicer4   6   s¡   € ô �J‰J×#Ñ#Ô%¬%¯*©*×*CÑ*CÔ*EØÜ—Z‘Z×.Ñ.Ó0€NÜ—Z‘Z—^‘^Ð$:Ó;€NØÐ!Ø.<×.BÑ.BÀ3Ó.GÖH¨˜1Ÿ7™7�9ÐHˆÐHØœC Ó0Ò0Ø" >Ñ2Ð2ØÜˆ~ÓÐùò	 Is   ÂCc                 ó|   — t        j                  t        j                  «       › d�t	        j
                  «       «      S )NÚ_HOME)r*   ÚgetenvÚPACKAGE_NAMEÚupperr   Úhome© r!   r   Úget_home_dirr<   M   s*   € Ü�9‰9œ×*Ñ*Ó,Ð-¨UÐ3´T·Y±Y³[ÓAÐAr!   c                 ób   — t         j                  j                  t        «       dt        › �d«      S )Nú.Úcache)r*   ÚpathÚjoinr<   r8   r;   r!   r   Údefault_cache_dirrB   Q   s"   € Ü�7‰7�<‰<œ›¨!¬L¨>Ð(:¸GÓDÐDr!   c                  ó   ‡ — e Zd Zˆ fd„Zˆ xZS )ÚFileCacheManagerc                óø  •— t         ‰| �  |«       t        j                  t        j                  «       › d�d«      j                  «       xs
 t        «       | _        | j                  rŠt        j                  j                  | j                  | j                  «      | _        t        j                  j                  | j                  d«      | _        t        j                  | j                  d¬«       y t        d«      ‚)NÚ
_CACHE_DIRÚ ÚlockT)Úexist_okz$Could not create or locate cache dir)ÚsuperÚ__init__r*   r7   r8   r9   r.   rB   Ú	cache_dirr@   rA   ÚkeyÚ	lock_pathÚmakedirsr   )ÚselfrM   Ú	__class__s     €r   rK   zFileCacheManager.__init__V   s§   ø€ Ü‰Ñ˜Ôä�I‰Iœ×+Ñ+Ó-Ð.¨jÐ9¸2Ó>×DÑDÓFÒ]ÔJ[ÓJ]ð 	Œð �>Š>ÜŸW™WŸ\™\¨$¯.©.¸$¿(¹(ÓCˆDŒNÜŸW™WŸ\™\¨$¯.©.¸&ÓAˆDŒNÜ�K‰K˜Ÿ™°Ö6äÐEÓFÐFr!   )Ú__name__Ú
__module__Ú__qualname__rK   Ú__classcell__)rQ   s   @r   rD   rD   U   s   ø„ ÷
Gð 
Gr!   rD   c                óŽ   — t        j                  t        j                  | «      «      j	                  d«      j                  d«      S )Núutf-8ú=)Úbase64Ú	b32encodeÚbytesÚfromhexÚdecodeÚrstrip©rM   s    r   Ú_base32r`   c   s2   € ä×ÑœEŸM™M¨#Ó.Ó/×6Ñ6°wÓ?×FÑFÀsÓKÐKr!   c                ó’  — t        j                  dddt         j                  ¬«      }t         j                  j	                  «        | dz  }t        j
                  «       }t        j
                  «       |z
  |k  rOt        d«      D ]  }||z  }Œ	 t         j                  j	                  «        t        j
                  «       |z
  |k  rŒNyy)zËSaturate the GPU to reach thermal steady-state before benchmarking.

    Without this, the first autotuning config gets artificially good numbers
    because the GPU hasn't been power-throttled yet.
    i   r&   )ÚdeviceÚdtypeiè  éd   N)r%   ÚrandnÚbfloat16r&   ÚsynchronizeÚtimeÚrange)Úduration_msÚaÚtargetÚt0Ú_s        r   Ú_gpu_warmupro   h   s•   € ô 	�‰�D˜$ v´U·^±^ÔD€AÜ	‡J�J×ÑÔØ˜4Ñ€FÜ	�‰‹€BÜ
�)‰)‹+˜Ñ
˜VÒ
#Ü�s“ò 	ˆAØ�A‘‰Að	ä�
‰
×ÑÔ ô �)‰)‹+˜Ñ
˜VÕ
#r!   c                  óÌ   — e Zd ZU dZ ee¬«      Zded<    ee¬«      Zded<    ee	¬«      Z
ded<    ee	¬«      Zd	ed
<    eej                  ¬«      Zded<   ddd„Zdd„Zdd„Zy)Ú_PrecompileHandlea&  Per-config completion handle returned by :meth:`Autotuner._precompile`.

    Empty / no-op when the subprocess pool was skipped (cache hit, disabled,
    only 1 config). Calling ``wait_for(i)`` on a missing index returns
    immediately as a no-op, so the bench loop can iterate uniformly.
    )Údefault_factoryzDict[int, threading.Event]ÚeventszDict[int, str]Úfailuresú	List[Any]Ú_workerszList[threading.Thread]Ú_reader_threadszthreading.LockÚ_lockNc                ód   — | j                   j                  |«      }|�|j                  |¬«       yy)a  Block until ``config_idx``'s compile completes (or failed).

        No-op for indices that were never registered (e.g. the entire handle
        is empty because precompile was skipped). The bench loop relies on
        this to call ``wait_for`` unconditionally.
        N©Útimeout)rs   r,   Úwait)rP   Ú
config_idxr{   Úevts       r   Úwait_forz_PrecompileHandle.wait_for¢   s.   € ð �k‰k�o‰o˜jÓ)ˆØˆ?Ø�H‰H˜WˆHÕ%ð r!   c                ób   — | j                   5  || j                  v cddd«       S # 1 sw Y   yxY w)a/  True if the subprocess pool failed to compile this config.

        Use after :meth:`wait_for` returns. Failed configs need an in-process
        jit_cache warm before benchmarking to avoid contaminating the timing
        measurement with compile cost (see :meth:`Autotuner._bench_with_warm`).
        N)rx   rt   )rP   r}   s     r   Ú	is_failedz_PrecompileHandle.is_failed­   s,   € ð �Z‰Zñ 	/Ø §¡Ð.÷	/÷ 	/ò 	/ús   �%¥.c                óø  — | j                   D ]9  }	 |j                  «       €&|j                  �|j                  j                  «        Œ; | j                   D ]  }	 |j                  d¬«       Œ | j                  D ]  }|j                  d¬«       Œ y# t        t
        f$ r Y Œ•w xY w# t        j                  $ r@ |j                  «        	 |j                  d¬«       n# t        j                  $ r Y nw xY wY Œ£w xY w)zªClose stdins, wait for workers and reader threads to exit.

        Idempotent. Safe to call even if ``__init__`` failed midway through
        spawning workers.
        Ng      @rz   ç      ð?)rv   ÚpollÚstdinÚcloseÚBrokenPipeErrorÚOSErrorr|   Ú
subprocessÚTimeoutExpiredÚkillrw   rA   )rP   ÚwÚts      r   Úshutdownz_PrecompileHandle.shutdown·   sï   € ð —‘ò 	ˆAðØ—6‘6“8Ð#¨¯©Ð(;Ø—G‘G—M‘M”Oøð	ð —‘ò 	ˆAðØ—‘˜s�Õ#ð	ð ×%Ñ%ò 	 ˆAØ�F‰F˜3ˆFÕñ	 øô $¤WÐ-ò Ùðûô
 ×,Ñ,ò Ø—‘”ðØ—F‘F 3�FÕ'øÜ!×0Ñ0ò Ùðüð	úsG   ‘6BÁB&ÂB#Â"B#Â&#C9Ã
CÃC9ÃC3Ã0C9Ã2C3Ã3C9Ã8C9©N)r}   Úintr{   zOptional[float]ÚreturnÚNone)r}   r�   r‘   Úbool)r‘   r’   )rR   rS   rT   Ú__doc__r   Údictrs   Ú__annotations__rt   Úlistrv   rw   Ú	threadingÚLockrx   r   r�   rŽ   r;   r!   r   rq   rq   “   si   … ññ */¸tÔ)D€FÐ&ÓDÙ$°TÔ:€HˆnÓ:Ù°Ô5€HˆiÓ5Ù.3ÀDÔ.I€OÐ+ÓIÙ!°)·.±.ÔA€Eˆ>ÓAô	&ó/ô r!   rq   c                ó
  — t        |«      D ]Í  \  }}	 t        |j                  «      }| j                  5  |€N||d D ];  }| j                  j                  |d«       | j                  |   j                  «        Œ= 	 ddd«        yt        |t        «      r |j                  d«      r|| j                  |<   | j                  |   j                  «        ddd«       ŒÏ y# t        t        t
        f$ r d}Y ŒÍw xY w# 1 sw Y   ŒöxY w)a£  Drain replies from one worker's stdout and signal per-config events.

    Replies arrive in dispatch order (length-prefixed pickled strings:
    ``"OK"`` or ``"ERR:..."``). On EOF (= worker crashed), every config
    this worker still had pending is marked failed and its event set so
    waiters don't deadlock.

    Runs in its own daemon thread so the bench loop can interleave waiting
    with kernel launches.
    Nzworker crashed during compilezERR:)Ú	enumerateÚ_recv_from_workerÚstdoutr‡   ÚEOFErrorÚConnectionResetErrorrx   rt   Ú
setdefaultrs   Úsetr   r   Ú
startswith)ÚhandleÚworkerÚconfig_indicesÚposr}   ÚrÚremaining_idxs          r   Ú_reader_thread_mainr©   Ð   s   € ô % ^Ó4ò ,‰ˆˆZð	Ü! &§-¡-Ó0ˆAð �\‰\ñ 	,Øˆyð &4°C°DÐ%9ò 7�MØ—O‘O×.Ñ.¨}Ð>]Ô^Ø—M‘M -Ñ0×4Ñ4Õ6ð7ð ÷	,ñ 	,ô ˜!œSÔ! a§l¡l°6Ô&:Ø./�—‘ 
Ñ+Ø�M‰M˜*Ñ%×)Ñ)Ô+÷	,ð 	,ñ,øô  ¤Ô+?Ð@ò 	ØŠAð	ú÷	,ð 	,ús$   “C´AC9ÂAC9ÃC6Ã5C6Ã9D	c                óê   — ddl }ddl}| j                  d«      }t        |«      dk  ry|j	                  d|«      d   }|dk(  ry| j                  |«      }t        |«      |k  ry|j                  |«      S )u   Read a length-prefixed pickled message. Returns None on EOF or partial body.

    Mirrors ``_compile_worker._recv`` so the parent and worker speak the
    same protocol. Kept private to this module rather than re-imported from
    the worker because the worker module isn't safe to import in the parent
    (it pushes ``_COMPILE_ONLY_DEPTH`` at module load).

    Returns ``None`` on both:

    * clean EOF (header shorter than 4 bytes â€” pipe write side closed before
      writing the header);
    * truncated body (header read OK, but the body read returns fewer bytes
      than the declared length â€” the worker was SIGKILL'd by its parent-death
      watchdog, or by OOM-killer, *between* writing the header and writing
      the body).

    Without the truncated-body check, ``pickle.loads`` raises ``UnpicklingError``
    on a short body. That exception would propagate out of the reader thread,
    leaving the per-config events unset and deadlocking every ``wait_for(i)``
    waiter in :meth:`Autotuner.__call__`'s ``benchmark()`` closure.
    r   Né   ú<I)ÚpickleÚstructÚreadr/   ÚunpackÚloads)Ústreamr­   r®   ÚheaderÚlengthÚbodys         r   rœ   rœ   î   sr   € ó, Ûà�[‰[˜‹^€FÜ
ˆ6ƒ{�Q‚ØØ�]‰]˜4 Ó(¨Ñ+€FØ�‚{ØØ�;‰;�vÓ€DÜ
ˆ4ƒy�6Òð Ø�<‰<˜ÓÐr!   c                  óš   — e Zd Z	 	 	 	 d	 dd„Zed„ «       Zd„ Zed„ «       Zdd„Z	d„ Z
ej                  j                  d„ «       Zd	„ Zdd
„Zy)Ú	AutotunerNc                ó0  ‡ — |st        «       g‰ _        n|‰ _        t        j                  |«      }|‰ _        i ‰ _        t        |j                  j	                  «       «      ‰ _        |xs. t        j                  t        j                  «       › d�d«      dk(  ‰ _        g ‰ _        |�t        |«      ‰ _        t        ‰ j                  «      dkD  rˆ fd„}	|	‰ _        nd‰ _        t        ‰ j                  «      dkD  rˆ fd„}
|
‰ _        nd‰ _        d‰ _        d‰ _        d‰ _        |rc|j+                  d‰ j$                  «      ‰ _        |j+                  d	‰ j&                  «      ‰ _        |j+                  d
‰ j(                  «      ‰ _        |‰ _        |‰ _        y)a¨  
        :param prune_configs_by: a dict of functions that are used to prune configs, fields:
            'perf_model': performance model used to predicate running time with different configs, returns running time
            'top_k': number of configs to bench
            'prune_num_stages_by'(optional): a function used to prune num_stages. It takes configs:List[Config] as its input, and returns pruned configs.
        Ú_CACHE_AUTOTUNINGNÚ1r   c                ór   •— ‰j                   D �ci c]  }|| |   j                  «       “Œ c}‰_        y c c}w r�   )Úrestore_valueÚcloneÚrestore_copies)ÚkwargsÚnamerP   s     €r   Ú	_pre_hookz%Autotuner.__init__.<locals>._pre_hook9  s1   ø€ ØNR×N`ÑN`Ö&aÀd t¨V°D©\×-?Ñ-?Ó-AÑ'AÒ&a�Õ#ùÒ&as   �4c                óx   •— ‰j                   D ]#  }| |   j                  ‰j                  |   «       Œ% i ‰_        y r�   )r¼   Úcopy_r¾   )r¿   Ú	exceptionrÀ   rP   s      €r   Ú
_post_hookz&Autotuner.__init__.<locals>._post_hookB  s?   ø€ Ø ×.Ñ.ò B�DØ˜4‘L×&Ñ& t×':Ñ':¸4Ñ'@ÕAðBà&(�Õ#r!   rƒ   Ú
perf_modelÚtop_kÚearly_config_prune)ÚAutotuneConfigÚconfigsÚinspectÚ	signatureÚkeysr?   r—   Ú
parametersÚ	arg_namesr*   r7   r8   r9   Úcache_resultsr¼   r/   Úpre_hookÚ	post_hookrÆ   Úconfigs_top_krÈ   r,   ÚfnÚ	_do_bench)rP   rÔ   rM   rÊ   r¼   Úprune_configs_byÚdo_benchrÐ   rÌ   rÁ   rÅ   s   `          r   rK   zAutotuner.__init__  sr  ø€ ñ  Ü*Ó,Ð-ˆD�Là"ˆDŒLÜ×%Ñ% bÓ)ˆ	ØˆŒ	Ø24ˆŒ
Ü˜i×2Ñ2×7Ñ7Ó9Ó:ˆŒàÒ_œRŸY™Y¬,×*<Ñ*<Ó*>Ð)?Ð?PÐ'QÐSWÓXÐ\_Ñ_ð 	Ôð  ˆÔØÐ$Ü!% mÓ!4ˆDÔäˆt×!Ñ!Ó" QÒ&ôbð &ˆD�Mà ˆDŒMäˆt×!Ñ!Ó" QÒ&ô)ð
 (ˆD�Nà!ˆDŒNàˆŒØ ˆÔØ"&ˆÔÙØ.×2Ñ2°<ÀÇÁÓQˆDŒOØ!1×!5Ñ!5°g¸t×?QÑ?QÓ!RˆDÔØ&6×&:Ñ&:Ø$ d×&=Ñ&=ó'ˆDÔ#ð ˆŒØ!ˆ�r!   c                ó  — t        | t        «      rÝd }| j                  dk(  r�| j                  j                  sk| j                  «       j                  «       j                  «       j                  «       j                  «       }t        j                  |«      j                  «       }dt        | j                  «      t        d„ | j                  «       D «       «      t!        | j                  «      |fS t        | t        «      rt        d„ | D «       «      S t        | t"        «      r#| D �cg c]  }t$        j'                  |«      ‘Œ c}S t        | t(        «      r)t        t+        d„ | j-                  «       D «       «      «      S | S c c}w )Nr   r   c              3  ó,   K  — | ]  }|d v r|nd–— Œ y­w)¾   r   r   é   Nr;   )Ú.0Úss     r   ú	<genexpr>z%Autotuner._key_arg.<locals>.<genexpr>b  s   è ø€ ÒF°!˜1 ™;‘a¨AÓ-ÑFùs   ‚c              3  óF   K  — | ]  }t         j                  |«      –— Œ y ­wr�   ©r·   Ú_key_arg)rÜ   Úvs     r   rÞ   z%Autotuner._key_arg.<locals>.<genexpr>g  s   è ø€ Ò>°1œ×+Ñ+¨A×.Ñ>ùs   ‚!c              3  óP   K  — | ]  \  }}|t         j                  |«      f–— Œ  y ­wr�   rà   )rÜ   Úkrâ   s      r   rÞ   z%Autotuner._key_arg.<locals>.<genexpr>k  s$   è ø€ ÒU¹t¸qÀ! ¤I×$6Ñ$6°qÓ$9Ô :ÑUùs   ‚$&)r   r   Úndimrc   Úis_floating_pointÚdetachÚcpuÚ
contiguousÚnumpyÚtobytesÚhashlibÚsha256Ú	hexdigestÚtupleÚshapeÚstrider   r—   r·   rá   r•   ÚsortedÚitems)ÚvalueÚ	value_keyÚvalue_bytesrâ   s       r   rá   zAutotuner._key_argX  s  € ä�eœVÔ$ØˆIØ�z‰z˜QŠ u§{¡{×'DÒ'DØ#Ÿl™l›n×0Ñ0Ó2×=Ñ=Ó?×EÑEÓG×OÑOÓQ�Ü#ŸN™N¨;Ó7×AÑAÓC�	àÜ�e—k‘kÓ"ÜÑF°u·|±|³~ÔFÓFÜ�E—K‘KÓ Øðð ô �eœUÔ#ÜÑ>¸Ô>Ó>Ð>Ü�eœTÔ"Ø38Ö9¨a”I×&Ñ& qÕ)Ò9Ð9Ü�eœTÔ"ÜœÑUÀuÇ{Á{Ã}ÔUÓUÓVÐVØˆùò :s   Ä$E>c           
     óh  — |j                  «       D ��ci c]  \  }}|| j                  v sŒ||“Œ }}}| j                  D �cg c]$  }||v sŒt        | j	                  ||   «      «      ‘Œ& }}|j                  «       D ]š  \  }}t        |t        «      sŒ|j                  t        |j                  «      «       |j                  t        |j                  «       D �	cg c]
  }	|	dv r|	nd‘Œ c}	«      «       |j                  t        |j                  «      «       Œœ t        |«      S c c}}w c c}w c c}	w )NrÚ   rÛ   )ró   rÏ   rÍ   r   rá   r   r   Úappendrð   rñ   rc   rï   )
rP   Úall_argsrä   râ   Ú_argsrÀ   rM   rn   ÚargrÝ   s
             r   Ú_make_cache_keyzAutotuner._make_cache_keyn  sò   € Ø$,§N¡NÓ$4×L™&˜1˜a¸¸T¿^¹^Ò8K��A‘ÐLˆÑLØ;?¿9¹9ÖV°4ÈÐPUÊŒs�4—=‘=  t¡Ó-Õ.ÐVˆÐVØ—k‘k“mò 	+‰FˆAˆsÜ˜#œvÕ&Ø—
‘
œ3˜sŸy™y›>Ô*Ø—
‘
œ3ÀÇÁÃÖN¸A Q¨&¡[¡°aÑ 7ÒNÓOÔPØ—
‘
œ3˜sŸy™y›>Õ*ð		+ô
 �S‹zÐùó MùÚVùò  Os   ”D$«D$Á	D*ÁD*ÃD/c                ó~   — | j                   €&t        t        j                  j                  dd¬«      S | j                   S )Né   é   )ÚwarmupÚrep)rÕ   r   ÚtritonÚtestingr×   ©rP   s    r   r×   zAutotuner.do_benchx  s/   € à�>‰>Ð!Üœ6Ÿ>™>×2Ñ2¸1À"ÔEÐEØ�~‰~Ðr!   c          
     ót  ‡‡— ddl m} |s
t        «       S t        t	        |«      t        t        j                  dd«      «      «      }|dk  r
t        «       S t        j                  «       }	 t        |fi |d   j                  «       ¤Ž} | j                  |i |¤Ž t        j                  «       |z
  dk  r
t        «       S t        j                  t        j                  «       › d�d«      d	k(  }|rt        d
t	        |«      › d|› d�«       ddlŠddlŠˆˆfd„}	|D �
cg c]  }
t%        |
«      ‘Œ }}
| j                  j&                  }| j                  j(                  }|j+                  d«      }|j+                  d«      }t%        t        |«      «      }|�|�t-        |j.                  |«      |d<   t        j0                  j3                  «       }t5        «       }|�||d<   t7        t        j8                  «       «      |d<   g }t;        |«      D ]—  }t=        j>                  t@        jB                  ddgt<        jD                  t<        jD                  |st<        jF                  nd|¬«      }tI        |jJ                  «      }|dk7  r|jM                  «        Œ‡|jO                  |«       Œ™ |s
t        «       S t        «       }||_(        |D �cg c]  }g ‘Œ }}tS        |«      D ]s  \  }}|t	        |«      z  }	  |	||   jT                  |||||j                  «       dœ«       ||   jO                  |«       t[        j\                  «       |j^                  |<   Œu tS        |«      D ]\  \  }}||   sŒt[        jd                  tf        d|› �||||   fd¬«      }|ji                  «        |jj                  jO                  |«       Œ^ |S # t        $ r Y �Œ/w xY wc c}
w c c}w # tV        tX        f$ rQ t[        j\                  «       |j^                  |<   |j^                  |   ja                  «        d|jb                  |<   Y �Œ[w xY w)u  Pre-compile all configs in parallel subprocesses to populate .o cache.

        cute.compile() is not thread-safe (MLIR thread-local state) and fork after
        CUDA init causes segfaults. So we spawn persistent subprocess workers: each
        has its own CUDA context, creates FakeTensors matching the parent's tensor
        metadata, and compiles with COMPILE_ONLY=True. Workers stay alive to amortize
        import overhead across multiple configs. The parent then loads instantly from
        the .o cache during benchmarking.

        Returns a :class:`_PrecompileHandle` whose ``wait_for(i)`` blocks until
        config ``i``'s compile completes; the bench loop interleaves
        ``wait_for`` + benchmark to overlap the remaining compiles with GPU
        work. Workers are equipped with a parent-death watchdog
        (:func:`quack._compile_worker._install_parent_watchdog`) so an
        orphaned worker self-terminates within ~60 s instead of lingering on
        long-lived self-hosted CI runners.

        The returned handle is also valid (empty but functional) when
        precompilation is skipped â€” cache disabled, only 1 config, the
        first-config warm-cache shortcut hit. Callers always call
        ``wait_for`` + ``shutdown``; the no-op handle makes both fast.
        r   )ÚCACHE_ENABLEDÚQUACK_COMPILE_WORKERSÚ8r   ç      à?Ú_PRINT_AUTOTUNINGNrº   zPre-compiling z configs with z workersc                ó¾   •— ‰j                  |«      }| j                  ‰j                  dt        |«      «      «       | j                  |«       | j	                  «        y )Nr¬   )ÚdumpsÚwriteÚpackr/   Úflush)r²   r   Údatar­   r®   s      €€r   Ú_sendz$Autotuner._precompile.<locals>._send°  sA   ø€ Ø—<‘< Ó$ˆDØ�L‰L˜Ÿ™ T¬3¨t«9Ó5Ô6Ø�L‰L˜ÔØ�L‰L�Nr!   Útensor_epilogue_fnÚtensor_epilogue_sourcer#   ÚQUACK_COMPILE_WORKER_PARENT_PIDz-mz#torch._vendor.quack._compile_worker)r…   r�   ÚstderrÚenvÚREADY)Ú	fn_moduleÚfn_qualnameÚargsr¿   Úconfig_kwargszworker died before dispatchzquack-precompile-reader-T)rl   rÀ   r  Údaemon)6r?   r  rq   Úminr/   r�   r*   r7   rh   r•   Ú
all_kwargsrÔ   Ú	Exceptionr8   r9   Úprintr­   r®   r   rS   rT   r,   r   rR   r+   Úcopyr4   r   Úgetpidri   r‰   ÚPopenÚsysÚ
executableÚPIPEÚDEVNULLrœ   r�   r‹   rø   rv   r›   r…   r‡   rˆ   r˜   ÚEventrs   r¡   rt   ÚThreadr©   Ústartrw   ) rP   rÊ   r  r¿   r  Úmax_workersÚt_checkÚcurrentÚverboser  rû   Úserialized_argsr  r  Úepilogue_fnÚepilogue_sourceÚworker_kwargsÚ
worker_envr)   Úworkersrn   ÚpÚreadyr£   ÚassignmentsÚiÚconfigÚwirŒ   r�   r­   r®   s                                  @@r   Ú_precompilezAutotuner._precompile~  sï  ù€ õ. 	)áÜ$Ó&Ð&äœ#˜g›,¬¬B¯I©IÐ6MÈsÓ,SÓ(TÓUˆØ˜!ÒÜ$Ó&Ð&ô —)‘)“+ˆð	Ü˜6Ñ= W¨Q¡Z×%:Ñ%:Ó%<Ñ=ˆGØˆD�G‰G�TÐ%˜WÒ%ô �9‰9‹;˜Ñ  3Ò&Ü$Ó&Ð&ä—)‘)œ|×1Ñ1Ó3Ð4Ð4EÐFÈÓMÐQTÑTˆÙÜ�N¤3 w£< .°¸{¸mÈ8ÐTÔUãÛõ	ð CGÖG¸3Ô1°#Õ6ÐGˆÐGà—G‘G×&Ñ&ˆ	Ø—g‘g×*Ñ*ˆØ—j‘jÐ!5Ó6ˆØ Ÿ*™*Ð%=Ó>ˆÜ.¬t°F«|Ó<ˆØÐ&¨;Ð+BÜ2MØ×$Ñ$ oó3ˆMÐ.Ñ/ô —Z‘Z—_‘_Ó&ˆ
Ü1Ó3ˆØÐ%Ø1?ˆJÐ-Ñ.Ü8;¼B¿I¹I»KÓ8Hˆ
Ð4Ñ5ð ˆÜ�{Ó#ò 	ˆAÜ× Ñ Ü—‘ Ð'LÐMÜ —o‘oÜ!—‘Ù18”z×)Ò)¸dØôˆAô & a§h¡hÓ/ˆEØ˜ÒØ—‘”ØØ�N‰N˜1Õð	ñ Ü$Ó&Ð&ô #Ó$ˆØ!ˆŒØ4;Ö'<¨qªÐ'<ˆÐ'<Ü" 7Ó+ò 	1‰IˆAˆvØ”S˜“\Ñ!ˆBðÙØ˜B‘K×%Ñ%à%.Ø'2Ø /Ø"/Ø)/×):Ñ):Ó)<ñô	ð" ˜‰O×"Ñ" 1Ô%Ü(Ÿ™Ó0ˆF�M‰M˜!Òð+	1ô6 ˜wÓ'ò 
	-‰EˆB�Ø˜r’?ØÜ× Ñ Ü*Ø/°¨tÐ4Ø˜a ¨R¡Ð1Øô	ˆAð �G‰GŒIØ×"Ñ"×)Ñ)¨!Õ,ð
	-ð ˆøôW ò 	Úð	üò$ Hùòb (=øô $¤WÐ-ò ô $-§?¡?Ó#4�—‘˜aÑ Ø—‘˜aÑ ×$Ñ$Ô&Ø%B�—‘ Ñ"Úðús1   Á+/N= ÄOË	OË0*OÎ=	O
Ï	O
ÏAP7Ð6P7c          	     óR  ‡ ‡‡‡‡‡‡‡— t         j                  j                  t        j	                  «       › d�d «      dk(  }|r%t        d‰ j                  j                  › d|› �«       |j                  «       |j                  j                  «       z  }|rt        ddj                  |«      › d�«      ‚t        |fi |j                  «       ¤ŽŠi ‰ j                  ¥‰¥Št        ‰ dd «      Št        ‰ d	d «      Š‰ j                   d uxs ‰ j"                  d u}‰ j$                  d u xr ‰d uxr	 ‰d uxr | }|�r	 t        j&                  t        j	                  «       › d
�d«      }|dv �r¼t)        t        j&                  t        j	                  «       › d�d«      «      }	t)        t        j&                  t        j	                  «       › d�d«      «      }
ddiŠ|j                  «       Šˆˆˆˆ ˆfd„}|dk(  �r‘t+        |
«      D ]	  } |«        Œ t,        j.                  j1                  «        t,        j.                  j3                  «       }t,        j.                  j5                  |«      5   |«        d d d «       t,        j.                  j1                  «        t+        |
«      D ]  }|j7                  «        Œ t,        j.                  j1                  «        t,        j.                  j9                  d¬«      }t,        j.                  j9                  d¬«      }|j;                  «        t+        |	«      D ]  }|j7                  «        Œ |j;                  «        t,        j.                  j1                  «        |j=                  |«      |	z  }n�ddlm } t+        |
«      D ]	  } |«        Œ t,        j.                  j1                  «        |jC                  ||	|
dd¬«      }tE        t-        jF                  t-        jH                  |«      «      jK                  «       «      }dD �cg c]  }|‘Œ c}S tE        t        j&                  t        j	                  «       › d�d«      «      }t)        t        j&                  t        j	                  «       › d�d«      «      }tM        ‰ j                  ‰‰|j                  «       ||d¬«      S ˆˆˆˆ fd"„}	 ‰ j[                  |d¬#«      S # 1 sw Y   �ŒgxY wc c}w # tN        $ rs}tQ        |tR        tT        f«      r‚ tW        |«      s‚ |r$t        dtY        |«      j                  › d |› �«       tE        d!«      tE        d!«      tE        d!«      gcY d }~S d }~ww xY w# tN        $ r:}|rt        d|› �«       tE        d!«      tE        d!«      tE        d!«      gcY d }~S d }~ww xY w)$Nr
  rº   zAutotuning kernel z with config zConflicting meta-parameters: ú, z8. Make sure that you don't re-define auto-tuned symbols.Ú_l2_cold_arg_setsÚ_l2_cold_kwarg_setsÚ_AUTOTUNE_BENCH_MODEÚ	l2_rotate)Útorch_profileÚtorch_cudagraphÚ_AUTOTUNE_TORCH_ITERSÚ100Ú_AUTOTUNE_TORCH_WARMUPÚ20r8  r   c                 óv   •— ‰d   t        ‰«      z  } ‰dxx   dz  cc<    ‰j                  ‰|    i ‰|    ¤‰¤Ž y )Nr8  r   )r/   rÔ   )ÚidxÚextra_kwargsÚl2_cold_arg_setsÚl2_cold_kwarg_setsrP   Ústates    €€€€€r   Úrotating_callz'Autotuner._bench.<locals>.rotating_callB  sQ   ø€ Ø# C™j¬3Ð/?Ó+@Ñ@˜Ø˜c›
 a™›
Ø˜Ÿ™Ø-¨cÑ2ðà0°Ñ5ðð +ór!   rC  T)Úenable_timing)ÚbenchmarkerÚall)Úbenchmark_itersÚmemory_warmup_itersÚreturn_modeÚis_vetted_benchmarking)r	  gš™™™™™É?gš™™™™™é?Ú_AUTOTUNE_WARMUP_MSÚ200Ú_AUTOTUNE_TIMED_CALLS)rJ  Úwarmup_target_msÚn_timed_callsÚ	quantileszAutotuning failed with ú: Úinfc                 ó(  •— ‰j                   �‰j                  ‰«       	  ‰j                  j                  ‰i ‰¤Ž ‰j                  �‰j	                  ‰d ¬«       y y # t        $ r+} 	 ‰j                  �‰j	                  ‰| ¬«       ‚ # ‚ xY wd } ~ ww xY w)N)rÄ   )rÑ   rÔ   Ú__call__r  rÒ   )r   r  r-  Ú
full_nargsrP   s    €€€€r   Úkernel_callz%Autotuner._bench.<locals>.kernel_callŽ  s—   ø€ Ø�}‰}Ð(Ø—‘˜jÔ)ðØ �—‘× Ñ Øðàòð �~‰~Ð)Ø—‘˜z°T�Õ:ð *øô ò ðØ—~‘~Ð1ØŸ™ z¸Q˜Ô?ð ø�Eþðús)    A Á	BÁ'BÂBÂB	Â	BÂB)r[  ).r*   r+   r,   r8   r9   r   rÔ   rR   rÍ   r¿   r   rA   r•   r  ÚnargsÚgetattrrÑ   rÒ   rÕ   r7   r�   ri   r%   r&   rg   Ú	CUDAGraphÚgraphÚreplayr(  ÚrecordÚelapsed_timeÚ$torch._inductor.runtime.benchmarkingrP  Úbenchmark_gpuÚfloatÚmedianÚtensorÚitemr   r  r   ÚKeyboardInterruptÚ
SystemExitr    Útyper×   )rP   r9  r  Úmetar.  Ú	conflictsÚ	has_hooksÚuse_l2_coldÚ
bench_modeÚ	num_itersÚwarmup_itersrN  rn   re  r*  ÚendÚmsrP  Ú
samples_msrY  rZ  r   ra  r-  rJ  r`  rK  rL  rM  s   ` `                    @@@@@@r   Ú_benchzAutotuner._bench  s  ÿ€ Ü—*‘*—.‘.¤L×$6Ñ$6Ó$8Ð#9Ð9JÐ!KÈTÓRÐVYÑYˆÙÜÐ& t§w¡w×'7Ñ'7Ð&8¸ÀfÀXÐNÔOð —I‘I“K &§-¡-×"4Ñ"4Ó"6Ñ6ˆ	ÙÜØ/°·	±	¸)Ó0DÐ/Eð FJð Jóð ô
 �tÑ3˜v×0Ñ0Ó2Ñ3ˆØ.˜Ÿ
™
Ð. gÐ.ˆ
ô # 4Ð)<¸dÓCÐÜ$ TÐ+@À$ÓGÐØ—M‘M¨Ð-ÒK°·±ÀtÐ1Kˆ	à�N‰N˜dÐ"ò Ø ¨Ð,òà"¨$Ð.òð �ð	 	ò ðTBÜŸY™YÜ#×)Ñ)Ó+Ð,Ð,@ÐAÀ;ó�
ð Ð!EÒEÜ #ÜŸ	™	¤\×%7Ñ%7Ó%9Ð$:Ð:OÐ"PÐRWÓXó!�Iô $'ÜŸ	™	¤\×%7Ñ%7Ó%9Ð$:Ð:PÐ"QÐSWÓXó$�Lð ! !˜H�EØ#)×#4Ñ#4Ó#6�L÷ð ð "Ð%6Ó6Ü!& |Ó!4ò ,˜AÙ)�Oð,äŸ
™
×.Ñ.Ô0Ü %§
¡
× 4Ñ 4Ó 6˜Ü"ŸZ™Z×-Ñ-¨eÓ4ñ ,Ù)œO÷,äŸ
™
×.Ñ.Ô0Ü!& |Ó!4ò +˜AØ!ŸL™L�Nð+äŸ
™
×.Ñ.Ô0Ü %§
¡
× 0Ñ 0¸tÐ 0Ó D˜Ü#Ÿj™j×.Ñ.¸TÐ.ÓB˜ØŸ™œÜ!& yÓ!1ò +˜AØ!ŸL™L�Nð+àŸ
™
œÜŸ
™
×.Ñ.Ô0Ø"×/Ñ/°Ó4°yÑ@™åTä!& |Ó!4ò ,˜AÙ)�Oð,äŸ
™
×.Ñ.Ô0Ø%0×%>Ñ%>Ø)Ø,5Ø0<Ø(-Ø37ð &?ó &˜
ô #¤5§<¡<´·±¸ZÓ0HÓ#I×#NÑ#NÓ#PÓQ˜Ø(7Ö8 1šBÒ8Ð8ä#(Ü—I‘I¤×!3Ñ!3Ó!5Ð 6Ð6IÐJÈEÓRó$Ð ô !$Ü—I‘I¤×!3Ñ!3Ó!5Ð 6Ð6KÐLÈeÓTó!�ô 3Ø—G‘GØ$Ø&Ø!'×!2Ñ!2Ó!4Ø%5Ø"/Ø-ôð ÷4	;ð&	>Ø—=‘= ¸�=ÓHÐH÷e,ñ ,üò8 9øô" ò Bô
 ˜aÔ"3´ZÐ!@ÔAØÜ;¸AÔ>ØÙÜÐ3´D¸³G×4DÑ4DÐ3EÀRÈÀsÐKÔLÜ˜e›¤e¨E£l´E¸%³LÐAÕAûðBûôL ò 	>ÙÜÐ/°¨sÐ3Ô4Ü˜%“L¤%¨£,´°e³Ð=Õ=ûð	>úsj   Ä8D-S$ É%SÉ-F+S$ Ð	SÐ!S$ Ð$BS$ Ò?U# ÓSÓS$ Ó$	U Ó-A(UÕU ÕU Õ#	V&Õ,/V!ÖV&Ö!V&c                óŠ  — |s |«        y | j                   }|D �cg c]  }t        |«      ‘Œ }}t        |«      t        t        |«      «      k(  sJ d«       ‚t        t        |«      g|z   }t        j                  dj                  |«      j                  d«      «      j                  «       }t        t        |«      «      }|j                  d d › d�}	|j                  |	«      }
|
rÖt        j                  j!                  t"        j%                  «       › d�d«      s¡t'        ||«      D ��ci c]  \  }}||“Œ
 }}}t)        |
d«      5 }t+        j,                  |«      d	   }|D ��ci c]  \  }}||   |“Œ }}}t/        j0                  ||j                   ¬
«      | j2                  |<   || _        d| _        d d d «       y  |«        |j9                  t+        j:                  || j4                  j=                  «       D ��cg c]  \  }}t        |«      |f‘Œ c}}dœ«      |	d¬«       y c c}w c c}}w c c}}w # 1 sw Y   y xY wc c}}w )NzConfig strings must be uniqueú-rW   é–   z.autotune.jsonÚ_FORCE_CACHE_UPDATEFr§   Úconfigs_timingsr_   r   )rM   r�  )Úbinary)rÔ   r   r/   r¡   ÚVERSIONrì   rí   rA   Úencoderî   rD   r`   rR   Úget_filer*   r+   r,   r8   r9   ÚzipÚopenÚjsonÚloadÚbuiltinsr  r?   r�  Ú
bench_timeÚputr  ró   )rP   Ú
tuning_keyrÊ   Úbench_fnrÔ   ÚcÚconfig_str_listÚ	cache_keyr?   Ú	file_namer@   rÝ   Ú
str2configÚcached_configsÚtimingsr9  Útimings                    r   Úcheck_disk_cachezAutotuner.check_disk_cache¨  s  € áÙŒJØà�W‰WˆØ+2Ö3 aœ3˜q�6Ð3ˆÐ3Ü�?Ó#¤s¬3¨Ó+?Ó'@Ò@ÐaÐBaÓaÐ@Üœc *›oÐ.°Ñ@ˆ	Ü—N‘N 3§8¡8¨IÓ#6×#=Ñ#=¸gÓ#FÓG×QÑQÓSˆ	Ü ¤¨Ó!3Ó4ˆØ—{‘{ 4 CÐ(Ð)¨Ð8ˆ	Ø�~‰~˜iÓ(ˆáœŸ
™
Ÿ™¬,×*<Ñ*<Ó*>Ð)?Ð?RÐ'SÐUZÔ[Ü+.¨ÀÓ+H×I¡4 1 a˜!˜Q™$ÐIˆJÑIÜ�d˜C“ð $ NÜŸ)™) NÓ3Ð4EÑF�ØLS×T¹.¸&À&˜: fÑ-¨vÑ5ÐT�ÑTÜ)1¯©°gÀ7Ç;Á;Ô)O�—
‘
˜:Ñ&Ø'.�Ô$Ø"#�”÷$ð áŒ
Ø�	‰	Ü�J‰Jà%àFJ×FZÑFZ×F`ÑF`ÓFb÷(Ù3B°6¸7œ˜V› gÒ.ó(ñóð Øð 	õ 	
ùò' 4ùó Jùó U÷$ð üó(s/   ›H"Ä(H'ÅH3Å"H-Å2?H3Ç9H?È-H3È3H<c           
     ó@  ‡ ‡‡‡‡— t        t        ‰ j                  ‰«      «      ‰ _        d}t	        ‰ j
                  «      dkD  r�‰ j                  i ‰ j                  ¥‰¥«      Š‰‰ j                  vr`d}‰ j                  ‰«      Št        j                  j                  ˆˆˆˆˆ fd„«       }‰ j                  r‰ j                  ‰‰|«       n |«        ‰ j                  ‰   }n‰ j
                  d   }|‰ _        t        j                   t"        j%                  «       › d�d «      dk(  rF|sDt'        t"        › d‰ j(                  j*                  › d	‰ j,                  d
›d‰ j                  › d�«        ‰ j(                  j.                  ‰i ‰¤|j1                  «       ¤Ž}d ‰ _        |S )NTr   Fc                 óØ  •—  ‰j                   ‰d‰i‰¤Ž} t        j                  «       }t        j                  t        j                  «       › d�d «      dk(  }t        j                  t        j                  «       › d�d «      dk(  }‰j                  d uxs ‰j                  d u}i }i }i }i }	 t        «        ‰j                  €.|s,	 t        ‰‰«      }	t        ‰‰|	«      \  }
}|
‰_        |‰_        nd ‰_        d ‰_        t!        ‰«      D �]c  \  }}t        j                  «       }| j#                  |«       t        j                  «       |z
  ||<   | j%                  |«      r||rt'        d|› d| j(                  |   › d�«       t        j                  «       }	 t+        ‰fi |j-                  «       ¤Ž} ‰j.                  ‰i |¤Ž t        j                  «       |z
  ||<   t        j                  «       } ‰j2                  ‰d|i‰¤Ž||<   t        j                  «       |z
  ||<   |s�Œt'        d	|› d
|j5                  |d«      d›d|j5                  |d«      d›d||   d›d||   d   d›d�«       �Œf 	 d ‰_        d ‰_        | j7                  «        t        j                  «       }|r.|j9                  «       D ]  \  }}t'        d|› d|d   d›d�«       Œ |r„|r‚t'        dt;        |«      › dt=        |j?                  «       «      d›dt=        |j?                  «       «      d›dt=        |j?                  «       «      d›dt        j                  «       |z
  d›d�«       t=        d„ |j?                  «       D «       «      }|rYt'        d|› dt;        |«      › d‰j.                  j@                  › ‰› dt        j                  «       › d �
tB        jD                  ¬!«       ||z
  ‰_#        tI        jJ                  ||j4                  ¬"«      ‰jL                  ‰<   |‰_'        y # t        t        f$ r d ‰_        d ‰_        Y �Œ6w xY w# t0        $ r Y �Œ‚w xY w# d ‰_        d ‰_        | j7                  «        w xY w)#NrÊ   r
  rº   Ú_AUTOTUNE_WALL_DEBUGz[autotune] config z subprocess compile failed (z9); falling back to in-process compile before benchmarkingr9  z[autotune-wall] config z: wait=g        z.3fzs warm=zs bench=z	s median=r   z.6frz  ú[z] -> z [autotune-wall-summary] configs=z wait_total=zs warm_total=zs bench_total=zs wall_total=rÝ   c              3  óD   K  — | ]  }|d    t        d«      k(  sŒd–— Œ y­w)r   r]  r   N)rk  )rÜ   r�   s     r   rÞ   z8Autotuner.__call__.<locals>.benchmark.<locals>.<genexpr>I  s    è ø€ Ò"W¨À!ÀAÁ$Ì%ÐPUË,ÓBV¤1Ñ"Wùs   ‚ ™ zquack autotune: ú/z configs failed for z; set z_PRINT_AUTOTUNING=1 for details)Úfiler_   )(r;  rh   r*   r7   r8   r9   rÑ   rÒ   ro   rÕ   r   r   r>  r?  r   r   r›   r   r�   r   rt   r•   r  rÔ   r  r|  r,   rŽ   ró   r/   ÚsumÚvaluesrR   r$  r  r‹  rŠ  r  r?   r�  )r£   Úbench_startr.  Ú
wall_debugrt  r•  Ú
wait_timesÚ
warm_timesÚbench_wall_timesÚ	n_buffersÚarg_setsÚ
kwarg_setsr8  r9  Ú
wait_startÚ
warm_startr-  Úbench_wall_startÚ	bench_endÚtime_Ún_failedr  rM   r¿   Úpruned_configsrP   s                        €€€€€r   Ú	benchmarkz%Autotuner.__call__.<locals>.benchmarkØ  s¦  ø€ ð .˜T×-Ñ-¨tÐV¸^ÐVÈvÑV�FÜ"&§)¡)£+�KÜ Ÿi™i¬<×+=Ñ+=Ó+?Ð*@Ð@QÐ(RÐTXÓYÐ]`Ñ`�GÜ!#§¡¬l×.@Ñ.@Ó.BÐ-CÐCWÐ+XÐZ^Ó!_ÐcfÑ!f�JØ $§¡°TÐ 9Ò W¸T¿^¹^ÐSWÐ=W�IØ �GØ!#�JØ!#�JØ')Ð$ðI*Ü#œð  Ÿ>™>Ð1¹)ð@Ü,AÀ$ÈÓ,O 	Ü7NØ$(¨&°)ó8"Ñ 4 ¨*ð :B Ô 6Ø;E Õ 8ð 6:˜DÔ2Ø7;˜DÔ4ä)2°>Ó)Bó )"™I˜A˜vô
 *.¯©«˜JØ"ŸO™O¨AÔ.Ü,0¯I©I«K¸*Ñ,D˜J q™Mð  &×/Ñ/°Ô2Ù#*Ü$)Ø*<¸Q¸Cð @;Ø;A¿?¹?È1Ñ;MÐ:Nð O>ð)?ô%&ô .2¯Y©Y«[ 
ð!)Ü.2°6Ñ.Q¸V×=NÑ=NÓ=PÑ.Q GØ$+ D§G¡G¨TÐ$=°WÒ$=ô
 15·	±	³¸jÑ0H 
¨1¡Ü/3¯y©y«{Ð,Ø.9¨d¯k©k¸4Ð.YÈÐ.YÐRXÑ.Y˜G F™OÜ26·)±)³+Ð@PÑ2PÐ,¨QÑ/Û)Ü %Ø&=¸a¸Sð A,Ø,6¯N©N¸1¸cÓ,BÀ3Ð+Gð H,Ø,6¯N©N¸1¸cÓ,BÀ3Ð+Gð H-Ø-=¸aÑ-@ÀÐ,Eð F.Ø.5°f©o¸aÑ.@ÀÐ-EÀRð	%Iö!"ñG)"ðZ 26˜Ô.Ø37˜Ô0ð Ÿ™Ô)Ü $§	¡	£�IÙØ-4¯]©]«_ò E™M˜F EÜ! A f X¨U°5¸±8¸C°.ÀÐ"CÕDðEá!¡gÜð'Ü'*¨7£| nð 5*Ü*-¨j×.?Ñ.?Ó.AÓ*BÀ3Ð)Gð H*Ü*-¨j×.?Ñ.?Ó.AÓ*BÀ3Ð)Gð H+Ü+.Ð/?×/FÑ/FÓ/HÓ+IÈ#Ð*Nð O*Ü*.¯)©)«+¸Ñ*CÀCÐ)HÈðKôô  #Ñ"W¨g¯n©nÓ.>Ô"WÓW�HÙÜØ.¨x¨j¸¼#¸g»,¸ð H*Ø*.¯'©'×*:Ñ*:Ð);¸C¸5ð A#Ü#/×#5Ñ#5Ó#7Ð"8Ð8WðYô "%§¡õ	ð '0°+Ñ&=�D”OÜ&.§l¡l°7ÀÇÁÔ&L�D—J‘J˜s‘OØ+2�DÕ(øôi %1´+Ð#>ò @ð :> Ô 6Ø;? × 8ð	@ûôF (1ò !)ò %)ð!)ûð& 26˜Ô.Ø37˜Ô0ð Ÿ™Õ)ús]   Â-Q	 Ã*P Ã0B&Q	 Æ,P9ÇA!Q	 È&AQ	 ÐP6Ð2Q	 Ð5P6Ð6Q	 Ð9	QÑQ	 ÑQÑQ	 Ñ	 Q)r   r
  rº   z autotuning for function z finished after z.2fzs; best config selected: ú;)r•   r†  rÏ   rb  r/   rÊ   rü   r?   Úprune_configsr%   ÚcompilerÚdisablerÐ   r—  Úbest_configr*   r7   r8   r9   r   rÔ   rR   r‹  r_  r  )	rP   r  r¿   Úused_cached_resultr°  r9  ÚretrM   r¯  s	   ```    @@r   r_  zAutotuner.__call__Ï  s†  ü€ Üœ#˜dŸn™n¨dÓ3Ó4ˆŒ
Ø!ÐÜˆt�|‰|Ó˜qÒ Ø×&Ñ&Ð'?¨$¯*©*Ð'?¸Ð'?Ó@ˆCØ˜$Ÿ*™*Ñ$Ø%*Ð"Ø!%×!3Ñ!3°FÓ!;�ä—‘×'Ñ'÷z3ó (ðz3ðx ×%Ò%Ø×)Ñ)¨#¨~¸yÕIá”Kà—Z‘Z ‘_‰Fà—\‘\ !‘_ˆFØ!ˆÔä�I‰Iœ×+Ñ+Ó-Ð.Ð.?Ð@À$ÓGÈ3ÒNÙ&äÜ�.Ð 9¸$¿'¹'×:JÑ:JÐ9KÐK[Ø—?‘? 3Ð'Ð'@À×AQÑAQÐ@RÐRSðUôð ˆd�g‰g×ÑØð
àð
ð ×ÑÓ!ñ
ˆð
 ˆŒ
Øˆ
r!   c           
     ó*  ‡— | j                   }| j                  r( | j                  | j                   | j                  fi |¤Ž}t        j                  t
        j                  «       › d�«      }|r	 t        dt        |«      «      }|d | }| j                  rÊ| j                  }t        |t        «      r'|dk  r"t        t        | j                   «      |z  «      }nt        |t        «      st        d«      ‚t        |«      |kD  r^|D �ci c]1  }| | j                  di | j                  ¤|¤|j!                  «       ¤Ž“Œ3 c}Št#        ‰j%                  «       ˆfd„¬«      d | }|S # t        $ r# t        t
        j                  «       › d|›�«      ‚w xY wc c}w )	NÚ_AUTOTUNE_MAX_CONFIGSr   z._AUTOTUNE_MAX_CONFIGS must be an integer, got rƒ   zPError while pruning configs, top_k must be either 1) a float <= 1.0 or 2) an intc                ó   •— ‰|    S r�   r;   )ÚxÚ
est_timings    €r   ú<lambda>z)Autotuner.prune_configs.<locals>.<lambda>�  s   ø€ ÈÐTUÉ€ r!   r_   r;   )rÊ   rÈ   rb  r*   r7   r8   r9   Úmaxr�   r   rÆ   rÓ   r   rk  r/   Ú	TypeErrorr  rò   rÍ   )rP   r¿   r¯  Úmax_configs_envÚmax_configsrÇ   r9  r¼  s          @r   r²  zAutotuner.prune_configsn  sœ  ø€ ØŸ™ˆØ×"Ò"Ø4˜T×4Ñ4°T·\±\À4Ç:Á:ÑXÐQWÑXˆNÜŸ)™)¤|×'9Ñ'9Ó';Ð&<Ð<QÐ$RÓSˆÙðÜ! !¤S¨Ó%9Ó:�ð ,¨L¨[Ð9ˆNØ�?Š?Ø×&Ñ&ˆEÜ˜%¤Ô'¨E°SªLÜœC §¡Ó-°Ñ5Ó6‘Ü ¤sÔ+äØfóð ô �>Ó" UÒ*ð #1öð ð ˜O˜DŸO™Oñ ØŸ*™*ðà ðð !×+Ñ+Ó-ññ ò�
ô "(¨
¯©Ó(9Ó?VÔ!WÐX^ÐY^Ð!_�ØÐøô5 ò Ü Ü#×)Ñ)Ó+Ð,ð -Ø*Ð-ð/óð ðüò"s   Á/E! Ä6FÅ!,F)NNNF)rÖ   zOptional[Dict])r‘   rq   )r¿   r	   r‘   ru   )rR   rS   rT   rK   Ústaticmethodrá   rü   r   r×   r;  r|  r%   r³  r´  r—  r_  r²  r;   r!   r   r·   r·     s†   „ ð Ø+/ØØð?"ð )ó?"ðB ñó ðò*ð ñó ðó
QòfU>ðn ‡^�^×Ññ$
ó ð$
òL]ô~"r!   r·   c                  ó4   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	y)	rÉ   zÞ
    An object that represents a possible kernel configuration for the auto-tuner to try.

    :ivar kwargs: a dictionary of meta-parameters to pass to the kernel as keyword arguments.
    :type kwargs: dict[Str, Any]
    c                ó   — || _         y r�   ©r¿   )rP   r¿   s     r   rK   zAutotuneConfig.__init__›  s	   € Øˆ�r!   c                ó2   — |j                  di «      | _        y )Nr¿   )r,   r¿   )rP   rM  s     r   Ú__setstate__zAutotuneConfig.__setstate__ž  s   € Ø—i‘i ¨"Ó-ˆ�r!   c                ó   — | j                   S r�   rÅ  r  s    r   r  zAutotuneConfig.all_kwargs¡  s   € Ø�{‰{Ðr!   c                ó˜   — g }| j                   j                  «       D ]  \  }}|j                  |› d|› �«       Œ dj                  |«      S )Nr\  r=  )r¿   ró   rø   rA   )rP   Úresrä   râ   s       r   Ú__str__zAutotuneConfig.__str__¤  sK   € ØˆØ—K‘K×%Ñ%Ó'ò 	$‰DˆAˆqØ�J‰J˜!˜˜B˜q˜c�{Õ#ð	$à�y‰y˜‹~Ðr!   c                ób   — t        t        | j                  «       j                  «       «      «      S r�   )Úhashrï   r  ró   r  s    r   Ú__hash__zAutotuneConfig.__hash__ª  s"   € Ü”E˜$Ÿ/™/Ó+×1Ñ1Ó3Ó4Ó5Ð5r!   c                ó¨   — t        | j                  «       j                  «       «      }t        |j                  «       j                  «       «      }||k(  S r�   )rï   r  ró   )rP   ÚotherÚ
self_tupleÚother_tuples       r   Ú__eq__zAutotuneConfig.__eq__­  sC   € Ü˜4Ÿ?™?Ó,×2Ñ2Ó4Ó5ˆ
Ü˜E×,Ñ,Ó.×4Ñ4Ó6Ó7ˆØ˜[Ñ(Ð(r!   N)
rR   rS   rT   r”   rK   rÇ  r  rË  rÎ  rÓ  r;   r!   r   rÉ   rÉ   “  s%   „ ñòò.òòò6ó)r!   rÉ   c                ó^   ‡ ‡‡‡‡‡— dt         j                  «       › d� ‰€g Šˆˆ ˆˆˆˆfd„}|S )Nzw
    Decorator for auto-tuning a function function.

    .. highlight:: python

    If the environment variable :code:`aÂ  _PRINT_AUTOTUNING` is set to
    :code:`"1"`, we will print a message to stdout after autotuning each
    kernel, including the time spent autotuning and the best configuration.

    :param configs: a list of :code:`AutotuneConfig` objects
    :type configs: list[AutotuneConfig]
    :param key: a list of argument names whose change in value will trigger the evaluation of all provided configs.
    :type key: list[str]
    :param prune_configs_by: a dict of functions that are used to prune configs, fields:
        'perf_model': performance model used to predicate running time with different configs, returns running time
        'top_k': number of configs to bench
        'early_config_prune'(optional): a function used to do early prune (eg, num_stages). It takes configs:List[Config] as its input, and returns pruned configs.
    :param restore_value: a list of argument names whose value will be restored after evaluating any configs.
    :type restore_value: list[str]
    :param do_bench: a benchmark function to measure the time of each run.
    :type do_bench: lambda fn, quantiles
    :param cache_results: whether to cache autotune timings to disk.  Defaults to False.
    "type cache_results: bool
    c           	     ó(   •— t        | ‰‰‰‰‰‰¬«      S )N)r¼   rÖ   r×   rÐ   )r·   )rÔ   rÐ   rÊ   r×   rM   rÖ   r¼   s    €€€€€€r   Ú	decoratorzautotune.<locals>.decoratorÒ  s%   ø€ ÜØØØØ'Ø-ØØ'ô
ð 	
r!   )r8   r9   )rÊ   rM   rÖ   r¼   r×   rÐ   rÖ  s   `````` r   Úautotuner×  ³  sA   ý€ ð	(ô
 )5×(:Ñ(:Ó(<Ð'=ð >ñð2 €{Øˆ÷	
ñ 	
ð Ðr!   )r   r  r‘   r“   )r‘   z
str | None)éÈ   )NNNNT)7Ú
__future__r   rŠ  r*   r‰   r$  r˜   rh   rË   rY   rì   rˆ  Údataclassesr   r   Úpathlibr   Ú	functoolsr   r   Útypingr	   r
   r   r   r   Úbench.bench_utilsr   r   r   r%   r   r  rG   r   Ú_compile_payloadr   r   r8   rƒ  r    r4   r<   rB   Úruntimer?   rD   r`   ro   rq   r©   rœ   r·   rÉ   r×  r;   r!   r   ú<module>rá     sç   ðõ #ã Û 	Û Û 
Û Û Û Û Û Û ß (Ý ß .ß 3Õ 3÷ñ ó Ý ã å ß Qð $€Ø
€óó ò.BòEôG�v—~‘~×+Ñ+×<Ñ<ô GòLó
!ðV ÷9 ð 9 ó ð9 òx,ò<%÷Pz	ñ z	÷z)ñ )ðB `dô*r!   