§
    �ŠtjPd  ã            	       óæ  — d dl Z d dlZd dlZd dlZd dlZd dlmc mZ d dlm	Z	m
Z
mZmZmZ d dlmZ d dlmZmZmZ  G d„ d¦  «        Z G d„ de¦  «        Z G d	„ d
e¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Zdedz  defd„Zdefd„Z defd„Z!	 	 	 d$d e"d!e"d"edz  ddfd#„Z#dS )%é    N)Ú
_EventTypeÚ_ExtraFields_PyCallÚ_ExtraFields_PyCCallÚ_ExtraFields_TorchOpÚ_ProfilerEvent)Úprofile)Úindex_of_first_matchÚtraverse_bfsÚtraverse_dfsc                   óØ   — e Zd ZdZddededdfd„Zedefd„¦   «         Zd	e	fd
„Z
d„ Zdee	         fd„Zdee	         defd„Zd	e	fd„Zd„ Zd	e	fd„Zd	e	fd„Zd	e	fd„Zd	e	fd„Zd	e	fd„ZdS )ÚPatternz§
    Base class for all patterns, subclass this class and implement match()
    to define custom patterns.

    In subclass, define description and skip property.
    FÚprofÚshould_benchmarkÚreturnNc                 ó^  — || _         || _        d| _        d| _        d| _        |j        �|j        j        €t          d¦  «        ‚|j        j                             ¦   «         | _	        i | _
        | j	        D ]5}| j
                             |j        g ¦  «                             |¦  «         Œ6d S )Nz!Please specify a name for patternz(Please specify a description for patternÚ z,profiler and kineto_results must not be None)r   r   ÚnameÚdescriptionÚurlÚprofilerÚkineto_resultsÚAssertionErrorÚexperimental_event_treeÚ
event_treeÚtid_rootÚ
setdefaultÚ	start_tidÚappend)Úselfr   r   Úevents       ú]/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/profiler/_pattern_matcher.pyÚ__init__zPattern.__init__   s±   € ØˆŒ	Ø 0ˆÔØ7ˆŒ	ØEˆÔØˆŒØŒ=Ð  D¤MÔ$@Ð$HÝ Ð!OÑPÔPÐPØœ-Ô6×NÒNÑPÔPˆŒØ9;ˆŒØ”_ð 	Hð 	HˆEØŒM×$Ò$ U¤_°bÑ9Ô9×@Ò@ÀÑGÔGÐGÐGð	Hð 	Hó    c                 ó   — dS ©NF© ©r   s    r!   ÚskipzPattern.skip)   s   € àˆur#   r    c                 ó8   — | j         › dt          |¦  «        › �}|S )Nz
[Source Code Location] )r   Úsource_code_location)r   r    Úmsgs      r!   ÚreportzPattern.report-   s+   € àÔÐWÐWÕ:NÈuÑ:UÔ:UÐWÐWð 	ð ˆ
r#   c              #   ó>   K  — t          | j        ¦  «        E d{V —† dS )z„
        Traverse the event tree and yield all events.
        Override this method in subclass to customize the traversal.
        N)r   r   r'   s    r!   ÚeventTreeTraversalzPattern.eventTreeTraversal3   s0   è è € õ
   ¤Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0r#   Úeventsc                 ó–   — | j         › dt          |¦  «        › d�}| j        r't          | d¦  «        r|                      |¦  «        n|S |S )Nú: z events matched.Ú	benchmark)r   Úlenr   ÚhasattrÚbenchmark_summary)r   r/   Údefault_summarys      r!   ÚsummaryzPattern.summary:   sb   € Ø!œYÐGÐG­#¨f©+¬+ÐGÐGÐGˆØÔ ð 	õ ˜4 Ñ-Ô-ð%�×&Ò& vÑ.Ô.Ð.à$ðð
 Ðr#   c           
      ór  ‡— dt           dt          fd„}t          | d¦  «        st          d¦  «        ‚|                      |¦  «        Št          d„ |D ¦   «         ¦  «        }t          ˆfd„|D ¦   «         ¦  «        }| j        › dt          |¦  «        › d	 |||z
  ¦  «        › d
