§
    ÐóÉjÌp  ã                   óD  — d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZmZmZ ddlmZ ddlmZ d„ Zd„ Zd	„ Ze	d
„ ¦   «         Zd„ Zd"d„Zd"d„Zd#d„Zd#d„Zd$d„Z G d„ d¦  «        Z G d„ d¦  «        Zd„ Zd%d„Zd%d„Z d„ Z!e	d&d „¦   «         Z"d%d!„Z#dS )'é    N)Úcontextmanager)ÚAnyÚDictÚListé   )Úlanguage)Úruntimec                 óò   — d                      | ¦  «        } dddd| z   dg}t          j        |¦  «        }|                     t          j        j        ¦  «                             d¦  «        }d„ |D ¦   «         }|S )Nú,ú
nvidia-smiú-iÚ0z--query-gpu=z--format=csv,noheader,nounitsc                 ó,   — g | ]}t          |¦  «        ‘ŒS © )Úint)Ú.0Úxs     ús/home/lighthouse/badge-speaker-benchmark/.benchmark-venv-community/lib64/python3.11/site-packages/triton/testing.pyú
<listcomp>znvsmi.<locals>.<listcomp>   s   € Ð
Ð
Ð
�a�3ˆq‰6Œ6Ð
Ð
Ð
ó    )ÚjoinÚ
subprocessÚcheck_outputÚdecodeÚsysÚstdoutÚencodingÚsplit)ÚattrsÚcmdÚoutÚrets       r   Únvsmir#      ss   € Ø�HŠH�U‰OŒO€EØ˜˜s N°UÑ$:Ð<[Ð
\€CÝ
Ô
! #Ñ
&Ô
&€CØ
�*Š*•S”ZÔ(Ñ
)Ô
)×
/Ò
/°Ñ
4Ô
4€CØ
Ð
˜3Ð
Ñ
Ô
€CØ€Jr   c                 ól   ‡ ‡‡— t          ‰ ¦  «        Št          ‰ ¦  «        Š ˆ ˆfd„Šˆfd„|D ¦   «         S )Nc                 óÞ   •— d| cxk    rdk    sn t          d¦  «        ‚| ‰dz
  z  }t          j        |¦  «        }t          j        |¦  «        }||z
  }d|z
  ‰|         z  |‰|         z  z   S )Nr   r   z%Quantiles must be in the range [0, 1])Ú
ValueErrorÚmathÚfloorÚceil)ÚqÚpointÚlowerÚupperÚtÚaÚns        €€r   Úget_quantilez_quantile.<locals>.get_quantile    s}   ø€ Ø�Q��’�˜!’���ÝÐDÑEÔEÐEØ�Q˜‘U‘ˆÝ”
˜5Ñ!Ô!ˆÝ”	˜%Ñ Ô ˆØ�E‰MˆØ�A‘˜˜5œÑ! A¨¨%¬¡LÑ0Ð0r   c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS r   r   )r   Úqir1   s     €r   r   z_quantile.<locals>.<listcomp>)   s#   ø€ Ð)Ð)Ð) ˆLˆL˜ÑÔÐ)Ð)Ð)r   )ÚlenÚsorted)r/   r*   r1   r0   s   ` @@r   Ú	_quantiler6      sU   øøø€ ÝˆA‰Œ€AÝˆq‰	Œ	€Að1ð 1ð 1ð 1ð 1ð 1ð *Ð)Ð)Ð) qÐ)Ñ)Ô)Ð)r   c                 ó0  — |�-t          | |¦  «        }t          |¦  «        dk    r|d         }|S |dk    r| S |dk    rt          | ¦  «        S |dk    rt          | ¦  «        S |dk    rt	          j        | ¦  «        S |dk    rt	          j        | ¦  «        S d S )Nr   r   ÚallÚminÚmaxÚmeanÚmedian)r6   r4   r9   r:   Ú
statisticsr;   r<   )ÚtimesÚ	quantilesÚreturn_moder"   s       r   Ú_summarize_statisticsrA   ,   s±   € ØÐÝ˜˜yÑ)Ô)ˆÝˆs‰8Œ8�qŠ=ˆ=Ø�a”&ˆCØˆ
Ø�eÒÐØˆØ	˜Ò	Ð	Ý�5‰zŒzÐØ	˜Ò	Ð	Ý�5‰zŒzÐØ	˜Ò	Ð	ÝŒ˜uÑ%Ô%Ð%Ø	˜Ò	 Ð	 ÝÔ  Ñ'Ô'Ð'ð 
!Ð	 r   c               #   óˆ  K  — dd l m}  t          j        dt	          j        ¦   «         j        › �¬¦  «        5 }|                      t          j	         
                    |d¦  «        dd¬¦  «        }	 | |fV — |�|                      |¦  «         n# |�|                      |¦  «         w w xY wd d d ¦  «         d S # 1 swxY w Y   d S )Nr   ztriton-bench-proton-)ÚprefixÚprofileÚshadowÚtree)ÚcontextÚdata)Útriton.profilerÚprofilerÚtempfileÚTemporaryDirectoryÚuuidÚuuid4ÚhexÚstartÚosÚpathr   Úfinalize)ÚprotonÚtmpdirÚsessions      r   Ú_proton_bench_sessionrW   >   s  è è € à$Ð$Ð$Ð$Ð$Ð$å	Ô	$Ð,UÅ4Ä:Á<Ä<ÔCSÐ,UÐ,UÐ	VÑ	VÔ	Vð )ÐZ`Ø—,’,�rœwŸ|š|¨F°IÑ>Ô>ÈÐW]�,Ñ^Ô^ˆð	)Ø˜'�/Ð!Ð!Ð!àÐ"Ø—’ Ñ(Ô(Ð(øøð Ð"Ø—’ Ñ(Ô(Ð(Ð(ð #øøøð)ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )ð )ð )s)   ·7B7Á/BÁ5B7ÂB'Â'B7Â7B;Â>B;c                 óz   ‡‡‡‡— g Šˆfd„Šˆˆˆˆfd„Š| D ]} ‰|¦  «         Œd„ t          ‰¦  «        D ¦   «         S )Nc                 óæ   •— |                       dg ¦  «        }t          |¦  «        dk    r-|                       di ¦  «                              dd¦  «        dz  S t          ˆfd„|D ¦   «         ¦  «        S )NÚchildrenr   Úmetricsz	time (ns)ç    €„.Ac              3   ó.   •K  — | ]} ‰|¦  «        V — Œd S ©Nr   )r   ÚchildÚkernel_time_mss     €r   ú	<genexpr>zF_collect_proton_scope_times.<locals>.kernel_time_ms.<locals>.<genexpr>R   s-   øè è € Ð?Ð?¨U�>�> %Ñ(Ô(Ð?Ð?Ð?Ð?Ð?Ð?r   )Úgetr4   Úsum)ÚnoderZ   r`   s     €r   r`   z3_collect_proton_scope_times.<locals>.kernel_time_msN   ss   ø€ Ø—8’8˜J¨Ñ+Ô+ˆÝˆx‰=Œ=˜AÒÐØ—8’8˜I rÑ*Ô*×.Ò.¨{¸AÑ>Ô>ÀÑDÐDÝÐ?Ð?Ð?Ð?°hÐ?Ñ?Ô?Ñ?Ô?Ð?r   c                 ó"  •— |                       di ¦  «                              dd¦  «        }|                     ‰¦  «        r* ‰| ¦  «        }|dk    r‰                     ||f¦  «         d S |                       dg ¦  «        D ]} ‰|¦  «         Œd S )NÚframeÚnameÚ r   rZ   )rb   Ú
