§
    KŠtjP  ã                   ó  — 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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     úL/var/www/html/CA-Chatbot/venv/lib/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   r*   r1   s     €r   r   z_quantile.<locals>.<listcomp>'   s!   ø€ Ð'Ð'Ð' ˆLˆL˜‰OŒOÐ'Ð'Ð'r   )ÚlenÚsorted)r/   r*   r1   r0   s   ` @@r   Ú	_quantiler5      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)r5   r3   r8   r9   Ú
statisticsr:   r;   )ÚtimesÚ	quantilesÚreturn_moder"   s       r   Ú_summarize_statisticsr@   *   s±   € ØÐÝ˜˜yÑ)Ô)ˆÝˆs‰8Œ8�qŠ=ˆ=Ø�a”&ˆCØˆ
Ø�eÒÐØˆØ	˜Ò	Ð	Ý�5‰zŒzÐØ	˜Ò	Ð	Ý�5‰zŒzÐØ	˜Ò	Ð	ÝŒ˜uÑ%Ô%Ð%Ø	˜Ò	 Ð	 ÝÔ  Ñ'Ô'Ð'ð 
!Ð	 r   é   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©r8   r9   r:   r;   r7   T©Úenable_timingé   iè  r   é
   )ÚtorchÚcudaÚstreamÚStreamÚdetach_Úrequires_grad_ÚgradÚEventÚrecordÚrangeÚsynchronizeÚelapsed_timer9   r   Ú	CUDAGraphÚgraphÚreplayr@   )ÚfnÚrepÚgrad_to_noner>   r?   rH   r   Ústart_eventÚ	end_eventÚ_Úestimate_msÚn_repeatÚgr"   Ú	n_retriess                  r   Údo_bench_cudagraphra   <   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?é   é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, return the median runtime of :code:`fn` along with
    the 20-th and 80-th performance percentile.

    :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 to None
    :type grad_to_none: torch.tensor, optional
    :param quantiles: Performance percentile 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
    rC   TrD   rF   r   c                 ó<   •— g | ]}‰                      d ¬¦  «        ‘ŒS ©TrD   ©rO   ©r   ÚiÚdis     €r   r   zdo_bench.<locals>.<listcomp>¨   s'   ø€ ÐIÐIÐI°A�2—8’8¨$�8Ñ/Ô/ÐIÐIÐIr   c                 ó<   •— g | ]}‰                      d ¬¦  «        ‘ŒS rf   rg   rh   s     €r   r   zdo_bench.<locals>.<listcomp>©   s'   ø€ ÐGÐGÐG°!�—’¨�Ñ-Ô-ÐGÐGÐGr   Nc                 ó>   — g | ]\  }}|                      |¦  «        ‘ŒS r   )rS   )r   ÚsÚes      r   r   zdo_bench.<locals>.<listcomp>½   s(   € ÐGÐGÐG¡4 1 aˆQ�^Š^˜AÑÔÐGÐGÐGr   )r	   ÚdriverÚactiveÚget_device_interfacerR   Úget_empty_cache_for_benchmarkrO   rP   rQ   Úclear_cacherS   r9   r   rN   Úzipr@   )rW   ÚwarmuprX   rY   r>   r?   ÚcacherZ   r[   r\   r]   Ún_warmupr^   ri   r   r=   rj   s                   @r   Údo_benchrx      sn  ø€ ð$ Ð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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=ú))ÚnumpyrH   Ú
isinstanceÚTensorÚtensorÚcallableÚdtypeÚbfloat16ÚfloatÚcpuÚdetachÚsizeÚtestingÚassert_allcloseÚallcloseÚAssertionError)r   Úyr{   r|   r~   ÚnprH   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.
    ry   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   )ry   ry   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 ©N©rW   Ú