t          ||z  d¦  «        › d�S )NÚtime_nsr   c                 óJ   — g d¢}|D ]}| dk     r
| d›d|› �c S | dz  } Œ| d›d�S )N)ÚnsÚusÚmsiè  z.2fú z sr&   )r9   Úunit_lstÚunits      r!   Úformat_timez.Pattern.benchmark_summary.<locals>.format_timeF   s`   € Ø)Ð)Ð)ˆHØ ð !ð !�Ø˜T’>�>Ø%Ð2Ð2Ð2¨DÐ2Ð2Ð2Ð2Ð2Ø˜DÑ ��ØÐ%Ð%Ð%Ð%Ð%r#   r2   zPlease implement benchmark()c              3   ó$   K  — | ]}|j         V — Œd S ©N)Úduration_time_ns©Ú.0r    s     r!   ú	<genexpr>z,Pattern.benchmark_summary.<locals>.<genexpr>Q   s%   è è € ÐGÐG°u˜EÔ2ÐGÐGÐGÐGÐGÐGr#   c              3   óR   •K  — | ]!}‰t          |¦  «                 |j        z  V — Œ"d S rC   )Úinput_shapesrD   )rF   r    Úshapes_factor_maps     €r!   rG   z,Pattern.benchmark_summary.<locals>.<genexpr>R   sL   øè è € ð 
ð 
àð �l¨5Ñ1Ô1Ô2°UÔ5KÑKð
ð 
ð 
ð 
ð 
ð 
r#   r1   z* events matched. Total Estimated Speedup: z (é   zX))	ÚintÚstrr4   r   r2   Úsumr   r3   Úround)r   r/   rA   Úoriginal_timeÚnew_timerJ   s        @r!   r5   zPattern.benchmark_summaryE   s  ø€ ð	&¥ð 	&­ð 	&ð 	&ð 	&ð 	&õ �t˜[Ñ)Ô)ð 	AÝ Ð!?Ñ@Ô@Ð@Ø ŸNšN¨6Ñ2Ô2ÐÝÐGÐGÀÐGÑGÔGÑGÔGˆÝð 
ð 
ð 
ð 
àð
ñ 
ô 
ñ 
ô 
ˆð
 Œyð xð x�C ™KœKð xð xØ(3¨°MÀHÑ4LÑ(MÔ(Mðxð xÝQVÐWdÐgoÑWoÐqrÑQsÔQsðxð xð xð	
r#   c                 ó   — t           ‚)zu
        Return True if the event matches the pattern.
        This method should be overridden in subclass.
        )ÚNotImplementedError©r   r    s     r!   ÚmatchzPattern.match[   s
   € õ
 "Ð!r#   c                 óZ   ‡ — ‰ j         rg S ˆ fd„‰                      ¦   «         D ¦   «         }|S )Nc                 ó>   •— g | ]}‰                      |¦  «        ¯|‘ŒS r&   )rU   )rF   r    r   s     €r!   ú
<listcomp>z*Pattern.matched_events.<locals>.<listcomp>e   s:   ø€ ð 
ð 
ð 
Ø¸D¿JºJÀuÑ<MÔ<Mð
Øð
ð 
ð 
r#   )r(   r.   )r   Úmatched_eventss   ` r!   rY   zPattern.matched_eventsb   sN   ø€ ØŒ9ð 	ØˆIð
ð 
ð 
ð 
Ø#×6Ò6Ñ8Ô8ð
ñ 
ô 
ˆð Ðr#   c                 ó0   — |j         r|j         }|j         °|S rC   ©ÚparentrT   s     r!   Úroot_ofzPattern.root_ofj   s$   € ØŒlð 	!Ø”LˆEð Œlð 	!àˆr#   c                 ó¦   — |j         r|j         j        }n| j        |j                 }|                     |¦  «        }|d |…         ||dz   d …         fS )Né   )r\   Úchildrenr   r   Úindex)r   r    r`   ra   s       r!   Úsiblings_ofzPattern.siblings_ofo   sX   € ØŒ<ð 	6Ø”|Ô,ˆHˆHà”} U¤_Ô5ˆHØ—’˜uÑ%Ô%ˆØ˜˜˜Ô ¨%°!©)¨+¨+Ô!6Ð6Ð6r#   c                 óJ   — |                       |¦  «        \  }}|r|d         nd S )Nr   ©rb   )r   r    Ú_Únext_eventss       r!   Únext_ofzPattern.next_ofw   s,   € Ø×)Ò)¨%Ñ0Ô0‰ˆˆ;Ø!,Ð6ˆ{˜1Œ~ˆ~°$Ð6r#   c                 óJ   — |                       |¦  «        \  }}|r|d         nd S )Néÿÿÿÿrd   )r   r    Úprev_eventsre   s       r!   Úprev_ofzPattern.prev_of{   s,   € Ø×)Ò)¨%Ñ0Ô0‰ˆ�QØ"-Ð7ˆ{˜2Œˆ°4Ð7r#   c                 ód   — |sd S |j         r$ ||¦  «        s|j         }|j         r ||¦  «        ¯|S rC   r[   )r   r    Ú	predicates      r!   Úgo_up_untilzPattern.go_up_until   sS   € Øð 	Ø�4ØŒlð 	! 9 9¨UÑ#3Ô#3ð 	!Ø”LˆEð Œlð 	! 9 9¨UÑ#3Ô#3ð 	!àˆr#   ©F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úboolr"   Úpropertyr(   r   r,   r.   Úlistr7   rM   r5   rU   rY   r]   rb   rg   rk   rn   r&   r#   r!   r   r      s�  € € € € € ðð ðHð H˜Wð H¸ð HÈð Hð Hð Hð Hð ð�dð ð ð ñ „Xðð˜Nð ð ð ð ð1ð 1ð 1ð	˜d >Ô2ð 	ð 	ð 	ð 	ð
¨¨^Ô(<ð 
Àð 
ð 
ð 
ð 
ð,"˜>ð "ð "ð "ð "ðð ð ð˜^ð ð ð ð ð
7 ð 7ð 7ð 7ð 7ð7˜^ð 7ð 7ð 7ð 7ð8˜^ð 8ð 8ð 8ð 8ð ð ð ð ð ð ð r#   r   c            	       ó@   ‡ — e Zd Z	 d
dedededdfˆ fd„Zdefd	„Zˆ xZ	S )ÚNamePatternFr   r   r   r   Nc                 ón   •— t          ¦   «                              ||¦  «         d|› �| _        || _        d S )NzMatched Name Event: )Úsuperr"   r   r   )r   r   r   r   Ú	__class__s       €r!   r"   zNamePattern.__init__‹   s;   ø€ õ 	‰Œ×Ò˜Ð/Ñ0Ô0Ð0Ø8°$Ð8Ð8ˆÔØˆŒ	ˆ	ˆ	r#   r    c                 óD   — t          j        | j        |j        ¦  «        d uS rC   )ÚreÚsearchr   rT   s     r!   rU   zNamePattern.match’   s   € ÝŒy˜œ E¤JÑ/Ô/°tÐ;Ð;r#   ro   )
rp   rq   rr   r   rM   rt   r"   r   rU   Ú__classcell__©r{   s   @r!   rx   rx   Š   s€   ø€ € € € € àAFðð ØðØ#&ðØ:>ðà	ðð ð ð ð ð ð<˜>ð <ð <ð <ð <ð <ð <ð <ð <r#   rx   c                   ól   ‡ — e Zd ZdZddededdfˆ fd„Zedefd„¦   «         Zd	„ Z	d
e
e         fd„Zˆ xZS )ÚExtraCUDACopyPatternas  
    This pattern identifies if we creates a constant tensor on CPU and immediately moves it to GPU.
    example: torch.zeros((100, 100)).to("cuda")

    Pattern:
    built-in method                 |built-in method
        ...                         |    aten::to
            aten::fill_/aten::zero_ |        aten::_to_copy

    Algorithm:
    We start at node aten::to, go parent events' previous events,
    and check if we have a aten::fill_/aten::zero_ as we keep going down the tree.
    We always select the last child in the children list when we go down the tree.
    If at any step we failed, it is not a match.
    Fr   r   r   Nc                 óˆ   •— t          ¦   «                              ||¦  «         d| _        d| _        d| _        h d£| _        d S )NzExtra CUDA Copy PatternzQFilled a CPU tensor and immediately moved it to GPU. Please initialize it on GPU.zlhttps://pytorch.org/tutorials/recipes/recipes/tuning_guide.html#create-tensors-directly-on-the-target-device>   úaten::fill_úaten::normal_úaten::uniform_úaten::zero_)rz   r"   r   r   r   Úinit_ops©r   r   r   r{   s      €r!   r"   zExtraCUDACopyPattern.__init__§   sN   ø€ Ý‰Œ×Ò˜Ð/Ñ0Ô0Ð0Ø-ˆŒ	ØnˆÔð BˆŒð