startswithÚappend)rd   rg   Útime_msr_   r`   rC   Úscope_timesÚvisits       €€€€r   rm   z*_collect_proton_scope_times.<locals>.visitT   s¥   ø€ Ø�xŠx˜ Ñ$Ô$×(Ò(¨°Ñ4Ô4ˆØ�?Š?˜6Ñ"Ô"ð 	Ø$�n TÑ*Ô*ˆGØ˜Š{ˆ{Ø×"Ò" D¨' ?Ñ3Ô3Ð3ØˆFØ—X’X˜j¨"Ñ-Ô-ð 	ð 	ˆEØˆE�%‰LŒLˆLˆLð	ð 	r   c                 ó   — g | ]\  }}|‘ŒS r   r   )r   Ú_Útimes      r   r   z/_collect_proton_scope_times.<locals>.<listcomp>`   s   € Ð4Ð4Ð4‘W�Q˜ˆDÐ4Ð4Ð4r   )r5   )ÚdatabaserC   rd   r`   rl   rm   s    ` @@@r   Ú_collect_proton_scope_timesrr   K   s�   øøøø€ Ø€Kð@ð @ð @ð @ð @ðð ð ð ð ð ð ð ð ð ð ˆØˆˆd‰ŒˆˆØ4Ð4¥ {Ñ 3Ô 3Ð4Ñ4Ô4Ð4r   é   r;   c                 ó�  — ddl }|dv sJ ‚|j                             |j                             ¦   «         ¦  «        5   | ¦   «          |�5|D ]2}|                     ¦   «          |                     d¦  «         d|_        Œ3|j                             d¬¦  «        }|j                             d¬¦  «        }|                     ¦   «          t          d¦  «        D ]}	 | ¦   «          Œ|                     ¦   «          |j         
                    ¦   «          |                     |¦  «        dz  }
|
dk    rd}n t          dt          ||
z  ¦  «        ¦  «        }|j                             ¦   «         }|j                             |¦  «        5  t          |¦  «        D ]}	|�|D ]	}d|_        Œ
 | ¦   «          Œ	 ddd¦  «         n# 1 swxY w Y   |j         
                    ¦   «          g }d	}t          |¦  «        D ]©}	|j                             d¬¦  «        }|j                             d¬¦  «        }|                     ¦   «          |                     ¦   «          |                     ¦   «          |j         
                    ¦   «          ||                     |¦  «        |z  gz  }Œªt#          |||¦  «        cddd¦  «         S # 1 swxY w Y   dS )
aÊ  
    Benchmark the runtime of the provided function.

    :param fn: Function to benchmark
    :type fn: Callable
    :param rep: Repetition time (in ms)
    :type rep: int
    :param grad_to_none: Reset the gradient of the provided tensor to None
    :type grad_to_none: torch.tensor, optional
    :param return_mode: The statistical measure to return. Options are "min", "max", "mean", "median", or "all". Default is "mean".
    :type return_mode: str
    r   N©r9   r:   r;   r<   r8   T©Úenable_timingé   éè  r   é
   )ÚtorchÚcudaÚstreamÚStreamÚdetach_Úrequires_grad_ÚgradÚEventÚrecordÚrangeÚsynchronizeÚelapsed_timer:   r   Ú	CUDAGraphÚgraphÚreplayrA   )ÚfnÚrepÚgrad_to_noner?   r@   r{   r   Ústart_eventÚ	end_eventro   Úestimate_msÚn_repeatÚgr"   Ú	n_retriess                  r   Údo_bench_cudagraphr“   c   s|  € ð €L€L€LØÐAÐAÐAÐAÐAà	Œ×	Ò	˜5œ:×,Ò,Ñ.Ô.Ñ	/Ô	/ð 0Bð 0Bà
ˆ‰ŒˆØÐ#Ø!ð ð �Ø—	’	‘”�Ø× Ò  Ñ&Ô&Ð&Ø�”�ð ”j×&Ò&°TÐ&Ñ:Ô:ˆØ”J×$Ò$°4Ð$Ñ8Ô8ˆ	Ø×ÒÑÔÐÝ�q‘”ð 	ð 	ˆAØˆB‰DŒDˆDˆDØ×ÒÑÔÐØŒ
×ÒÑ Ô Ð Ø!×.Ò.¨yÑ9Ô9¸AÑ=ˆà˜!ÒÐØˆHˆHå˜1�c #¨Ñ"3Ñ4Ô4Ñ5Ô5ˆHð ŒJ× Ò Ñ"Ô"ˆØŒZ×Ò˜aÑ Ô ð 	ð 	Ý˜8‘_”_ð ð �ØÐ+Ø)ð &ð &˜Ø!%˜œ˜Ø�‘”��ð	ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	Œ
×ÒÑ Ô Ð àˆØˆ	Ý�yÑ!Ô!ð 	Dð 	DˆAØœ*×*Ò*¸Ð*Ñ>Ô>ˆKØœ
×(Ò(°tÐ(Ñ<Ô<ˆIØ×ÒÑ Ô Ð Ø�HŠH‰JŒJˆJØ×ÒÑÔÐØŒJ×"Ò"Ñ$Ô$Ð$Ø�K×,Ò,¨YÑ7Ô7¸(ÑBÐCÑCˆCˆCÝ$ S¨)°[ÑAÔAða0Bð 0Bð 0Bð 0Bñ 0Bô 0Bð 0Bð 0Bð 0Bð 0Bð 0Bð 0Bøøøð 0Bð 0Bð 0Bð 0Bð 0Bð 0Bs7   ¼E	J;Æ+F=Æ1J;Æ=G	ÇJ;ÇG	ÇC)J;Ê;J?ËJ?c           
      ó‚  ‡— |dv sJ ‚t           j        j                             ¦   «         }|j        dk    rt          d¦  «        ‚ddl}|j                             |j         	                    ¦   «         ¦  «        5   | ¦   «          |�5|D ]2}| 
                    ¦   «          |                     d¦  «         d|_        Œ3|j                             d¬¦  «        }|j                             d¬¦  «        }	|                     ¦   «          t          d¦  «        D ]}
 | ¦   «          Œ|	                     ¦   «          |j                             ¦   «          |                     |	¦  «        dz  }|dk    rd	nt%          d