benchmarks)r¢   rW   r¯   s      r   r£   zMark.__init__9  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>C  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>D  ó,   ø€ Ð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>E  rº   r   )Úcolumnsc                 ó   •— g | ]}‰‘ŒS r   r   )r   r\   r   s     €r   r   zMark._run.<locals>.<listcomp>K  s   ø€ Ð(Ð(Ð(˜1�QÐ(Ð(Ð(r   z	Expected z values, got r   )ÚlabelÚcolorÚlsg333333Ã?)Úalphar¿   ÚlogÚlinearz.pngé   ÚDiffú:z.csvz%.ÚfF)Úfloat_formatÚindexr   )3ÚosÚmatplotlib.pyplotÚpyplotÚpandasr™   Úlistr•   Ú	DataFramer–   r‚   Útupler3   r&   Údictrt   r˜   rW   r—   r›   Ú	TypeErrorÚlocrš   ÚfigureÚsubplotÚ	enumerater¡   ÚplotÚisnullr7   Úastyperˆ   Úfill_betweenÚlegendÚ
set_xlabelrœ   Ú
set_ylabelr�   Ú
set_xscalerž   Ú
set_yscalerŸ   ÚshowÚsavefigÚpathr   Úshaper¼   ÚtolistÚprintÚ	to_stringÚto_csv)$r¢   r±   r²   r³   r´   Údiff_colÚsave_precisionÚkwragsrÊ   Ú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_xri   Ú
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ry   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”   Úappendr  rÊ   ÚmakedirsÚopenrâ   r   Úwriter3   rš   )r¢   r³   r´   r²   Ú	return_dfÚkwargsÚhas_single_benchr¯   Ú
result_dfsr±   Úhtmls              r   ÚrunzMark.run‚  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°   )FFry   F)	r¤   r¥   r¦   r£   r”   r¨   r©   r  r  r   r   r   r«   r«   7  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>¡  s   ø€ �˜b *Ñ-Ô-€ r   r   )r¯   Úwrappers   ` r   Úperf_reportr  š  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   ©ro   NÚmem_clock_rateÚmem_bus_widthrÄ   g    €„.Aé   )r	   ro   rp   rq   Úcurrent_deviceÚutilsÚget_device_properties)Údevicero   Úmem_clock_khzÚ	bus_widthÚbw_gbpss        r   Úget_dram_gbpsr   ¥  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   r  Úmultiprocessor_counté   r  é   i   i   údtype not supportedç•Ö&è.>)rH   r	   ro   rI   r  rp   r  r  Úget_device_capabilityÚfloat16Úfloat32Úint32r‡   Úint16Úint8ÚtlÚ
float8e4nvÚfloat8e4b15Úfloat8e5ÚRuntimeError©	r†   Ú
clock_rater  rH   ro   Únum_subcoresÚ
capabilityÚops_per_sub_coreÚtflopss	            r   Úget_max_tensorcore_tflopsr8  ±  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)r=  Ú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ÚProcessrÊ   ÚgetppidÚnameÚitemsrâ   ÚrealpathÚ__globals__ÚenvironÚnodeÚcallspecÚidr¤   r   r  Ú
returncoder¨   r   )r›   r
  rF  Ú	ppid_nameÚrun_cuda_memcheckrâ   rE  Útest_idr    r!   Útarget_kwargsÚtest_fns             €€r   r  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)rV  r  rU  s   ` €r   Ú	decoratorz cuda_memcheck.<locals>.decoratorÐ  s>   øø€ å	Œ˜Ñ	!Ô	!ð	)ð 	)ð 	)ð 	)ð 	)ñ 
"Ô	!ð	)ð" ˆr   r   )rU  rY  s   ` r   Úcuda_memcheckrZ  Î  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.memoryrG   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_clockr7  Úgbpss         r   Úset_gpu_clockre  é  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   r  r"  r#  r  é    é@   r%  r&  )rH   r	   ro   rI   r  rp   r  r  r'  r)  r(  r1  r‡   r2  s	            r   Úget_max_simd_tflopsri    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   )rA   NNr:   )rb   rc   NNr:   )NNry   r­   )r[  r\  )rW  r'   rÊ   r<   r   r   Ú
contextlibr   Útypingr   r   r   ry   r   r-  r	   r#   r5   r@   ra   rx   r’   r”   r«   r  r   r8  rZ  re  ri  r   r   r   ú<module>rl     sþ  ðØ Ð Ð Ð Ø €€€Ø 	€	€	€	Ø Ð Ð Ð Ø Ð Ð Ð Ø 
€
€
€
Ø %Ð %Ð %Ð %Ð %Ð %Ø "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðð ð ð(ð (ð (ð (ð (ð (ð$@Bð @Bð @Bð @BðF?@ð ?@ð ?@ð ?@ðD0^ð 0^ð 0^ð 0^ðf@ð @ð @ð @ð @ñ @ô @ð @ðF`ð `ð `ð `ð `ñ `ô `ð `ðFð ð ð	ð 	ð 	ð 	ðð ð ð ð:ð ð ð6 ðCð Cð Cñ „ðCð8ð ð ð ð ð r   