ð 
ð 
ˆŒˆˆr#   c                 ó6   — | j         j         p| j         j         S rC   ©r   Ú
with_stackÚrecord_shapesr'   s    r!   r(   zExtraCUDACopyPattern.skip³   ó   € à”9Ô'Ð'ÐF¨t¬yÔ/FÐ+FÐFr#   c                 óê  — |j         dk    rdS |}|j        sdS |j        d         }|j         dk    rdS |j        sdS |j        d         }|j         dk    rdS t          |¦  «        }t          |¦  «        dk     rdS |d         �|d         |d         k    rdS |}|j        }|€dS |                      |¦  «        }|€dS |j        r$|j        d         }|j         | j        v rd	S |j        °$|j         | j        v S )
Nzaten::toFri   zaten::_to_copyzaten::copy_rK   r   r_   T)r   r`   Úinput_dtypesr3   r\   rk   rˆ   )r   r    Úto_eventÚdtypess       r!   rU   zExtraCUDACopyPattern.match·   s.  € àŒ:˜Ò#Ð#Ø�5ØˆØŒ~ð 	Ø�5Ø”˜rÔ"ˆØŒ:Ð)Ò)Ð)Ø�5ØŒ~ð 	Ø�5Ø”˜rÔ"ˆØŒ:˜Ò&Ð&Ø�5å˜eÑ$Ô$ˆÝˆv‰;Œ;˜Š?ˆ?Ø�5Ø�!Œ9Ð  q¤	¨V°A¬YÒ 6Ð 6Ø�5Øˆà”ˆØˆ=Ø�5à—’˜UÑ#Ô#ˆØˆ=Ø�5ØŒnð 	Ø”N 2Ô&ˆEàŒz˜Tœ]Ð*Ð*Ø�tð	 Œnð 	ð
 Œz˜Tœ]Ð*Ð*r#   r/   c                 ó  — d„ |D ¦   «         }|D ]v}|d         }t          j        dd|i¬¦  «        }t          j        dd|i¬¦  «        }|                     d¦  «        j        }|                     d¦  «        j        }||z  ||<   Œw|S )Nc                 ó.   — i | ]}t          |¦  «        d “ŒS ©g        ©rI   rE   s     r!   ú
<dictcomp>z2ExtraCUDACopyPattern.benchmark.<locals>.<dictcomp>Þ   ó"   € ÐJÐJÐJ¸%�\¨%Ñ0Ô0°#ÐJÐJÐJr#   r   ztorch.ones(size).to("cuda")Úsize©ÚstmtÚglobalsztorch.ones(size, device="cuda")é
   )r2   ÚTimerÚtimeitÚmean)	r   r/   rJ   Úshaper™   Úto_timerÚde_timerÚto_timeÚde_times	            r!   r2   zExtraCUDACopyPattern.benchmarkÝ   s±   € ØJÐJÀ6ÐJÑJÔJÐØ&ð 
	9ð 
	9ˆEØ˜”8ˆDÝ ”Ø2¸VÀT¸Nðñ ô ˆHõ !”Ø6ÀÈÀðñ ô ˆHð —o’o bÑ)Ô)Ô.ˆGØ—o’o bÑ)Ô)Ô.ˆGØ'.°Ñ'8Ð˜eÑ$Ð$Ø Ð r#   ro   )rp   rq   rr   rs   r   rt   r"   ru   r(   rU   rv   r   r2   r   r€   s   @r!   r‚   r‚   –   s½   ø€ € € € € ðð ð 

ð 

˜Wð 

¸ð 

Èð 

ð 

ð 

ð 

ð 

ð 

ð ðG�dð Gð Gð Gñ „XðGð#+ð #+ð #+ðL!  ^Ô 4ð !ð !ð !ð !ð !ð !ð !ð !r#   r‚   c                   óD   ‡ — e Zd ZdZddededdfˆ fd„Zd„ Zd	efd
„Z	ˆ xZ
S )ÚForLoopIndexingPatternaº  
    This pattern identifies if we use a for loop to index a tensor that
    can be vectorized.
    example:
    tensor = torch.empty((100, 100))
    for i in range(100):
        tensor[i] = i

    Pattern:
    aten::select | ... | aten::select | ... (Repeat)

    Algorithm:
    We start at node aten::select, and we check if we can find this alternating patterns.
    We also keep a dictionary to avoid duplicate match in the for loop.
    Fr   r   r   Nc                 óŽ   •— t          ¦   «                              ||¦  «         d| _        d| _        t	          ¦   «         | _        d S )NzFor Loop Indexing Patternz6For loop indexing detected. Vectorization recommended.)rz   r"   r   r   ÚsetÚvisitedr‰   s      €r!   r"   zForLoopIndexingPattern.__init__þ   s<   ø€ Ý‰Œ×Ò˜Ð/Ñ0Ô0Ð0Ø/ˆŒ	ØSˆÔÝ!$¡¤ˆŒˆˆr#   c              #   ó>   K  — t          | j        ¦  «        E d{V —† dS )zN
        We need to use BFS traversal order to avoid duplicate match.
        N)r
   r   r'   s    r!   r.   z)ForLoopIndexingPattern.eventTreeTraversal  s0   è è € õ   ¤Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0r#   r    c           
      ó0  — |j         dk    rdS |j        | j        v rdS d}|                      |¦  «        \  }}t	          |¦  «        dk    rdS dt
          fd„}t          |d„ ¦  «        }|€dS |g|d |…         z   }|t	          |¦  «        dz
  d …         }t          dt	          |¦  «        t	          |¦  «        ¦  «        D ]Q} |||||t	          |¦  «        z   …         ¦  «        r+|dz  }| j                             ||         j        ¦  «         ŒQ |dk    S )	Núaten::selectFr_   r   c                 ó    — t          | ¦  «        t          |¦  «        k    rdS t          | |d¬¦  «        D ]\  }}|j        |j        k    r dS ŒdS )NFT)Ústrict)r3   Úzipr   )Úlist1Úlist2Úop1Úop2s       r!   Úsame_opsz.ForLoopIndexingPattern.match.<locals>.same_ops  s`   € Ý�5‰zŒz�S ™ZœZÒ'Ð'Ø�uÝ  u°TÐ:Ñ:Ô:ð !ð !‘��SØ”8˜sœxÒ'Ð'Ø ˜5˜5ð (à�4r#   c                 ó   — | j         dk    S )Nr­   )r   ©Úes    r!   ú<lambda>z.ForLoopIndexingPattern.match.<locals>.<lambda>  s   € ¸q¼vÈÒ?W€ r#   r   r�   )	r   Úidrª   rb   r3   rt   r	   ÚrangeÚadd)	r   r    Úrepeat_countre   Únextrµ   Únext_select_idxÚindexing_opsÚis	            r!   rU   zForLoopIndexingPattern.match
  sR  € ØŒ:˜Ò'Ð'Ø�5ØŒ8�t”|Ð#Ð#Ø�5ØˆØ×"Ò" 5Ñ)Ô)‰ˆˆ4Ýˆt‰9Œ9˜Š>ˆ>Ø�5ð	¥dð 	ð 	ð 	ð 	õ /¨tÐ5WÐ5WÑXÔXˆØÐ"Ø�5Ø�w Ð&6 Ð&6Ô!7Ñ7ˆØ•C˜Ñ%Ô%¨Ñ)Ð+Ð+Ô,ˆÝ�q�#˜d™)œ)¥S¨Ñ%6Ô%6Ñ7Ô7ð 	ð 	ˆAØˆx˜ d¨1¨qµ3°|Ñ3DÔ3DÑ/DÐ+DÔ&EÑFÔFð Ø Ñ!�Ø”× Ò   a¤¤Ñ,Ô,Ð,Ð,àØ˜rÒ!Ð!r#   ro   )rp   rq   rr   rs   r   rt   r"   r.   r   rU   r   r€   s   @r!   r§   r§   í   s‹   ø€ € € € € ðð ð 'ð '˜Wð '¸ð 'Èð 'ð 'ð 'ð 'ð 'ð 'ð1ð 1ð 1ð"˜>ð "ð "ð "ð "ð "ð "ð "ð "r#   r§   c                   ó|   ‡ — e Zd Zddededdfˆ fd„Zeˆ fd„¦   «         Zdedefd	„Z	defd
„Z
dee         fd„Zˆ xZS )ÚFP32MatMulPatternFr   r   r   Nc                 óv   •— t          ¦   «                              ||¦  «         d| _        d| _        d| _        d S )NzFP32 MatMul Patternz|You are currently using GPU that supports TF32. Please enable TF32 by setting 'torch.backends.cuda.matmul.allow_tf32 = True'zUhttps://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices©rz   r"   r   r   r   r‰   s      €r!   r"   zFP32MatMulPattern.__init__-  sA   ø€ Ý‰Œ×Ò˜Ð/Ñ0Ô0Ð0Ø)ˆŒ	ð[ð 	Ôð kˆŒˆˆr#   c                 óÞ   •— t           j        j        �d}n5t          d„ t           j                             ¦   «         D ¦   «         ¦  «        }|du pt          ¦   «         j        p| j        j	         S )NFc              3   ód   K  — | ]+}t          t          j        d d|¦  «        ¦  «        dk    V — Œ,dS )zsm_|compute_r   éP   N)rL   r}   Úsub)rF   Úarchs     r!   rG   z)FP32MatMulPattern.skip.<locals>.<genexpr><  sQ   è è € ð ð àõ •B”F˜>¨2¨tÑ4Ô4Ñ5Ô5¸Ò;ðð ð ð ð ð r#   )
ÚtorchÚversionÚhipÚallÚcudaÚget_arch_listrz   r(   r   r�   )r   Úhas_tf32r{   s     €r!   r(   zFP32MatMulPattern.skip6  su   ø€ åŒ=ÔÐ(ØˆHˆHõ ð ð å!œJ×4Ò4Ñ6Ô6ðñ ô ñ ô ˆHð ˜5Ð ÐO¥E¡G¤G¤LÐO¸¼	Ô8OÐ4OÐOr#   r    c                 óð   — |j         t          j        k    rdS t          |j        t
          ¦  «        s)t          dt          |j        ¦  «        j        › �¦  «        ‚|j	        dk    r|j        j
        du rdS dS )NFú#expected _ExtraFields_TorchOp, got úaten::mmT)Útagr   ÚTorchOpÚ
isinstanceÚextra_fieldsr   r   Útyperp   r   Úallow_tf32_cublasrT   s     r!   rU   zFP32MatMulPattern.matchB  s‚   € àŒ9�
Ô*Ò*Ð*Ø�5Ý˜%Ô,Õ.BÑCÔCð 	Ý ØYµd¸5Ô;MÑ6NÔ6NÔ6WÐYÐYñô ð ð Œ:˜Ò#Ð#ØÔ!Ô3°uÐ<Ð<Ø�tØˆur#   c                 ó   — | j         S rC   )r   rT   s     r!   r,   zFP32MatMulPattern.reportO  s   € ØÔÐr#   r/   c                 óØ  — d„ |D ¦   «         }|D ]Ú}t          j        |d         dt           j        ¬¦  «        }t          j        |d         dt           j        ¬¦  «        }t          j        d||dœ¬¦  «        }t          j        dd	||dœ¬
¦  «        }dt           j        j        j        _        | 	                    d¦  «        j
        }| 	                    d¦  «        j
        }	|	|z  ||<   ŒÛ|S )Nc                 ó.   — i | ]}t          |¦  «        d “ŒS r•   r–   rE   s     r!   r—   z/FP32MatMulPattern.benchmark.<locals>.<dictcomp>S  r˜   r#   r   rÏ   ©ÚdeviceÚdtyper_   útorch.mm(matrixA, matrixB)©ÚmatrixAÚmatrixBrš   z,torch.backends.cuda.matmul.allow_tf32 = True)r›   Úsetuprœ   Fr�   )rË   ÚrandnÚfloat32r2   rž   ÚbackendsrÏ   ÚmatmulÚ