t'          ||z  ¦  «        ¦  «        }t)          ¦   «         5 \  }}|€t          d¦  «        ‚t           j        j                             ¦   «         }|j                             ¦   «         }dt/          j        ¦   «         j        › d�}|j                             |¦  «        5  t          |¦  «        D ]p}|�|D ]	}d|_        Œ
t           j        j                             |¦  «         |                     |› |d›�¦  «        5   | ¦   «          ddd¦  «         n# 1 swxY w Y   Œq	 ddd¦  «         n# 1 swxY w Y   |j                             ¦   «          dŠ	 t          ‰¦  «        D ]}|                     ¦   «          Œ|j                             ¦   «          |                     |d¬¦  «         n# |                     |d¬¦  «         w xY wˆfd„t?          |j          !                    |¦  «        |¦  «        D ¦   «         }ddd¦  «         n# 1 swxY w Y   tE          |||¦  «        cddd¦  «         S # 1 swxY w Y   dS )a¾  
    Benchmark the runtime of kernels invoked by the provided function using the Proton profiler and CUDA graphs.
    This function is similar to `do_bench_cudagraph` that avoids CPU overhead by replaying a CUDA graph with multiple iterations of the provided function,
    but it uses the Proton profiler to measure the runtime of each kernel in the graph instead of using CUDA events to measure the total runtime of the graph.
    This allows us to get more fine-grained measurements of the kernel runtimes and to exclude cache flushes from the measurement.
    Note that this function has several constraints compared to `do_bench_cudagraph`:
    - It does not measure GPU operations other than kernels (e.g., memory copies, synchronization, etc.).
    - It supports only the NVIDIA GPU. AMD GPU is a TODO.

    :param fn: Function to benchmark
    :type fn: Callable
    :param rep: Repetition time (in ms)
    :type rep: int
    :param grad_to_none: Reset the gradient of the provided tensor to None
    :type grad_to_none: torch.tensor, optional
    :param return_mode: The statistical measure to return. Options are "min", "max", "mean", "median", or "all". Default is "mean".
    :type return_mode: str
    ru   r|   z�do_bench_cudagraph_proton requires the NVIDIA backend because Proton does not reliably attribute CUDA graph replay launches to scopes on HIP.r   NTrv   rx   ry   r   úŽProton profiler session could not be created. Make sure you are running on a supported GPU and that the Proton profiler is properly installed.úproton.ú.Ú08drz   ©Úflushingc                 ó   •— g | ]}|‰z  ‘ŒS r   r   )r   r.   r’   s     €r   r   z-do_bench_cudagraph_proton.<locals>.<listcomp>í   s   ø€ ÐpÐpÐp q�Q˜‘]ÐpÐpÐpr   )#r	   ÚdriverÚactiveÚget_current_targetÚbackendÚRuntimeErrorr{   r|   r}   r~   r   r€   r�   r‚   rƒ   r„   r…   r†   r:   r   rW   Úget_empty_cache_for_benchmarkr‡   rM   rN   rO   rˆ   Úclear_cacheÚscoper‰   Ú
deactivaterr   rH   rb   rA   )rŠ   r‹   rŒ   r?   r@   Útargetr{   r   r�   rŽ   ro   r�   r�   rT   rV   Úcacher‘   Úscope_prefixÚir>   r’   s                       @r   Údo_bench_cudagraph_protonr©   ¦   s  ø€ ð& ÐAÐAÐAÐAÐAåŒ^Ô"×5Ò5Ñ7Ô7€FØ„~˜ÒÐÝð Tñ Uô Uð 	Uð €L€L€Là	Œ×	Ò	˜5œ:×,Ò,Ñ.Ô.Ñ	/Ô	/ð -Dð -DØ
ˆ‰ŒˆØÐ#Ø!ð ð �Ø—	’	‘”�Ø× Ò  Ñ&Ô&Ð&Ø�”�à”j×&Ò&°TÐ&Ñ:Ô:ˆØ”J×$Ò$°4Ð$Ñ8Ô8ˆ	Ø×ÒÑÔÐÝ�q‘”ð 	ð 	ˆAØˆB‰DŒDˆDˆDØ×ÒÑÔÐØŒ
×ÒÑ Ô Ð Ø!×.Ò.¨yÑ9Ô9¸AÑ=ˆØ&¨!Ò+Ð+�4�4µ°Q½¸CÀ+Ñ<MÑ8NÔ8NÑ1OÔ1Oˆå"Ñ$Ô$ð 	qÑ(9¨°ØˆÝ"ðFñGô Gð Gõ ”NÔ)×GÒGÑIÔIˆEØ”
×$Ò$Ñ&Ô&ˆAØ8¥T¤Z¡\¤\Ô%5Ð8Ð8Ð8ˆLØ”×!Ò! !Ñ$Ô$ð ð Ý˜x™œð ð �AØ#Ð/Ø!-ð *ð *˜AØ%)˜AœF˜FÝ”NÔ)×5Ò5°eÑ<Ô<Ð<ØŸš¨Ð&>°qÐ&>Ð&>Ð&>Ñ?Ô?ð ð Ø˜™œ˜ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð øððð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ŒJ×"Ò"Ñ$Ô$Ð$ØˆIð:Ý˜yÑ)Ô)ð ð �AØ—H’H‘J”J�J�JØ”
×&Ò&Ñ(Ô(Ð(à×!Ò! '°DÐ!Ñ9Ô9Ð9Ð9ø�×!Ò! '°DÐ!Ñ9Ô9Ð9Ð9øøøàpÐpÐpÐpÕ,GÈÌÏÊÐX_ÑH`ÔH`ÐbnÑ,oÔ,oÐpÑpÔpˆEð3	qð 	qð 	qñ 	qô 	qð 	qð 	qð 	qð 	qð 	qð 	qøøøð 	qð 	qð 	qð 	qõ6 % U¨I°{ÑCÔCð[-Dð -Dð -Dð -Dñ -Dô -Dð -Dð -Dð -Dð -Dð -Dð -Døøøð -Dð -Dð -Dð -Dð -Dð -Ds™   Á:D#N4ÆBNÈ$AJ2ÊJÊJ2ÊJÊJ2Ê JÊ!J2Ê&NÊ2J6Ê6NÊ9J6Ê:NË?L0ÌNÌ0M	Í	7NÎ N4ÎN	ÎN4ÎN	ÎN4Î4N8Î;N8é   éd   c                 óþ  ‡— |dv sJ ‚t           j        j                             ¦   «         Š | ¦   «          ‰                     ¦   «          t           j        j                             ¦   «         }‰                     d¬¦  «        }‰                     d¬¦  «        }|                     ¦   «          t          d¦  «        D ]0}	t           j        j         	                    |¦  «          | ¦   «          Œ1|                     ¦   «          ‰                     ¦   «          | 
                    |¦  «        dz  }
t          dt          ||
z  ¦  «        ¦  «        }t          dt          ||
z  ¦  «        ¦  «        }ˆfd„t          |¦  «        D ¦   «         }ˆfd„t          |¦  «        D ¦   «         }t          |¦  «        D ]}	 | ¦   «          Œt          |¦  «        D ]r}|�|D ]	}d|_        Œ
t           j        j         	                    |¦  «         ||                              ¦   «           | ¦   «          ||                              ¦   «          Œs‰                     ¦   «          d	„ t          ||¦  «        D ¦   «         }t          |||¦  «        S )
a°  
    Benchmark the runtime of the provided function. By default, returns the mean runtime of :code:`fn` as a single float.

    :param fn: Function to benchmark
    :type fn: Callable
    :param warmup: Warmup time (in ms). Controls how long the function is run before timing begins.
    :type warmup: int
    :param rep: Repetition time (in ms). Controls the total duration of the timed runs.
    :type rep: int
    :param grad_to_none: Reset the gradient of the provided tensors to None before each run,
        to avoid gradient accumulation affecting timing.
    :type grad_to_none: list[torch.Tensor], optional
    :param quantiles: If provided, return these quantiles of the runtime distribution instead
        of a summary statistic. For example, ``[0.2, 0.5, 0.8]`` returns the 20th, 50th, and
        80th percentile runtimes in ms. When set, ``return_mode`` is ignored.
    :type quantiles: list[float], optional
    :param return_mode: The summary statistic to return when ``quantiles`` is not set.
        ``"mean"`` and ``"median"`` return a single float. ``"min"`` and ``"max"`` return
        the fastest and slowest run respectively. ``"all"`` returns the raw list of
        per-run timings in ms. Default is ``"mean"``.
    :type return_mode: str
    :return: A single float by default, a list of floats if ``quantiles`` is provided,
        or a list of all per-run timings if ``return_mode="all"``.
    :rtype: float | list[float]
    ru   Trv   rx   r   c                 ó<   •— g | ]}‰                      d ¬¦  «        ‘ŒS ©Trv   ©r‚   ©r   r¨   Údis     €r   r   zdo_bench.<locals>.<listcomp>#  s'   ø€ ÐIÐIÐI°A�2—8’8¨$�8Ñ/Ô/ÐIÐIÐIr   c                 ó<   •— g | ]}‰                      d ¬¦  «        ‘ŒS r®   r¯   r°   s     €r   r   zdo_bench.<locals>.<listcomp>$  s'   ø€ ÐGÐGÐG°!�—’¨�Ñ-Ô-ÐGÐGÐGr   Nc                 ó>   — g | ]\  }}|                      |¦  «        ‘ŒS r   )r†   )r   ÚsÚes      r   r   zdo_bench.<locals>.<listcomp>8  s(   € ÐGÐGÐG¡4 1 aˆQ�^Š^˜AÑÔÐGÐGÐGr   )r	   rœ   r�   Úget_device_interfacer…   r¡   r‚   rƒ   r„   r¢   r†   r:   r   r�   ÚziprA   )rŠ   Úwarmupr‹   rŒ   r?   r@   r¦   r�   rŽ   ro   r�   Ún_warmupr�   r¨   r   r>   r±   s                   @r   Údo_benchrº   ò   sn  ø€ ð4 ÐAÐAÐAÐAÐAå	ŒÔ	×	3Ò	3Ñ	5Ô	5€Bà€B�D„D€DØ‡N‚NÑÔÐåŒNÔ!×?Ò?ÑAÔA€Eð —(’(¨�(Ñ.Ô.€KØ—’ t�Ñ,Ô,€IØ×ÒÑÔÐÝ�1‰XŒXð ð ˆÝŒÔ×)Ò)¨%Ñ0Ô0Ð0Ø