allow_tf32rŸ   r    )
r   r/   rJ   r¡   rã   rä   Ú
fp32_timerÚ
tf32_timerÚ	fp32_timeÚ	tf32_times
             r!   r2   zFP32MatMulPattern.benchmarkR  s  € ØJÐJÀ6ÐJÑJÔJÐØ&ð 	=ð 	=ˆEÝ”k %¨¤(°6ÅÄÐOÑOÔOˆGÝ”k %¨¤(°6ÅÄÐOÑOÔOˆGÝ"œØ1Ø$+¸Ð@Ð@ðñ ô ˆJõ #œØ1ØDØ$+¸Ð@Ð@ðñ ô ˆJð
 5:�EŒNÔÔ&Ô1Ø"×)Ò)¨"Ñ-Ô-Ô2ˆIØ"×)Ò)¨"Ñ-Ô-Ô2ˆIØ'0°9Ñ'<Ð˜eÑ$Ð$Ø Ð r#   ro   )rp   rq   rr   r   rt   r"   ru   r(   r   rU   r,   rv   r2   r   r€   s   @r!   rÃ   rÃ   ,  sè   ø€ € € € € ðkð k˜Wð k¸ð kÈð kð kð kð kð kð kð ð	Pð 	Pð 	Pð 	Pñ „Xð	Pð˜>ð ¨dð ð ð ð ð ˜Nð  ð  ð  ð  ð!  ^Ô 4ð !ð !ð !ð !ð !ð !ð !ð !r#   rÃ   c                   óB   ‡ — e Zd ZdZd
dededdfˆ fd„Zdedefd	„Zˆ xZ	S )ÚOptimizerSingleTensorPatterna{  
    This pattern identifies if we are using the single-tensor version of an optimizer.
    example:
    optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
    By adding foreach=True to enable multi-tensor optimizer, we can gain speedup when
    the kernels are relatively small.

    Pattern:
    XXXXX: _single_tensor_<OPTIMIZER_NAME>

    Algorithm:
    String match
    Fr   r   r   Nc                 óˆ   •— t          ¦   «                              ||¦  «         d| _        g d¢| _        d| _        d| _        d S )NzOptimizer Single Tensor Pattern)ÚadamÚsgdÚadamwz‘Detected optimizer running with single tensor implementation. Please enable multi tensor implementation by passing 'foreach=True' into optimizer.r   )rz   r"   r   Úoptimizers_with_foreachr   r   r‰   s      €r!   r"   z%OptimizerSingleTensorPattern.__init__v  sN   ø€ Ý‰Œ×Ò˜Ð/Ñ0Ô0Ð0Ø5ˆŒ	Ø'?Ð'?Ð'?ˆÔ$ðbð 	Ôð ˆŒˆˆr#   r    c                 óZ   — | j         D ]"}|j                             d|› �¦  «        r dS Œ#dS )NÚ_single_tensor_TF)rõ   r   Úendswith)r   r    Ú	optimizers      r!   rU   z"OptimizerSingleTensorPattern.match€  sF   € ØÔ5ð 	ð 	ˆIØŒz×"Ò"Ð#@°YÐ#@Ð#@ÑAÔAð Ø�t�tðàˆur#   ro   ©