ˆ‰ŒˆˆØ×ÒÑÔÐØ‡N‚NÑÔÐØ×*Ò*¨9Ñ5Ô5¸Ñ9€Kõ �1•c˜& ;Ñ.Ñ/Ô/Ñ0Ô0€HÝ�1•c˜# Ñ+Ñ,Ô,Ñ-Ô-€HØIÐIÐIÐI½¸x¹¼ÐIÑIÔI€KØGÐGÐGÐGµu¸X±´ÐGÑGÔG€Iå�8‰_Œ_ð ð ˆØ
ˆ‰Œˆˆå�8‰_Œ_ð ð ˆð Ð#Ø!ð ð �Ø�”�åŒÔ×)Ò)¨%Ñ0Ô0Ð0à�AŒ×ÒÑÔÐØ
ˆ‰ŒˆØ�!Œ×ÒÑÔÐÐà‡N‚NÑÔÐØGÐG­3¨{¸IÑ+FÔ+FÐGÑGÔG€EÝ  ¨	°;Ñ?Ô?Ð?r   c                 óü  — |dv sJ ‚t           j        j                             ¦   «         } | ¦   «          |                     ¦   «          t           j        j                             ¦   «         }|                     d¬¦  «        }|                     d¬¦  «        }	|                     ¦   «          t          d¦  «        D ]0}
t           j        j         	                    |¦  «          | ¦   «          Œ1|	                     ¦   «          |                     ¦   «          | 
                    |	¦  «        dz  }|dk    rd}d}n@t          dt          ||z  ¦  «        ¦  «        }t          dt          ||z  ¦  «        ¦  «        }t          |¦  «        D ]}
 | ¦   «          Œ|                     ¦   «          dt          j        ¦   «         j        › d	�}t!          ¦   «         5 \  }}|€t#          d¦  «        ‚	 t          |¦  «        D ]p}|�|D ]	}d
|_        Œ
t           j        j         	                    |¦  «         |                     |› |d›�¦  «        5   | ¦   «          d
d
d
¦  «         n# 1 swxY w Y   Œq|                     ¦   «          |                     |d¬¦  «         n# |                     |d¬¦  «         w xY wt+          |j                             |¦  «        |¦  «        }d
d
d
¦  «         n# 1 swxY w Y   t1          |||¦  «        S )a  
    Benchmark the runtime of kernels invoked by the provided function using the Proton profiler.

    The measured runtime is generally more accurate than `do_bench` for short kernels that are affected by CPU overhead.
    Note that this function has several constraints compared to `do_bench`:
    - It does not measure GPU operations other than kernels (e.g., memory copies, synchronization, etc.).
    - It supports only AMD and NVIDIA GPUs.

    :param fn: Function to benchmark.
    :type fn: Callable
    :param warmup: Warmup time (in ms).
    :type warmup: int
    :param rep: Repetition time (in ms).
    :type rep: int
    :param grad_to_none: Reset the gradient of the provided tensor(s) to `None`.
    :type grad_to_none: torch.Tensor, optional
    :param quantiles: Performance percentiles to return in addition to the median.
    :type quantiles: list[float], optional
    :param return_mode: The statistical measure to return. Options are "min", "max", "mean", "median", or "all". Default is "mean".
    :type return_mode: str
    ru   Trv   rx   r   ry   r   r–   r—   Nr•   r˜   r™   )r	   rœ   r�   r¶   r…   r¡   r‚   rƒ   r„   r¢   r†   r:   r   rM   rN   rO   rW   r    r�   r£   r¤   rr   rH   rb   rA   )rŠ   r¸   r‹   rŒ   r?   r@   r±   r¦   r�   rŽ   ro   r�   r¹   r�   r§   rT   rV   r¨   r   r>   s                       r   Údo_bench_protonr¼   <  s…  € ð, ÐAÐAÐAÐAÐAå	ŒÔ	×	3Ò	3Ñ	5Ô	5€Bà€B�D„D€DØ‡N‚NÑÔÐåŒNÔ!×?Ò?ÑAÔA€Eà—(’(¨�(Ñ.Ô.€KØ—’ t�Ñ,Ô,€IØ×ÒÑÔÐÝ�1‰XŒXð ð ˆÝŒÔ×)Ò)¨%Ñ0Ô0Ð0Ø
ˆ‰ŒˆˆØ×ÒÑÔÐØ‡N‚NÑÔÐØ×*Ò*¨9Ñ5Ô5¸Ñ9€Kà�aÒÐØˆØˆˆå�q�#˜f {Ñ2Ñ3Ô3Ñ4Ô4ˆÝ�q�#˜c KÑ/Ñ0Ô0Ñ1Ô1ˆå�8‰_Œ_ð ð ˆØ
ˆ‰ŒˆˆØ‡N‚NÑÔÐà0�TœZ™\œ\Ô-Ð0Ð0Ð0€LÝ	Ñ	 Ô	 ð TÑ$5 V¨WØˆ?ÝðBñCô Cð Cð
	6Ý˜8‘_”_ð ð �ØÐ+Ø)ð &ð &˜Ø!%˜œ˜Ý”Ô%×1Ò1°%Ñ8Ô8Ð8Ø—\’\ \Ð":°1Ð":Ð":Ð":Ñ;Ô;ð ð Ø�B‘D”D�Dðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð øà�NŠNÑÔÐà×Ò˜g°ÐÑ5Ô5Ð5Ð5øˆF×Ò˜g°ÐÑ5Ô5Ð5Ð5øøøå+¨F¬K¯OªO¸GÑ,DÔ,DÀlÑSÔSˆð#Tð Tð Tñ Tô Tð Tð Tð Tð Tð Tð Tøøøð Tð Tð Tð Tõ& ! ¨	°;Ñ?Ô?Ð?sO   ÇK"Ç&AJÉIÉJÉIÉJÉ!IÉ"JÉ:K"ÊJ+Ê++K"Ë"K&Ë)K&rh   c                 óô  — ddl }ddl}t          | |j        ¦  «        s|                     | ¦  «        } t          ||j        ¦  «        s|                     |¦  «        }|€d}t          |¦  «        r || j        ¦  «        n|}|€d}t          |¦  «        r || j        ¦  «        n|}t          | |j        ¦  «        r\| j        |j        k    r|                      ¦   «         } |  	                    ¦   «          
                    ¦   «                               ¦   «         } t          ||j        ¦  «        r\|j        |j        k    r|                     ¦   «         }| 	                    ¦   «          
                    ¦   «                               ¦   «         }| j        dk    s|j        dk    r"|j                             | |||d|¬¦  «         dS |                     | |||¬¦  «        st          |› d	| › d
|› d|› d|› d�
¦  «        ‚dS )a  
    Asserts that two inputs are close within a certain tolerance.

    :param x: The first input.
    :type x: scala, list, numpy.ndarray, or torch.Tensor
    :param y: The second input.
    :type y: scala, list, numpy.ndarray, or torch.Tensor
    :param atol: The absolute tolerance. Default value is 1e-2.
    :type atol: float, optional
    :param rtol: The relative tolerance. Default value is 0.
    :type rtol: float, optional
    :param err_msg: The error message to use if the assertion fails.
    :type err_msg: str
    r   Ng{®Gáz„?g        r   T)ÚatolÚrtolÚ	equal_nanÚerr_msg)r¾   r¿   ú z is not close to z (atol=z, rtol=ú))Únumpyr{   Ú
isinstanceÚTensorÚtensorÚcallableÚdtypeÚbfloat16ÚfloatÚcpuÚdetachÚsizeÚtestingÚassert_allcloseÚallcloseÚAssertionError)r   Úyr¾   r¿   rÁ   Únpr{   s          r   Úassert_closerÕ   ‡  sú  € ð ÐÐÐØ€L€L€Lõ �a˜œÑ&Ô&ð Ø�LŠL˜‰OŒOˆÝ�a˜œÑ&Ô&ð Ø�LŠL˜‰OŒOˆà€|ØˆÝ$ T™NœNÐ4ˆ4ˆ4�”‰=Œ=ˆ=°€Dà€|ØˆÝ$ T™NœNÐ4ˆ4ˆ4�”‰=Œ=ˆ=°€Dõ �!�U”\Ñ"Ô"ð %ØŒ7�e”nÒ$Ð$Ø—’‘	”	ˆAØ�EŠE‰GŒG�NŠNÑÔ×"Ò"Ñ$Ô$ˆÝ�!�U”\Ñ"Ô"ð %ØŒ7�e”nÒ$Ð$Ø—’‘	”	ˆAØ�EŠE‰GŒG�NŠNÑÔ×"Ò"Ñ$Ô$ˆð 	„v�‚z€z�Q”V˜a’Z�ZØ
Œ
×"Ò" 1 a¨d¸ÈÐW^Ð"Ñ_Ô_Ð_ØˆØ�;Š;�q˜! $¨Tˆ;Ñ2Ô2ð ^Ý Ð\Ð\¨!Ð\Ð\¸aÐ\Ð\ÈÐ\Ð\ÐUYÐ\Ð\Ð\Ñ]Ô]Ð]ð^ð ^r   c                   ó’   — e Zd ZdZ	 	 	 	 	 ddee         dee         dedee         d	ee         d
edeeef         dedededefd„Z	dS )Ú	Benchmarkzk
    This class is used by the :code:`perf_report` function to generate line plots with a concise API.
    rh   FNÚx_namesÚx_valsÚline_argÚ	line_valsÚ
line_namesÚ	plot_nameÚargsÚxlabelÚylabelÚx_logÚy_logc                 ó®   — || _         || _        |
| _        || _        || _        || _        || _        || _        || _        |	| _	        || _
        || _        dS )aq  
        Constructor.
        x_vals can be a list of scalars or a list of tuples/lists. If x_vals is a list
        of scalars and there are multiple x_names, all arguments will have the same value.
        If x_vals is a list of tuples/lists, each element should have the same length as
        x_names.

        :param x_names: Name of the arguments that should appear on the x axis of the plot.
        :type x_names: List[str]
        :param x_vals: List of values to use for the arguments in :code:`x_names`.
        :type x_vals: List[Any]
        :param line_arg: Argument name for which different values correspond to different lines in the plot.
        :type line_arg: str
        :param line_vals: List of values to use for the arguments in :code:`line_arg`.
        :type line_vals: List[Any]
        :param line_names: Label names for the different lines.
        :type line_names: List[str]
        :param plot_name: Name of the plot.
        :type plot_name: str
        :param args: Dictionary of keyword arguments to remain fixed throughout the benchmark.
        :type args: Dict[str, Any]
        :param xlabel: Label for the x axis of the plot.
        :type xlabel: str, optional
        :param ylabel: Label for the y axis of the plot.
        :type ylabel: str, optional
        :param x_log: Whether the x axis should be log scale.
        :type x_log: bool, optional
        :param y_log: Whether the y axis should be log scale.
        :type y_log: bool, optional
        :param styles: A list of tuples, where each tuple contains two elements: a color and a linestyle.
        :type styles: list[tuple[str, str]]
        N)rØ   rÙ   rá   rÚ   rÛ   rÜ   râ   Ústylesrß   rà   rÝ   rÞ   )ÚselfrØ   rÙ   rÚ   rÛ   rÜ   rÝ   rÞ   rß   rà   rá   râ   rä   s                r   Ú__init__zBenchmark.__init__¿  s]   € ð^ ˆŒØˆŒØˆŒ
Ø ˆŒØ"ˆŒØ$ˆŒØˆŒ
ØˆŒàˆŒØˆŒØ"ˆŒØˆŒ	ˆ	ˆ	r   )rh   rh   FFN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ústrr   r   Úboolræ   r   r   r   r×   r×   º  sÌ   € € € € € ðð ð ØØØØð;ð ;à�c”ð;ð �S”	ð;ð ð	;ð
 ˜”9ð;ð ˜”Ið;ð ð;ð �3˜�8Œnð;ð ð;ð ð;ð ð;ð ð;ð ;ð ;ð ;ð ;ð ;r   r×   c            	       ó:   — e Zd Zd„ Z	 	 ddedededefd„Zdd
„ZdS )ÚMarkc                 ó"   — || _         || _        d S r^   ©rŠ   Ú
benchmarks)rå   rŠ   rñ   s      r   ræ   zMark.__init__ÿ  s   € ØˆŒØ$ˆŒˆˆr   Fé   ÚbenchÚ	save_pathÚ
show_plotsÚ
print_datac                 óV	  ‡‡#— dd l }dd lm}	 dd l}
ˆfd„‰j        D ¦   «         }ˆfd„‰j        D ¦   «         }ˆfd„‰j        D ¦   «         }t          ‰j        ¦  «        }|
                     ||z   |z   |z   ¬¦  «        }‰j        D �]Š#t          ‰#t
          t          f¦  «        sˆ#fd„|D ¦   «         Š#t          ‰#¦  «        t          |¦  «        k    r"t          dt          |¦  «        › d‰#› �¦  «        ‚t          t          |‰#¦  «        ¦  «        }g g g }}}‰j        D ]Q} | j        di |¤‰j        |i¤‰j        ¤|¤Ž}	 |\  }}}n# t&          $ r	 |d d }}}Y nw xY w||gz  }||gz  }||gz  }ŒRt          ‰#¦  «        |z   |z   |z   |j        t          |¦  «        <   �Œ‰j        �r<|	                     ¦   «          |	                     ¦   «         }|d         }t1          t          |||¦  «        ¦  «        D �]\  }\  }}}||         ||         }}‰j        r‰j        |         d         nd }‰j        r‰j        |         d	         nd } |                     ||         ||         ||| ¬