rp   rq   rr   rs   r   rt   r"   r   rU   r   r€   s   @r!   rð   rð   g  sƒ   ø€ € € € € ðð ðð ˜Wð ¸ð Èð ð ð ð ð ð ð˜>ð ¨dð ð ð ð ð ð ð ð r#   rð   c                   óB   ‡ — e Zd ZdZd
dededdfˆ fd„Zdedefd	„Zˆ xZ	S )ÚSynchronizedDataLoaderPatterna  
    This pattern identifies if we are using num_workers=0 in DataLoader.
    example:
    torch.utils.data.DataLoader(dataset, batch_size=batch_size)
    Add num_workers=N to the arguments. N depends on system configuration.

    Pattern:
    dataloader.py(...): __iter__
        dataloader.py(...): _get_iterator
            NOT dataloader.py(...): check_worker_number_rationality

    Algorithm:
    If we don't see check_worker_number_rationality call in the dataloader __iter__,
    It is not an asynchronous dataloader.

    Fr   r   r   Nc                 óv   •— t          ¦   «                              ||¦  «         d| _        d| _        d| _        d S )NzSynchronized DataLoader Patternz�Detected DataLoader running with synchronized implementation. Please enable asynchronous dataloading by setting num_workers > 0 when initializing DataLoader.zjhttps://pytorch.org/tutorials/recipes/recipes/tuning_guide.html#enable-async-data-loading-and-augmentationrÅ   r‰   s      €r!   r"   z&SynchronizedDataLoaderPattern.__init__™  sC   ø€ Ý‰Œ×Ò˜Ð/Ñ0Ô0Ð0Ø5ˆŒ	ðnð 	Ôð
:ð 	Œˆˆr#   r    c                 ó"  — dt           dt           fd„}	 |j        }n# t          $ r Y dS w xY w ||j        d¦  «        sdS |j        sdS |j        d         } ||j        d¦  «        sdS |j        sdS |j        d         } ||j        d¦  «         S )	Nr   Úfunction_namec                 ó–   — |                       t          j                             dddd¦  «        ¦  «        o|                      |¦  «        S )NrË   ÚutilsÚdatazdataloader.py)Ú
startswithÚosÚpathÚjoinrø   )r   rÿ   s     r!   Úis_dataloader_functionzCSynchronizedDataLoaderPattern.match.<locals>.is_dataloader_function¦  sC   € Ø—?’?Ý”—’˜W g¨v°ÑGÔGñô ð /à—-’- Ñ.Ô.ð/r#   FÚ__iter__r   Ú_get_iteratorÚcheck_worker_number_rationality)rM   r   ÚUnicodeDecodeErrorr`   )r   r    r  re   s       r!   rU   z#SynchronizedDataLoaderPattern.match¥  sÝ   € ð	/­ð 	/½Sð 	/ð 	/ð 	/ð 	/ð	Ø”
ˆAˆAøÝ!ð 	ð 	ð 	Ø�5�5ð	øøøð &Ð% e¤j°*Ñ=Ô=ð 	Ø�5ØŒ~ð 	Ø�5Ø”˜qÔ!ˆØ%Ð% e¤j°/ÑBÔBð 	Ø�5ØŒ~ð 	Ø�5Ø”˜qÔ!ˆØ)Ð)¨%¬*Ð6WÑXÔXÐXÐXs   ” œ
*©*ro   rú   r€   s   @r!   rü   rü   ‡  s�   ø€ € € € € ðð ð"

ð 

˜Wð 

¸ð 

Èð 

ð 

ð 

ð 

ð 

ð 

ðY˜>ð Y¨dð Yð Yð Yð Yð Yð Yð Yð Yr#   rü   c                   óB   ‡ — e Zd ZdZd
dededdfˆ fd„Zdedefd	„Zˆ xZ	S )ÚGradNotSetToNonePatterna�  
    This pattern identifies if we are not setting grad to None in zero_grad.
    example:
    optimizer.zero_grad()
    By setting set_to_none=True, we can gain speedup

    Pattern:
    XXXXX: _zero_grad
        NOT aten::zeros
            aten::zero_

    aten::zero_ is called on each parameter in the model.
    We also want to make sure it is not called by aten::zeros.

    Algorithm:
    String match
    Fr   r   r   Nc                 óv   •— t          ¦   «                              ||¦  «         d| _        d| _        d| _        d S )Nz,Gradient Set To Zero Instead of None PatternzfDetected gradient set to zero instead of None. Please add 'set_to_none=True' when calling zero_grad().zxhttps://pytorch.org/tutorials/recipes/recipes/tuning_guide.html#disable-gradient-calculation-for-validation-or-inferencerÅ   r‰   s      €r!   r"   z GradNotSetToNonePattern.__init__Ô  sD   ø€ Ý‰Œ×Ò˜Ð/Ñ0Ô0Ð0ØBˆŒ	ðFð 	Ôð
Hð 	Œˆˆr#   r    c                 óº   — |j                              d¦  «        sdS |j        sdS t          |j        ¦  «        D ] }|j         dk    r|j        j         dk    r dS Œ!dS )Nz: zero_gradFr‡   zaten::zerosT)r   rø   r`   r   r\   )r   r    Ú	sub_events      r!   rU   zGradNotSetToNonePattern.matchà  sr   € ØŒz×"Ò" =Ñ1Ô1ð 	Ø�5ØŒ~ð 	Ø�5å% e¤nÑ5Ô5ð 	ð 	ˆIà” -Ò/Ð/ØÔ$Ô)¨]Ò:Ð:à�t�tøàˆur#   ro   rú   r€   s   @r!   r  r  Á  sƒ   ø€ € € € € ðð ð$

ð 

˜Wð 

¸ð 

Èð 

ð 

ð 

ð 

ð 

ð 

ð˜>ð ¨dð ð ð ð ð ð ð ð r#   r  c                   óX   ‡ — e Zd ZdZddededdfˆ fd„Zeˆ fd„¦   «         Zd	e	fd
„Z
ˆ xZS )Ú&Conv2dBiasFollowedByBatchNorm2dPatternau  
    This pattern identifies if we are enabling bias in Conv2d which is followed by BatchNorm2d.
    Bias doesn't do anything when followed by batchnorm.
    Pattern:
    nn.Module: Conv2d            | nn.Module: BatchNorm2d
        ...
            aten::conv2d AND dtype of third argument is not null
    The third argument is the bias
    Algorithm:
    String match
    Fr   r   r   Nc                 óv   •— t          ¦   «                              ||¦  «         d| _        d| _        d| _        d S )Nz5Enabling Bias in Conv2d Followed By BatchNorm PatternzcDetected bias enabled in Conv2d that is followed by BatchNorm2d. Please set 'bias=False' in Conv2d.zhttps://pytorch.org/tutorials/recipes/recipes/tuning_guide.html#disable-bias-for-convolutions-directly-followed-by-a-batch-normrÅ   r‰   s      €r!   r"   z/Conv2dBiasFollowedByBatchNorm2dPattern.__init__ý  sA   ø€ Ý‰Œ×Ò˜Ð/Ñ0Ô0Ð0ØKˆŒ	ð AˆÔðOð 	Œˆˆr#   c                 óF   •— | j         j        du pt          ¦   «         j        S r%   )r   r�   rz   r(   )r   r{   s    €r!   r(   z+Conv2dBiasFollowedByBatchNorm2dPattern.skip  s   ø€ àŒyÔ&¨%Ð/Ð?µ5±7´7´<Ð?r#   r    c                 ó&  — |j         dk    rdS t          t          |¦  «        ¦  «        dk     st          |¦  «        d         €dS |                      |d„ ¦  «        }|sdS |                      |¦  «        }|sdS |j                              d¦  «        S )Nzaten::conv2dFé   rK   c                 ó6   — | j                              d¦  «        S )Nznn.Module: Conv2d)r   r  r·   s    r!   r¹   z>Conv2dBiasFollowedByBatchNorm2dPattern.match.<locals>.<lambda>  s   € ˜QœV×.Ò.Ð/BÑCÔC€ r#   znn.Module: BatchNorm2d)r   r3   r�   rn   rg   r  rT   s     r!   rU   z,Conv2dBiasFollowedByBatchNorm2dPattern.match
  s¨   € ØŒ:˜Ò'Ð'Ø�5Ý�|˜EÑ"Ô"Ñ#Ô# aÒ'Ð'­<¸Ñ+>Ô+>¸qÔ+AÐ+IØ�5à× Ò ØÐCÐCñ