¦  «         |                     ¦   «                              ¦   «         sz|                     ¦   «                              ¦   «         sT|                     t<          ¦  «        }|                     t<          ¦  «        }|                     ||         ||d|¬¦  «         �Œ|                      ¦   «          | !                    ‰j"        p|¦  «         | #                    ‰j$        ¦  «         | %                    ‰j&        rdnd¦  «         | '                    ‰j(        rdnd¦  «         |r|	 )                    ¦   «          |r6|	 *                    |j+         ,                    |‰j        › d�¦  «        ¦  «         |||z            }|rA|j-        d	         dk    r0|j.         /                    ¦   «         \  }!}"||"         ||!         z
  |d<   |r8ta          ‰j        dz   ¦  «         ta          | 1                    ¦   «         ¦  «         |r=| 2                    |j+         ,                    |‰j        › d�¦  «        d|› d�d¬¦  «         |S )Nr   c                 ó*   •— g | ]}|› d ‰j         › d�‘ŒS )z (rÃ   ©rà   ©r   r   ró   s     €r   r   zMark._run.<locals>.<listcomp>	  s,   ø€ ÐKÐKÐK°Q˜AÐ0Ð0 ¤Ð0Ð0Ð0ÐKÐKÐKr   c                 ó*   •— g | ]}|› d ‰j         › d�‘ŒS )z-min (rÃ   rù   rú   s     €r   r   zMark._run.<locals>.<listcomp>
  ó,   ø€ ÐNÐNÐN¸˜1Ð3Ð3 E¤LÐ3Ð3Ð3ÐNÐNÐNr   c                 ó*   •— g | ]}|› d ‰j         › d�‘ŒS )z-max (rÃ   rù   rú   s     €r   r   zMark._run.<locals>.<listcomp>  rü   r   )Úcolumnsc                 ó   •— g | ]}‰‘ŒS r   r   )r   ro   r   s     €r   r   zMark._run.<locals>.<listcomp>  s   ø€ Ð(Ð(Ð(˜1�QÐ(Ð(Ð(r   z	Expected z values, got r   )ÚlabelÚcolorÚlsg333333Ã?)Úalphar  ÚlogÚlinearz.pngé   ÚDiffú:z.csvz%.ÚfF)Úfloat_formatÚindexr   )3rQ   Úmatplotlib.pyplotÚpyplotÚpandasrÜ   ÚlistrØ   Ú	DataFramerÙ   rÅ   Útupler4   r&   Údictr·   rÛ   rŠ   rÚ   rÞ   Ú	TypeErrorÚlocrÝ   ÚfigureÚsubplotÚ	enumeraterä   ÚplotÚisnullr8   ÚastyperË   Úfill_betweenÚlegendÚ
set_xlabelrß   Ú
set_ylabelrà   Ú
set_xscalerá   Ú
set_yscalerâ   ÚshowÚsavefigrR   r   Úshaperþ   ÚtolistÚprintÚ	to_stringÚto_csv)$rå   ró   rô   rõ   rö   Údiff_colÚsave_precisionÚkwargsrQ   ÚpltÚpdÚy_mean_labelsÚy_min_labelsÚy_max_labelsrØ   ÚdfÚx_argsÚrow_meanÚrow_minÚrow_maxrÓ   r"   Úy_meanÚy_minÚy_maxÚaxÚfirst_xr¨   Ú
mean_labelÚ	min_labelÚ	max_labelÚcolÚstyÚcol0Úcol1r   s$    `                                 @r   Ú_runz	Mark._run  s  øø€ àˆ	ˆ	ˆ	à'Ð'Ð'Ð'Ð'Ð'ØÐÐÐØKÐKÐKÐK¸%Ô:JÐKÑKÔKˆØNÐNÐNÐN¸UÔ=MÐNÑNÔNˆØNÐNÐNÐN¸UÔ=MÐNÑNÔNˆÝ�u”}Ñ%Ô%ˆØ�\Š\ '¨MÑ"9¸LÑ"HÈ<Ñ"Wˆ\ÑXÔXˆØ”ð 	Eñ 	EˆAå˜a¥$­ Ñ/Ô/ð )Ø(Ð(Ð(Ð( Ð(Ñ(Ô(�å�1‰vŒv�˜W™œÒ%Ð%Ý Ð!K­S°©\¬\Ð!KÐ!KÈÐ!KÐ!KÑLÔLÐLÝ�#˜g q™/œ/Ñ*Ô*ˆFà)+¨R°˜w�gˆHØ”_ð #ð #�Ø�d”gÐVÐV ÐV¨5¬>¸1Ð*=ÐVÀÄÐVÈvÐVÐV�ð;Ø+.Ñ(�F˜E 5 5øÝ ð ;ð ;ð ;Ø+.°°d 5˜E�F�F�Fð;øøøà˜V˜HÑ$�Ø˜E˜7Ñ"�Ø˜E˜7Ñ"��Ý" 1™gœg¨Ñ0°7Ñ:¸WÑDˆBŒF•3�r‘7”7‰O‰OàŒ?ñ 	OØ�JŠJ‰LŒLˆLØ—’‘”ˆBà˜a”jˆGÝ9BÅ3À}ÐVbÐdpÑCqÔCqÑ9rÔ9rð Vñ VÑ5�Ñ5�J 	¨9Ø! )œ}¨b°¬m�u�Ø,1¬LÐB�e”l 1”o aÔ(Ð(¸d�Ø,1¬LÐB�e”l 1”o aÔ(Ð(¸d�Ø—’˜˜7œ R¨
¤^¸:ÈSÐUX�ÑYÔYÐYØ—|’|‘~”~×)Ò)Ñ+Ô+ð V°E·L²L±N´N×4FÒ4FÑ4HÔ4Hð VØ!ŸLšL­Ñ/Ô/�EØ!ŸLšL­Ñ/Ô/�EØ—O’O B w¤K°¸ÀTÐQT�OÑUÔUÐUùØ�IŠI‰KŒKˆKØ�MŠM˜%œ,Ð1¨'Ñ2Ô2Ð2Ø�MŠM˜%œ,Ñ'Ô'Ð'à�MŠM 5¤;Ð<˜%˜%°HÑ=Ô=Ð=Ø�MŠM 5¤;Ð<˜%˜%°HÑ=Ô=Ð=Øð Ø—’‘
”
�
Øð OØ—’˜BœGŸLšL¨°u´Ð4LÐ4LÐ4LÑMÔMÑNÔNÐNØ�˜-Ñ'Ô(ˆØð 	-˜œ œ qÒ(Ð(Øœ×*Ò*Ñ,Ô,‰JˆD�$Ø˜Dœ B t¤HÑ,ˆBˆv‰Jàð 	"Ý�%”/ CÑ'Ñ(Ô(Ð(Ý�"—,’,‘.”.Ñ!Ô!Ð!Øð 	#Ø�IŠI�b”g—l’l 9°´Ð.FÐ.FÐ.FÑGÔGÐVlÐ[iÐVlÐVlÐVlØ!ð ñ #ô #ð #àˆ	s   Ä?EÅEÅErh   c           	      óà  — t          | j        t          ¦  «        }|r| j        gn| j        }g }	 |D ]&}	|                      | j        |	|||fi |¤Ž¦  «         Œ'	 |r¾t          j        |d¬¦  «         t          t
          j         	                    |d¦  «        d¦  «        5 }
|
 
                    d¦  «         |d t          |¦  «        …         D ] }	|
 
                    d|	j        › d�¦  «         Œ!|
 
                    d¦  «         d d d ¦  «         n# 1 swxY w Y   nÆ# |r¿t          j        |d¬¦  «         t          t
          j         	                    |d¦  «        d¦  «        5 }
|
 
                    d¦  «         |d t          |¦  «        …         D ] }	|
 
                    d|	j        › d�¦  «         Œ!|
 
                    d¦  «         d d d ¦  «         w # 1 swxY w Y   w w xY w|r|r|d	         S |S d S )
NT)Úexist_okzresults.htmlÚwz<html><body>
z<image src="z.png"/>
z</body></html>
r   )rÅ   rñ   r×   rj   rA  rQ   ÚmakedirsÚopenrR   r   Úwriter4   rÝ   )rå   rõ   rö   rô   Ú	return_dfr*  Úhas_single_benchrñ   Ú
result_dfsró   Úhtmls              r   ÚrunzMark.runH  s«  € Ý% d¤oµyÑAÔAÐØ*:ÐO�d”oÐ&Ð&ÀÄˆ
Øˆ
ð	3Ø#ð að a�Ø×!Ò! ) $¤)¨E°9¸jÈ*Ð"_Ð"_ÐX^Ð"_Ð"_Ñ`Ô`Ð`Ð`ðað ð 3å”˜I°Ð5Ñ5Ô5Ð5Ý�"œ'Ÿ,š, y°.ÑAÔAÀ3ÑGÔGð 3È4Ø—J’JÐ/Ñ0Ô0Ð0Ø!+Ð,<­S°©_¬_Ð,<Ô!=ð Pð P˜ØŸ
š
Ð#N°5´?Ð#NÐ#NÐ#NÑOÔOÐOÐOØ—J’JÐ1Ñ2Ô2Ð2ð	3ð 3ð 3ñ 3ô 3ð 3ð 3ð 3ð 3ð 3ð 3øøøð 3ð 3ð 3ð 3øøð ð 3å”˜I°Ð5Ñ5Ô5Ð5Ý�"œ'Ÿ,š, y°.ÑAÔAÀ3ÑGÔGð 3È4Ø—J’JÐ/Ñ0Ô0Ð0Ø!+Ð,<­S°©_¬_Ð,<Ô!=ð Pð P˜ØŸ
š
Ð#N°5´?Ð#NÐ#NÐ#NÑOÔOÐOÐOØ—J’JÐ1Ñ2Ô2Ð2ð	3ð 3ð 3ñ 3ô 3ð 3ð 3ð 3ð 3ð 3ð 3øøøð 3ð 3ð 3ð 3ð 3ð3øøøð ð 	"Øð "Ø! !”}Ð$à!Ð!ØˆtsD   ¯)D ÂA#DÄDÄDÄAGÅ!A#GÇGÇGÇGÇGÇGN)Frò   )FFrh   F)	rç   rè   ré   ræ   r×   rë   rì   rA  rL  r   r   r   rî   rî   ý  s�   € € € € € ð%ð %ð %ð chØðCð C˜)ð C°ð CÀð CÐSWð Cð Cð Cð CðJð ð ð ð ð r   rî   c                 ó   ‡ — ˆ fd„}|S )zê
    Mark a function for benchmarking. The benchmark can then be executed by using the :code:`.run` method on the return value.

    :param benchmarks: Benchmarking configurations.
    :type benchmarks: List of :class:`Benchmark`
    c                 ó$   •— t          | ‰¦  «        S r^   )rî   rð   s    €r   ú<lambda>zperf_report.<locals>.<lambda>g  s   ø€ �˜b *Ñ-Ô-€ r   r   )rñ   Úwrappers   ` r   Úperf_reportrQ  `  s   ø€ ð .Ð-Ð-Ð-€GØ€Nr   c                 ó  — ddl m} | €+|j                             ¦   «                              ¦   «         } |j        j                             | ¦  «        d         }|j        j                             | ¦  «        d         }||z  dz  dz  dz  }|S )	z return DRAM bandwidth in GB/s r   ©rœ   NÚmem_clock_rateÚmem_bus_widthr  r\   é   )r	   rœ   r�   r¶   Úcurrent_deviceÚutilsÚget_device_properties)Údevicerœ   Úmem_clock_khzÚ	bus_widthÚbw_gbpss        r   Úget_dram_gbpsr^  k  s“   € ð  ÐÐÐÐÐØ€~Ø”×3Ò3Ñ5Ô5×DÒDÑFÔFˆØ”MÔ'×=Ò=¸fÑEÔEÐFVÔW€MØ”Ô#×9Ò9¸&ÑAÔAÀ/ÔR€IØ˜iÑ'¨!Ñ+¨cÑ1°AÑ5€GØ€Nr   c                 óô  — dd l }ddlm} |s|j                             ¦   «         }|j        j                             |¦  «        d         dz  }|j                             |¦  «        }|d         dk     r| |j	        k    sJ ‚d}ni| |j
        |j        fv rd}nV| |j	        |j        |j        fv rd}n=| |j        t          j        t          j        t          j        fv rd	}nt'          d
¦  «        ‚||z  |z  dz  }|S )Nr   r   rS  Úmultiprocessor_counté   rV  é   i   i   údtype not supportedç•Ö&è.>)r{   r	   rœ   r|   rW  r�   rX  rY  Úget_device_capabilityÚfloat16Úfloat32Úint32rÊ   Úint16Úint8ÚtlÚ
float8e4nvÚfloat8e4b15Úfloat8e5r    ©	rÉ   Ú
clock_raterZ  r{   rœ   Únum_subcoresÚ
capabilityÚops_per_sub_coreÚtflopss	            r   Úget_max_tensorcore_tflopsru  w  s(  € Ø€L€L€LàÐÐÐÐÐØð -Ø”×*Ò*Ñ,Ô,ˆà”=Ô&×<Ò<¸VÑDÔDÐE[Ô\Ð_`Ñ`€LØ”×1Ò1°&Ñ9Ô9€JØ�!„}�qÒÐØ˜œÒ%Ð%Ð%Ð%ØÐÐà�U”] E¤KÐ0Ð0Ð0Ø"ÐÐØ�u”} e¤n°e´kÐBÐBÐBØ"ÐÐØ�u”z¥2¤=µ"´.Å"Ä+ÐNÐNÐNØ#ÐÐåÐ4Ñ5Ô5Ð5Ø˜JÑ&Ð)9Ñ9¸DÑ@€FØ€Mr   c                  ó   ‡ — ˆ fd„}|S )Nc                 óJ   •‡ — t          j        ‰ ¦  «        ˆˆ fd„¦   «         }|S )Nc                  óp  •— dd l }|                     t          j        ¦   «         ¦  «                             ¦   «         }‰
                     ¦   «         |                     ¦   «         k    }|rÄ|dk    r¾t          j                             ‰j        d         ¦  «        }t          j	        d         ddœ}d|v s
J d¦   «         ‚|d         j
        j        j        }|› d	‰j        › d
|› d�}t          j        ddd|gd|¬¦  «        }	|	j        dk    s
J d¦   «         ‚dt#          |	j        ¦  «        v sJ ‚d S  ‰| i |¤Ž d S )Nr   zcuda-memcheckÚ__file__ÚPATHÚ1)rz  ÚPYTORCH_NO_CUDA_MEMORY_CACHINGÚrequestz@memcheck'ed test must have a (possibly unused) `request` fixturez::ú[ú]Úpytestz-vsT)Úcapture_outputÚenvz7cuda-memcheck returned an error: bounds checking failedzERROR SUMMARY: 0 errors)ÚpsutilÚProcessrQ   Úgetppidrg   ÚitemsrR   ÚrealpathÚ__globals__Úenvironrd   ÚcallspecÚidrç   r   rL  Ú
returncoderë   r   )rÞ   r*  rƒ  Ú	ppid_nameÚrun_cuda_memcheckrR   r‚  Útest_idr    r!   Útarget_kwargsÚtest_fns             €€r   rP  z1cuda_memcheck.<locals>.decorator.<locals>.wrapper˜  sW  ø€ àˆMˆMˆMØŸš¥r¤z¡|¤|Ñ4Ô4×9Ò9Ñ;Ô;ˆIØ -× 3Ò 3Ñ 5Ô 5¸¿º¹¼Ò GÐØ ð ) Y°/Ò%AÐ%AÝ”w×'Ò'¨Ô(;¸JÔ(GÑHÔH�å!œz¨&Ô1ÐUXÐYÐY�Ø  FÐ*Ð*Ð*Ð,nÑ*Ô*Ð*Ø  Ô+Ô0Ô9Ô<�ØÐ>Ð> Ô!1Ð>Ð>°GÐ>Ð>Ð>�Ý ”n o°xÀÈÐ%LÐ]aÐgjÐkÑkÔk�Ø”~¨Ò*Ð*Ð*Ð,eÑ*Ô*Ð*Ø0µC¸¼
±O´OÐCÐCÐCÐCÐCÐCà�˜Ð( Ð(Ð(Ð(Ð(Ð(r   )Ú	functoolsÚwraps)r‘  rP  r�  s   ` €r   Ú	decoratorz cuda_memcheck.<locals>.decorator–  s>   øø€ å	Œ˜Ñ	!Ô	!ð	)ð 	)ð 	)ð 	)ð 	)ñ 
"Ô	!ð	)ð" ˆr   r   )r�  r”  s   ` r   Úcuda_memcheckr•  ”  s$   ø€ ðð ð ð ð ð, Ðr   éF  é¿  c           	   #   óÐ  K  — 	 t          j        g d¢¦  «         t          j        dddd| › d| › �g¦  «         t          j        dddd|› d|› �g¦  «         t          dg¦  «        d	         }t          d
g¦  «        d	         }t          || z
  ¦  «        dk     sJ d| › d�¦   «         ‚t          ||z
  ¦  «        dk     sJ d|› d�¦   «         ‚d| z  }d|z  dz  }||fV — t          j        g d¢¦  «         t          j        g d¢¦  «         t          j        g d¢¦  «         d S # t          j        g d¢¦  «         t          j        g d¢¦  «         t          j        g d¢¦  «         w xY w)N)r   r   r   ú-pmr{  r   r   r   z--lock-gpu-clocks=r   z--lock-memory-clocks=zclocks.current.smr   zclocks.current.memoryrz   zGPU SMs must run at z MHzgÞ 3ßÁOÌ?i   gü©ñÒMbP?)r   r   r   r™  r   )r   r   r   z-rgc)r   r   r   z-rmc)r   r   r#   Úabs)Úref_sm_clockÚref_mem_clockÚcur_sm_clockÚcur_mem_clockrt  Úgbpss         r   Úset_gpu_clockr   ¯  sì  è è € ðCÝÔÐ EÐ EÐ EÑFÔFÐFÝÔØØØØ> Ð>Ð>°Ð>Ð>ð	!
ñ 	ô 	ð 	õ 	ÔØØØØC MÐCÐC°MÐCÐCð	!
ñ 	ô 	ð 	õ Ð1Ð2Ñ3Ô3°AÔ6ˆÝÐ6Ð7Ñ8Ô8¸Ô;ˆÝ�< ,Ñ.Ñ/Ô/°"Ò4Ð4Ð4Ð6_È\Ð6_Ð6_Ð6_Ñ4Ô4Ð4Ý�= =Ñ0Ñ1Ô1°BÒ6Ð6Ð6Ð8bÈ}Ð8bÐ8bÐ8bÑ6Ô6Ð6Ø)¨LÑ8ˆØ˜Ñ&¨Ñ-ˆØ�dˆlÐÐÐåÔÐ EÐ EÐ EÑFÔFÐFÝÔÐ AÐ AÐ AÑBÔBÐBÝÔÐ AÐ AÐ AÑBÔBÐBÐBÐBøõ 	ÔÐ EÐ EÐ EÑFÔFÐFÝÔÐ AÐ AÐ AÑBÔBÐBÝÔÐ AÐ AÐ AÑBÔBÐBÐBøøøs   „CD! Ä!AE%c                 ó¶  — dd l }ddlm} |s|j                             ¦   «         }|j        j                             |¦  «        d         dz  }|j                             ¦   «         }|d         dk     r+| |j	        k    rd}nM| |j
        k    rd}n?t          d	¦  «        ‚| |j	        k    rd}n"| |j
        |j        fv rd}nt          d	¦  «        ‚||z  |z  d
z  }|S )Nr   r   rS  r`  ra  rV  é    é@   rc  rd  )r{   r	   rœ   r|   rW  r�   rX  rY  re  rg  rf  r    rÊ   ro  s	            r   Úget_max_simd_tflopsr¤  Ì  s  € Ø€L€L€LàÐÐÐÐÐØð -Ø”×*Ò*Ñ,Ô,ˆà”=Ô&×<Ò<¸VÑDÔDÐE[Ô\Ð_`Ñ`€LØ”×1Ò1Ñ3Ô3€JØ�!„}�qÒÐØ�E”MÒ!Ð!Ø!ÐÐØ�e”mÒ#Ð#Ø!ÐÐåÐ4Ñ5Ô5Ð5à�E”MÒ!Ð!Ø!ÐÐØ�u”} e¤nÐ5Ð5Ð5Ø!ÐÐåÐ4Ñ5Ô5Ð5Ø˜JÑ&Ð)9Ñ9¸DÑ@€FØ€Mr   )rs   NNr;   )rª   r«   NNr;   )NNrh   r^   )r–  r—  )$r’  r'   rQ   r=   r   r   rK   rM   Ú
contextlibr   Útypingr   r   r   rh   r   rk  r	   r#   r6   rA   rW   rr   r“   r©   rº   r¼   rÕ   r×   rî   rQ  r^  ru  r•  r   r¤  r   r   r   ú<module>r§     sx  ðØ Ð Ð Ð Ø €€€Ø 	€	€	€	Ø Ð Ð Ð Ø Ð Ð Ð Ø 
€
€
€
Ø €€€Ø €€€Ø %Ð %Ð %Ð %Ð %Ð %Ø "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðð ð ð*ð *ð *ð (ð (ð (ð$ ð	)ð 	)ñ „ð	)ð5ð 5ð 5ð0@Bð @Bð @Bð @BðFIDð IDð IDð IDðXG@ð G@ð G@ð G@ðTH@ð H@ð H@ð H@ðV0^ð 0^ð 0^ð 0^ðf@ð @ð @ð @ð @ñ @ô @ð @ðF`ð `ð `ð `ð `ñ `ô `ð `ðFð ð ð	ð 	ð 	ð 	ðð ð ð ð:ð ð ð6 ðCð Cð Cñ „ðCð8ð ð ð ð ð r   