ô 
ˆð ð 	Ø�5Ø—’˜UÑ#Ô#ˆØð 	Ø�5ØŒz×$Ò$Ð%=Ñ>Ô>Ð>r#   ro   )rp   rq   rr   rs   r   rt   r"   ru   r(   r   rU   r   r€   s   @r!   r  r  ð  s¦   ø€ € € € € ð
ð 
ð
ð 
˜Wð 
¸ð 
Èð 
ð 
ð 
ð 
ð 
ð 
ð ð@ð @ð @ð @ñ „Xð@ð?˜>ð ?ð ?ð ?ð ?ð ?ð ?ð ?ð ?r#   r  c                   ór   ‡ — e Zd Zddededdfˆ fd„Zedefd„¦   «         Zdedefd	„Z	d
e
e         fd„Zˆ xZS )ÚMatMulDimInFP16PatternFr   r   r   Nc                 óv   •— t          ¦   «                              ||¦  «         d| _        d| _        d| _        d S )Nz3Matrix Multiplication Dimension Not Aligned PatternzUDetected matmul with dimension not aligned. Please use matmul with aligned dimension.z[https://pytorch.org/tutorials/recipes/recipes/tuning_guide.html#use-mixed-precision-and-amprÅ   r‰   s      €r!   r"   zMatMulDimInFP16Pattern.__init__  s8   ø€ Ý‰Œ×Ò˜Ð/Ñ0Ô0Ð0ØIˆŒ	ØrˆÔØpˆŒˆˆr#   c                 ó6   — | j         j         p| j         j         S rC   r‹   r'   s    r!   r(   zMatMulDimInFP16Pattern.skip"  rŽ   r#   r    c                 óØ   — d„ }|j         dvrdS t          |¦  «        sdS t          |¦  «        d         }|t          j        t          j        fv r |t          |¦  «        d¦  «        sdS dS )Nc                 ó:   ‡— t          ˆfd„| D ¦   «         ¦  «        S )Nc              3   óD   •K  — | ]}|d d…         D ]}|‰z  dk    V — ŒŒdS )éþÿÿÿNr   r&   )rF   r¡   ÚdimÚmultiples      €r!   rG   zCMatMulDimInFP16Pattern.match.<locals>.mutiple_of.<locals>.<genexpr>(  sD   øè è € ÐUÐU¨uÈ%ÐPRÐPSÐPSÌ*ÐUÐUÀ3�s˜X‘~¨Ò*ÐUÐUÐUÐUÐUÐUÐUr#   )rÎ   ©Úshapesr!  s    `r!   Ú
mutiple_ofz0MatMulDimInFP16Pattern.match.<locals>.mutiple_of'  s&   ø€ ÝÐUÐUÐUÐU¸ÐUÑUÔUÑUÔUÐUr#   )rÔ   z	aten::bmmzaten::addmmFr   é   T)r   r�   rË   Úbfloat16ÚhalfrI   )r   r    r$  Ú	arg_dtypes       r!   rU   zMatMulDimInFP16Pattern.match&  sŽ   € ð	Vð 	Vð 	Vð Œ:ÐEÐEÐEØ�5Ý˜EÑ"Ô"ð 	Ø�5Ý  Ñ'Ô'¨Ô*ˆ	Ø�œ­¬Ð4Ð4Ð4¸Z¸ZÝ˜ÑÔ ñ>
ô >
Ð4ð �4Øˆur#   r/   c                 ón  — d„ }d„ |D ¦   «         }|D �]!}t          j        |d         dt           j        ¬¦  «        }t          j        |d         dt           j        ¬¦  «        }t          j        d||dœ¬	¦  «        }t          j         ||d         d
¦  «        dt           j        ¬¦  «        }t          j         ||d         d
¦  «        dt           j        ¬¦  «        }t          j        d||dœ¬	¦  «        }|                     d¦  «        j        }	|                     d¦  «        j        }
|
|	z  ||<   �Œ#|S )Nc                 ó    ‡— ˆfd„| D ¦   «         S )Nc                 óD   •— g | ]}‰t          j        |‰z  ¦  «        z  ‘ŒS r&   )ÚmathÚceil)rF   r¡   r!  s     €r!   rX   zNMatMulDimInFP16Pattern.benchmark.<locals>.closest_multiple.<locals>.<listcomp>7  s-   ø€ ÐOÐOÐO¸u�H�tœy¨°Ñ)9Ñ:Ô:Ñ:ÐOÐOÐOr#   r&   r"  s    `r!   Úclosest_multiplez:MatMulDimInFP16Pattern.benchmark.<locals>.closest_multiple6  s   ø€ ØOÐOÐOÐOÈÐOÑOÔOÐOr#   c                 ó.   — i | ]}t          |¦  «        d “ŒS r•   r–   rE   s     r!   r—   z4MatMulDimInFP16Pattern.benchmark.<locals>.<dictcomp>9  r˜   r#   r   rÏ   rÞ   r_   rá   râ   rš   r%  r�   )rË   ræ   Úfloat16r2   rž   rŸ   r    )r   r/   r.  rJ   r¡   rã   rä   Únot_aligned_dim_timerÚaligned_dim_timerÚnot_aligned_dim_timeÚaligned_dim_times              r!   r2   z MatMulDimInFP16Pattern.benchmark5  sn  € ð	Pð 	Pð 	Pð KÐJÀ6ÐJÑJÔJÐØ&ð 	Oñ 	OˆEÝ”k %¨¤(°6ÅÄÐOÑOÔOˆGÝ”k %¨¤(°6ÅÄÐOÑOÔOˆGÝ$-¤OØ1Ø$+¸Ð@Ð@ð%ñ %ô %Ð!õ ”kØ Ð   q¤¨1Ñ-Ô-°fÅEÄMðñ ô ˆGõ ”kØ Ð   q¤¨1Ñ-Ô-°fÅEÄMðñ ô ˆGõ !*¤Ø1Ø$+¸Ð@Ð@ð!ñ !ô !Ðð $9×#?Ò#?ÀÑ#CÔ#CÔ#HÐ Ø0×7Ò7¸Ñ;Ô;Ô@ÐØ'7Ð:NÑ'NÐ˜eÑ$Ñ$Ø Ð r#   ro   )rp   rq   rr   r   rt   r"   ru   r(   r   rU   rv   r2   r   r€   s   @r!   r  r    sÏ   ø€ € € € € ðqð q˜Wð q¸ð qÈð qð qð qð qð qð qð ðG�dð Gð Gð Gñ „XðGð˜>ð ¨dð ð ð ð ð!  ^Ô 4ð !ð !ð !ð !ð !ð !ð !ð !r#   r  r    r   c                 ó°  — | rÓ| j         t          j        k    s| j         t          j        k    r t	          | j        t          t          f¦  «        s)t          dt          | j        ¦  «        j
        › �¦  «        ‚| j        j        j                             dt          j        z   ¦  «        s%| j        j        j        › d| j        j        j        › �S | j        } | °ÓdS )Nz:expected _ExtraFields_PyCall or _ExtraFields_PyCCall, got rË   ú:zNo source code location found)rÕ   r   ÚPyCallÚPyCCallr×   rØ   r   r   r   rÙ   rp   ÚcallerÚ	file_namer  r  ÚsepÚline_numberr\   ©r    s    r!   r*   r*   Q  sæ   € Ø
ð ØŒ9�
Ô)Ò)Ð)¨U¬Y½*Ô:LÒ-LÐ-LÝØÔ"Õ%8Õ:NÐ$Oñô ð õ %ð?Ý Ô 2Ñ3Ô3Ô<ð?ð ?ñô ð ð Ô%Ô,Ô6×AÒAÀ'ÍBÌFÑBRÑSÔSð hØÔ,Ô3Ô=ÐgÐgÀÔ@RÔ@YÔ@eÐgÐgÐgØ”ˆð ð ð +Ð*r#   c                 óÎ   — t          | j        t          ¦  «        s)t          dt	          | j        ¦  «        j        › �¦  «        ‚t          d„ | j        j        D ¦   «         ¦  «        S )NrÓ   c              3   óR   K  — | ]"}t          t          |d d¦  «        ¦  «        V — Œ#dS )Úsizesr&   N)ÚtupleÚgetattr©rF   rÁ   s     r!   rG   zinput_shapes.<locals>.<genexpr>f  s6   è è € ÐSÐS°A••w˜q '¨2Ñ.Ô.Ñ/Ô/ÐSÐSÐSÐSÐSÐSr#   ©r×   rØ   r   r   rÙ   rp   rA  Úinputsr=  s    r!   rI   rI   a  sh   € Ý�eÔ(Õ*>Ñ?Ô?ð 
ÝØUµ$°uÔ7IÑ2JÔ2JÔ2SÐUÐUñ
ô 
ð 	
õ ÐSÐS¸Ô9KÔ9RÐSÑSÔSÑSÔSÐSr#   c                 óÎ   — t          | j        t          ¦  «        s)t          dt	          | j        ¦  «        j        › �¦  «        ‚t          d„ | j        j        D ¦   «         ¦  «        S )NrÓ   c              3   ó8   K  — | ]}t          |d d¦  «        V — ŒdS )rà   N)rB  rC  s     r!   rG   zinput_dtypes.<locals>.<genexpr>n  s.   è è € ÐNÐN¨q•˜˜G TÑ*Ô*ÐNÐNÐNÐNÐNÐNr#   rD  r=  s    r!   r�   r�   i  sh   € Ý�eÔ(Õ*>Ñ?Ô?ð 
ÝØUµ$°uÔ7IÑ2JÔ2JÔ2SÐUÐUñ
ô 
ð 	
õ ÐNÐN°EÔ4FÔ4MÐNÑNÔNÑNÔNÐNr#   FTr   Úprint_enableÚjson_report_dirc           
      óˆ  — i }t          | |¦  «        t          | |¦  «        t          | |¦  «        t          | |¦  «        t	          | |¦  «        t          | |¦  «        t          | |¦  «        g}t          ¦   «         }g }d› dd› �g}|                     d¦  «         |D ]ø}	|	 	                    ¦   «         }
|
sŒ|                     |	 
                    |
¦  «        ¦  «         |
D ]´}|	                     |¦  «        }||vr™|                     |¦  «         |                     |¦  «         t          |¦  «                             d¦  «        \  }}|                     |g ¦  «                             t!          |¦  «        |	j        |	j        |	j        dœ¦  «         ŒµŒù|�Ðt(          j                             |d¦  «        }t(          j                             |¦  «        rRt1          |¦  «        5 }t3          j        |¦  «        }|                     |¦  «         |}d d d ¦  «         n# 1 swxY w Y   t1          |d¦  «        5 }t3          j        ||d¬	¦  «         d d d ¦  «         n# 1 swxY w Y   |                     d
¦  «         ||z  }|                     d› dd› �¦  «         |r$t;          d                     |¦  «        ¦  «         d S d S )Nz(----------------------------------------zTorchTidy ReportzMatched Events:r6  )r<  r   r   Úmessageztorchtidy_report.jsonÚwé   )ÚindentzSummary:ú
)r‚   rÃ   rð   rü   r  r  r  r©   r   rY   r7   r,   r¼   r*   Úsplitr   rL   r   r   r   r  r  r  ÚexistsÚopenÚjsonÚloadÚupdateÚdumpÚprint)r   r   rH  rI  Úreport_dictÚanti_patternsÚreportedÚ	summariesÚmessage_listÚanti_patternrY   r    Ú
report_msgÚsrc_locationÚline_noÚjson_report_pathÚfÚexisiting_reports                     r!   Úreport_all_anti_patternsrd  q  sn  € ð €Kå˜TÐ#3Ñ4Ô4å˜$Ð 0Ñ1Ô1Ý$ TÐ+;Ñ<Ô<Ý% dÐ,<Ñ=Ô=Ý Ð&6Ñ7Ô7Ý.¨tÐ5EÑFÔFÝ˜tÐ%5Ñ6Ô6ð	€Mõ ‰uŒu€HØ€IØÐ;Ð;°Ð;Ð;Ð<€LØ×ÒÐ)Ñ*Ô*Ð*à%ð ð ˆØ%×4Ò4Ñ6Ô6ˆØð 	ØØ×Ò˜×-Ò-¨nÑ=Ô=Ñ>Ô>Ð>Ø#ð 	ð 	ˆEØ%×,Ò,¨UÑ3Ô3ˆJØ Ð)Ð)Ø×#Ò# JÑ/Ô/Ð/Ø—’˜ZÑ(Ô(Ð(Ý(<¸UÑ(CÔ(C×(IÒ(IÈ#Ñ(NÔ(NÑ%�˜gØ×&Ò& |°RÑ8Ô8×?Ò?å'*¨7¡|¤|Ø ,Ô 1Ø+Ô/Ø#/Ô#;ð	ð ñô ð øð	ð Ð"Ýœ7Ÿ<š<¨Ð9PÑQÔQÐÝŒ7�>Š>Ð*Ñ+Ô+ð 	/ÝÐ&Ñ'Ô'ð /¨1Ý#'¤9¨Q¡<¤<Ð Ø ×'Ò'¨Ñ4Ô4Ð4Ø.�ð/ð /ð /ñ /ô /ð /ð /ð /ð /ð /ð /øøøð /ð /ð /ð /õ Ð" CÑ(Ô(ð 	0¨AÝŒI�k 1¨QÐ/Ñ/Ô/Ð/ð	0ð 	0ð 	0ñ 	0ô 	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0øøøð 	0ð 	0ð 	0ð 	0ð ×Ò˜
Ñ#Ô#Ð#Ø�IÑ€LØ×Ò˜8Ð?Ð?°XÐ?Ð?Ñ@Ô@Ð@Øð 'Ýˆd�iŠi˜Ñ%Ô%Ñ&Ô&Ð&Ð&Ð&ð'ð 's$   Ç&,HÈH"È%H"È9IÉI!É$I!)FTN)$rS  r,  r  r}   rË   Útorch.utils.benchmarkr  r2   Útorch._C._profilerr   r   r   r   r   Útorch.profilerr   Útorch.profiler._utilsr	   r
   r   r   rx   r‚   r§   rÃ   rð   rü   r  r  r  rM   r*   rI   r�   rt   rd  r&   r#   r!   ú<module>ri     sG  ðà €€€Ø €€€Ø 	€	€	€	Ø 	€	€	€	à €€€Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )ðð ð ð ð ð ð ð ð ð ð ð ð ð ð #Ð "Ð "Ð "Ð "Ð "Ø RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ Rðpð pð pð pð pñ pô pð pðl	<ð 	<ð 	<ð 	<ð 	<�'ñ 	<ô 	<ð 	<ðT!ð T!ð T!ð T!ð T!˜7ñ T!ô T!ð T!ðn<"ð <"ð <"ð <"ð <"˜Wñ <"ô <"ð <"ð~8!ð 8!ð 8!ð 8!ð 8!˜ñ 8!ô 8!ð 8!ðvð ð ð ð  7ñ ô ð ð@6Yð 6Yð 6Yð 6Yð 6Y Gñ 6Yô 6Yð 6Yðt,ð ,ð ,ð ,ð ,˜gñ ,ô ,ð ,ð^(?ð (?ð (?ð (?ð (?¨Wñ (?ô (?ð (?ðV3!ð 3!ð 3!ð 3!ð 3!˜Wñ 3!ô 3!ð 3!ðl+ °Ñ 5ð +¸#ð +ð +ð +ð +ð T˜ð Tð Tð Tð TðO˜ð Oð Oð Oð Oð #ØØ"&ð	8'ð 8'àð8'ð ð8'ð ˜4‘Zð	8'ð
 
ð8'ð 8'ð 8'ð 8'ð 8'ð 8'r#   