Ë
    g^(h‡^  ã                   ó  — d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZ ddlmZmZ ddlmZmZmZ ddlZddlmc mZ ddlmZ ddlmZ dZ ed«      Z ed	«      Z ed
«      Z e!Z"e!Z#e!Z$e!Z% ejL                  e'«      Z( ejR                  d«      Z* G d„ dejV                  «      Z,e G d„ d«      «       Z- G d„ de.«      Z/ G d„ de/«      Z0 G d„ de.«      Z1e G d„ d«      «       Z2 G d„ d«      Z3 G d„ d«      Z4 G d„ d«      Z5de6eef   de6ee f   d ee7eee f      fd!„Z8d"ejr                  d#e7ed$f   d%e6e:ef   d ee7ejv                  ef      fd&„Z< G d'„ d(«      Z= G d)„ d*e«      Z> G d+„ d,«      Z?d-„ Z@ e?«       ZAy).a  
This module introduces CUDA Sanitizer, a tool for detecting synchronization errors between kernels ran on different streams.

It stores information on accesses to tensors to determine if they are synchronized
or not. When enabled in a python program and a possible data race is detected, a
detailed warning will be printed and the program will exit.

It can be enabled either by importing this module and calling
:func:`enable_cuda_sanitizer()` or by exporting the ``TORCH_CUDA_SANITIZER``
environment variable.
é    N)ÚIterator)Ú	dataclassÚfield)ÚAnyÚOptionalÚTypeVar)Ú_pytree)ÚTorchDispatchModeÚTKÚTVaÚTVbz(new_.*|.*_like)c                   óV   — e Zd Z ej                  «       Z ej                  «       Zd„ Zy)Ú
AccessTypec                 ó.   — | t         j                  u rdS dS )Nzreading fromz
writing to)r   ÚREAD©Úselfs    úS/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/cuda/_sanitizer.pyÚ__str__zAccessType.__str__7   s   € Ø!%¬¯©Ñ!8ˆ~ÐJ¸lÐJó    N)Ú__name__Ú
__module__Ú__qualname__ÚenumÚautor   ÚWRITEr   © r   r   r   r   3   s"   „ Øˆ4�9‰9‹;€DØˆD�I‰I‹K€EóKr   r   c                   ór   — e Zd ZU dZeed<   eed<   eed<   eed<   e	e   ed<   e
ed<   ej                  ed<   y	)
ÚAccessaW  Stores information about a single access to a tensor by a kernel.

    Args:
        type: either AccessType.READ or AccessType.Write.
        seq_num: the sequential number of the kernel performing the access.
        stream: the stream id of the stream executing the kernel.
        operator: the schema of the launched kernel, which lists the
            arguments and return type.
        aliases: the arguments in the schema this access corresponds to.
        is_output: Whether the tensor was an output of the kernel.
        stack_trace: the stack summary object captured during access.
    ÚtypeÚseq_numÚstreamÚoperatorÚaliasesÚ	is_outputÚstack_traceN)r   r   r   Ú__doc__r   Ú__annotations__ÚSeqNumÚStreamIdÚstrÚlistÚboolÚ	tracebackÚStackSummaryr   r   r   r   r   ;   s:   … ñð ÓØƒOØÓØƒMØ�#‰YÓØƒOØ×'Ñ'Ô'r   r   c                   ó   — e Zd ZdZy)ÚSynchronizationErrorz1Base class for errors detected by CUDA Sanitizer.N)r   r   r   r'   r   r   r   r1   r1   S   s   „ Ú;r   r1   c                   óH   — e Zd ZdZdedeej                     dedefd„Z	d„ Z
y)	ÚUnsynchronizedAccessErrorzIStores information about two unsynchronized accesses to one data pointer.Údata_ptrÚallocation_stack_traceÚcurrent_accessÚprevious_accessc                 ó<   — || _         || _        || _        || _        y ©N)r4   r5   r6   r7   )r   r4   r5   r6   r7   s        r   Ú__init__z"UnsynchronizedAccessError.__init__Z   s#   € ð !ˆŒØ&<ˆÔ#Ø,ˆÔØ.ˆÕr   c           
      ón  ‡— dt         fˆfd„}t        j                  «       5 Š‰j                  t	        j
                  d| j                  › d| j                  j                  › d�«      «        || j                  «       ‰j                  d| j                  j                  › d�«        || j                  «       | j                  r<‰j                  dd	j                  | j                  j                  «       «      › �«       n‰j                  d
«       ‰j                  «       cd d d «       S # 1 sw Y   y xY w)NÚaccessc                 ó¸  •— ‰j                  | j                  › d| j                  › �«       | j                  rJ‰j                  ddj	                  | j                  «      z   «       | j
                  r‰j                  d«       | j
                  r‰j                  d«       ‰j                  ddj	                  | j                  j                  «       «      › d�«       y )Nú
z argument(s) z, z, and toz the outputz
With stack trace:
Ú )Úwriter#   r    r$   Újoinr%   r&   Úformat)r<   Úmessages    €r   Úformat_accessz8UnsynchronizedAccessError.__str__.<locals>.format_accessg   s£   ø€ Ø�M‰M˜VŸ_™_Ð-¨R°·±¨}Ð=Ô>Ø�~Š~Ø—‘˜o°·	±	¸&¿.¹.Ó0IÑIÔJØ×#Ò#Ø—M‘M *Ô-Ø×ÒØ—‘˜mÔ,Ø�M‰MØ'¨¯©°×0BÑ0B×0IÑ0IÓ0KÓ(LÐ'MÈRÐPõr   z„                    ============================
                    CSAN detected a possible data race on tensor with data pointer z&
                    Access by stream z$ during kernel:
                    zPrevious access by stream z during kernel:
z'Tensor was allocated with stack trace:
r?   z&Trace for tensor allocation not found.)r   ÚioÚStringIOr@   ÚtextwrapÚdedentr4   r6   r"   r7   r5   rA   rB   Úgetvalue)r   rD   rC   s     @r   r   z!UnsynchronizedAccessError.__str__f   s  ø€ ð
	¤&õ 
	ô �[‰[‹]ð 	&˜gØ�M‰MÜ—‘ðTàTX×TaÑTaÐSbð c&Ø&*×&9Ñ&9×&@Ñ&@Ð%Að Bðóôñ ˜$×-Ñ-Ô.à�M‰MØ,¨T×-AÑ-A×-HÑ-HÐ,IÐIZÐ[ôñ ˜$×.Ñ.Ô/à×*Ò*Ø—‘Ø>Ø—w‘w˜t×:Ñ:×AÑAÓCÓDÐEðGõð
 —‘ÐFÔGØ×#Ñ#Ó%÷1	&÷ 	&ò 	&ús   ¢C?D+Ä+D4N)r   r   r   r'   ÚDataPtrr   r.   r/   r   r:   r   r   r   r   r3   r3   W   s@   „ ÙSð
/àð
/ð !)¨×)?Ñ)?Ñ @ð
/ð ð	
/ð
  ó
/ó%&r   r3   c                   ó(   — e Zd ZdZdee   fd„Zd„ Zy)ÚCUDASanitizerErrorsz4Wrapper class for errors reported by CUDA Sanitizer.Úerrorsc                 ó   — || _         y r9   )rM   )r   rM   s     r   r:   zCUDASanitizerErrors.__init__‘   s	   € Øˆ�r   c                 ó4   — dt        | j                  «      › d�S )Nz	detected z errors)ÚlenrM   r   s    r   r   zCUDASanitizerErrors.__str__”   s   € Øœ3˜tŸ{™{Ó+Ð,¨GÐ4Ð4r   N)r   r   r   r'   r,   r1   r:   r   r   r   r   rL   rL   Ž   s   „ Ù>ð˜tÐ$8Ñ9ó ó5r   rL   c                   ól   — e Zd ZU dZeej                     ed<    ee	¬«      Z
e	e   ed<   dZee   ed<   y)Ú
TensorInfoa‘  Stores information about a single tensor and recent accesses to it.

    Args:
        allocation_stack_trace: the stack summary object captured during tensor
            allocation. Can be ``None`` if the allocation wasn't caught by CSAN.
        reads: list of read accesses to the tensor that were performed since
            the last write.
        write: the last write access to the tensor.
    r5   )Údefault_factoryÚreadsNr@   )r   r   r   r'   r   r.   r/   r(   r   r,   rT   r   r@   r   r   r   rR   rR   ˜   s<   … ñð % Y×%;Ñ%;Ñ<Ó<Ù°Ô5€Eˆ4�‰<Ó5Ø"€Eˆ8�FÑÔ"r   rR   c                   ó   — e Zd Zdd„Zdeddfd„Zdeddfd„Zdedeej                     ddfd„Z
deddfd	„Zdedefd
„Zdedeej                     fd„Zdedee   fd„Zdedee   fd„Zdededdfd„Zdededdfd„Zy)Ú_TensorsAccessedÚreturnNc                 ó   — i | _         y r9   ©Úaccessesr   s    r   r:   z_TensorsAccessed.__init__ª   s	   € Ø35ˆ�r   r4   c                 ór   — || j                   vr)t        j                  d|«       | j                  |d «       y y )Nz¨Found tensor with pointer: %s, but no matching tensor allocation in the trace. Backfilling the trace now. Perhaps the sanitizer was enabled after some torch operations?)rZ   ÚloggerÚinfoÚcreate_tensor©r   r4   s     r   Úensure_tensor_existsz%_TensorsAccessed.ensure_tensor_exists­   s<   € Ø˜4Ÿ=™=Ñ(Ü�K‰KðQð ô	ð ×Ñ˜x¨Õ.ð )r   c                 óp   — || j                   v r(t        j                  d|«       | j                  |«       y y )NzÛFound duplicate tensor allocation in the trace for tensor with pointer: %s. Assuming the trace for tensor deallocation wasn't caught and backfilling it now. Perhaps the sanitizer was enabled after some torch operations?)rZ   r\   r]   Údelete_tensorr_   s     r   Úensure_tensor_does_not_existz-_TensorsAccessed.ensure_tensor_does_not_exist·   s:   € Ø�t—}‘}Ñ$Ü�K‰KðQð ôð ×Ñ˜xÕ(ð %r   r&   c                 ó4   — t        |«      | j                  |<   y r9   )rR   rZ   ©r   r4   r&   s      r   r^   z_TensorsAccessed.create_tensorÂ   s   € ô #-¨[Ó"9ˆ�‰�hÒr   c                 ó   — | j                   |= y r9   rY   r_   s     r   rb   z_TensorsAccessed.delete_tensorÇ   s   € Ø�M‰M˜(Ñ#r   c                 ó<   — | j                   |   j                  rdS dS )NTF©rZ   rT   r_   s     r   Ú!were_there_reads_since_last_writez2_TensorsAccessed.were_there_reads_since_last_writeÊ   s   € Ø—}‘} XÑ.×4Ò4ˆtÐ?¸%Ð?r   c                 ó4   — | j                   |   j                  S r9   )rZ   r5   r_   s     r   Úget_allocation_stack_tracez+_TensorsAccessed.get_allocation_stack_traceÍ   s   € ð �}‰}˜XÑ&×=Ñ=Ð=r   c                 ó4   — | j                   |   j                  S r9   )rZ   r@   r_   s     r   Ú	get_writez_TensorsAccessed.get_writeÒ   ó   € Ø�}‰}˜XÑ&×,Ñ,Ð,r   c                 ó4   — | j                   |   j                  S r9   rh   r_   s     r   Ú	get_readsz_TensorsAccessed.get_readsÕ   rn   r   r<   c                 óT   — | j                   |   j                  j                  |«       y r9   )rZ   rT   Úappend©r   r4   r<   s      r   Úadd_readz_TensorsAccessed.add_readØ   s   € Ø�‰�hÑ×%Ñ%×,Ñ,¨VÕ4r   c                 óT   — || j                   |   _        g | j                   |   _        y r9   )rZ   r@   rT   rs   s      r   Ú	set_writez_TensorsAccessed.set_writeÛ   s$   € Ø(.ˆ�‰�hÑÔ%Ø(*ˆ�‰�hÑÕ%r   ©rW   N)r   r   r   r:   rJ   r`   rc   r   r.   r/   r^   rb   r-   ri   rk   r   rm   r,   rp   rt   rv   r   r   r   rV   rV   ©   s  „ ó6ð/¨Wð /¸ó /ð	)°Wð 	)Àó 	)ð:Øð:Ø.6°y×7MÑ7MÑ.Nð:à	ó:ð
$ gð $°$ó $ð@¸'ð @Àdó @ð>Øð>à	�)×(Ñ(Ñ	)ó>ð
- 'ð -¨h°vÑ.>ó -ð- 'ð -¨d°6©ló -ð5 ð 5°&ð 5¸Tó 5ð+ 'ð +°6ð +¸dô +r   rV   c                   ó  — e Zd Zdd„Zdeddfd„Zdeddfd„Zdeddfd„Zdeddfd	„Z	deddfd
„Z
deddfd„Zdededdfd„Zdededdfd„Zdeeef   deeef   ddfd„Zdededdfd„Zdeddfd„Zdeddfd„Zdd„Zdedededefd„Zy)ÚStreamSynchronizationsrW   Nc                 óX   — i | _         i | _        i | _        | j                  t        «       y r9   )Úcurrent_sync_statesÚrecorded_sync_statesÚhost_sync_stateÚcreate_streamÚDEFAULT_STREAM_IDr   s    r   r:   zStreamSynchronizations.__init__á   s)   € ØKMˆÔ ØKMˆÔ!Ø79ˆÔØ×ÑÔ,Õ-r   r"   c                 óp   — || j                   vr(t        j                  d|«       | j                  |«       y y )Nz¡Found Stream with id: %s, but no matching stream creation in the trace. Backfilling the trace now. Perhaps the sanitizer was enabled after some torch operations?)r{   r\   r]   r~   ©r   r"   s     r   Ú_ensure_stream_existsz,StreamSynchronizations._ensure_stream_existsç   s<   € Ø˜×1Ñ1Ñ1Ü�K‰KðQð ô	ð ×Ñ˜vÕ&ð 2r   Úeventc                 óp   — || j                   vr(t        j                  d|«       | j                  |«       y y )NzŸFound Event with id: %s, but no matching event creation in the trace. Backfilling the trace now. Perhaps the sanitizer was enabled after some torch operations?)r|   r\   r]   Úcreate_event©r   rƒ   s     r   Ú_ensure_event_existsz+StreamSynchronizations._ensure_event_existsñ   s<   € Ø˜×1Ñ1Ñ1Ü�K‰KðQð ô	ð ×Ñ˜eÕ$ð 2r   c                 óp   — || j                   v r(t        j                  d|«       | j                  |«       y y )NzÍFound duplicate event creation in the trace for event with id: %s. Assuming the trace for event deletion wasn't caught and backfilling it now. Perhaps the sanitizer was enabled after some torch operations?)r|   r\   r]   Údelete_eventr†   s     r   Ú_ensure_event_does_not_existz3StreamSynchronizations._ensure_event_does_not_existû   s<   € Ø�D×-Ñ-Ñ-Ü�K‰KðQð ôð ×Ñ˜eÕ$ð .r   c                 óº   — || j                   v rt        j                  d|«       y d| j                  |<   | j                  j	                  «       | j                   |<   y )Nz‹Found duplicate Stream creation in the trace for Stream with id: %s. PyTorch Streams are only created once, so this trace entry is ignored.r   )r{   r\   r]   r}   Úcopyr�   s     r   r~   z$StreamSynchronizations.create_stream  sW   € Ø�T×-Ñ-Ñ-Ü�K‰Kð*ð õ	ð ,-ˆD× Ñ  Ñ(Ø/3×/CÑ/C×/HÑ/HÓ/JˆD×$Ñ$ VÒ,r   c                 óD   — | j                  |«       i | j                  |<   y r9   )rŠ   r|   r†   s     r   r…   z#StreamSynchronizations.create_event  s    € Ø×)Ñ)¨%Ô0Ø+-ˆ×!Ñ! %Ò(r   c                 ó@   — | j                  |«       | j                  |= y r9   )r‡   r|   r†   s     r   r‰   z#StreamSynchronizations.delete_event  s   € Ø×!Ñ! %Ô(Ø×%Ñ% eÑ,r   r!   c                 óJ   — | j                  |«       || j                  |   |<   y r9   )r‚   r{   )r   r"   r!   s      r   Úupdate_seq_numz%StreamSynchronizations.update_seq_num  s%   € Ø×"Ñ" 6Ô*Ø3:ˆ× Ñ  Ñ(¨Ò0r   c                 óœ   — | j                  |«       | j                  |«       | j                  |   j                  «       | j                  |<   y r9   )r‡   r‚   r{   rŒ   r|   ©r   rƒ   r"   s      r   Úrecord_statez#StreamSynchronizations.record_state  sB   € Ø×!Ñ! %Ô(Ø×"Ñ" 6Ô*Ø+/×+CÑ+CÀFÑ+K×+PÑ+PÓ+Rˆ×!Ñ! %Ò(r   ÚstateÚotherc                 ór   — |j                  «       D ]$  \  }}t        |j                  |d«      |«      ||<   Œ& y ©Néÿÿÿÿ)ÚitemsÚmaxÚget)r   r”   r•   r"   r!   s        r   Ú_state_wait_for_otherz,StreamSynchronizations._state_wait_for_other#  s:   € ð  %Ÿ{™{›}ò 	@‰OˆF�GÜ §	¡	¨&°"Ó 5°wÓ?ˆE�&ŠMñ	@r   c                 ó    — | j                  |«       | j                  |«       | j                  | j                  |   | j                  |   «       y r9   )r‚   r‡   rœ   r{   r|   )r   r"   rƒ   s      r   Ústream_wait_for_eventz,StreamSynchronizations.stream_wait_for_event)  sG   € Ø×"Ñ" 6Ô*Ø×!Ñ! %Ô(Ø×"Ñ"Ø×$Ñ$ VÑ,¨d×.GÑ.GÈÑ.Nõ	
r   c                 óÚ   — | j                  |«       | j                  j                  «       D ]  }| j                  ||«       Œ | j	                  | j
                  | j                  |   «       y r9   )r‡   r{   Úkeysrž   rœ   r}   r|   r’   s      r   Úall_streams_wait_for_eventz1StreamSynchronizations.all_streams_wait_for_event0  sd   € Ø×!Ñ! %Ô(Ø×.Ñ.×3Ñ3Ó5ò 	6ˆFØ×&Ñ& v¨uÕ5ð	6ð 	×"Ñ"Ø× Ñ  $×";Ñ";¸EÑ"Bõ	
r   c                 óô   — | j                  |«       | j                  j                  «       D ]!  }| j                  || j                  |   «       Œ# | j                  | j                  | j                  |   «       y r9   )r‚   r{   Úvaluesrœ   r}   ©r   r"   r”   s      r   Úall_streams_wait_for_streamz2StreamSynchronizations.all_streams_wait_for_stream9  sq   € Ø×"Ñ" 6Ô*Ø×-Ñ-×4Ñ4Ó6ò 	PˆEØ×&Ñ& u¨d×.FÑ.FÀvÑ.NÕOð	Pð 	×"Ñ"Ø× Ñ  $×":Ñ":¸6Ñ"Bõ	
r   c                 óâ   — | j                   j                  «       D ]  \  }}||   | j                  |<   Œ | j                   j                  «       D ]  }| j	                  || j                  «       Œ  y r9   )r{   r™   r}   r£   rœ   r¤   s      r   Úsync_all_streamsz'StreamSynchronizations.sync_all_streamsB  sp   € Ø!×5Ñ5×;Ñ;Ó=ò 	9‰MˆF�EØ+0°©=ˆD× Ñ  Ò(ð	9ð ×-Ñ-×4Ñ4Ó6ò 	DˆEØ×&Ñ& u¨d×.BÑ.BÕCñ	Dr   Úcurrent_streamÚother_streamc                 óŠ   — | j                  |«       | j                  |«       || j                  |   j                  |d«      k  S r—   )r‚   r{   r›   )r   r¨   r!   r©   s       r   Úis_ordered_afterz'StreamSynchronizations.is_ordered_afterI  sD   € ð 	×"Ñ" >Ô2Ø×"Ñ" <Ô0Ø˜$×2Ñ2°>ÑB×FÑFÀ|ÐUWÓXÑXÐXr   rw   )r   r   r   r:   r*   r‚   ÚEventIdr‡   rŠ   r~   r…   r‰   r)   r�   r“   Údictrœ   rž   r¡   r¥   r§   r-   r«   r   r   r   ry   ry   à   sY  „ ó.ð'¨Hð '¸ó 'ð%¨'ð %°dó %ð	%°'ð 	%¸dó 	%ð
K Hð 
K°ó 
Kð. 'ð .¨dó .ð- 'ð -¨dó -ð; Xð ;¸ð ;À4ó ;ðS 'ð S°8ð SÀó Sð
@Ø˜( FÐ*Ñ+ð@Ø48¸À6Ð9IÑ4Jð@à	ó@ð
¨Hð 
¸Wð 
Èó 
ð
°ð 
¸Dó 
ð
°(ð 
¸tó 
óDðYØ&ðYØ17ðYØGOðYà	ôYr   ry   c                   ó  — e Zd ZdZdd„Zdedee   dee   dee   d	ed
e	e
ee   f   dee   fd„Zdeddfd„Zdeddfd„Zdededdfd„Zdededdfd„Zdeddfd„Zdeddfd„Zdeddfd„Zdd„Zdeddfd„Zdeddfd„Zy)ÚEventHandlerzèAnalyzes CSAN trace for synchronization errors.

    Stores information on each stream's synchronizations with other streams as well
    as tensor accesses to determine whether a given kernel launch might cause a
    data race.
    rW   Nc                 óN   — t        «       | _        t        «       | _        d| _        y )Nr   )rV   Útensors_accessedry   Úsyncsr!   r   s    r   r:   zEventHandler.__init__Y  s   € Ü 0Ó 2ˆÔÜ+Ó-ˆŒ
Ø ˆ�r   r"   Ú	read_onlyÚ
read_writeÚoutputsr#   Útensor_aliasesc           
      ó<  ‡ ‡— dt         dt        dt        t           dd fˆˆ fd„}g Š‰ xj                  dz  c_        ‰ j                  j                  |‰ j                  «       t        j                  j                  t        j                  t        j                  «       «      d¬«      }|j                  «        |D ]Š  }	‰ j                  j                  |	«       t        t        j                   ‰ j                  ||||	   |	|v |«      }
 ||	|
‰ j                  j#                  |	«      «       ‰ j                  j%                  |	|
«       ŒŒ |D ]Ð  }	‰ j                  j                  |	«       t        t        j&                  ‰ j                  ||||	   |	|v |«      }
‰ j                  j)                  |	«      r+‰ j                  j+                  |	«      D ]  } ||	|
|«       Œ n# ||	|
‰ j                  j#                  |	«      «       ‰ j                  j-                  |	|
«       ŒÒ ‰S )	Nr4   r6   r7   rW   c                 óð   •— |€y ‰j                   j                  |j                  |j                  |j                  «      s7‰j	                  t        | ‰j                  j                  | «      ||«      «       y y r9   )r²   r«   r"   r!   rr   r3   r±   rk   )r4   r6   r7   Ú
error_listr   s      €€r   Úcheck_conflictz:EventHandler._handle_kernel_launch.<locals>.check_conflictg  ss   ø€ ð Ð&ØØ—:‘:×.Ñ.Ø×%Ñ% ×'>Ñ'>À×@VÑ@Vôð ×!Ñ!Ü-Ø Ø×-Ñ-×HÑHÈÓRØ&Ø'ó	õðr   é   F©Úlookup_lines)rJ   r   r   r!   r²   r�   r.   r/   ÚextractÚ
walk_stackÚinspectÚcurrentframeÚreverser±   r`   r   r   rm   rt   r   ri   rp   rv   )r   r"   r³   r´   rµ   r#   r¶   rº   r&   r4   r6   r7   r¹   s   `           @r   Ú_handle_kernel_launchz"EventHandler._handle_kernel_launch^  s  ù€ ð	Üð	Ü/5ð	ÜHPÔQWÑHXð	àö	ð" 24ˆ
Ø�Š˜Ñ�Ø�
‰
×!Ñ! &¨$¯,©,Ô7Ü×,Ñ,×4Ñ4Ü× Ñ ¤×!5Ñ!5Ó!7Ó8Àuð 5ó 
ˆð
 	×ÑÔà!ò 	EˆHØ×!Ñ!×6Ñ6°xÔ@Ü#Ü—‘Ø—‘ØØØ˜xÑ(Ø˜GÐ#ØóˆNñ Ø˜.¨$×*?Ñ*?×*IÑ*IÈ(Ó*Sôð ×!Ñ!×*Ñ*¨8°^ÕDð	Eð  #ò 	FˆHØ×!Ñ!×6Ñ6°xÔ@Ü#Ü× Ñ Ø—‘ØØØ˜xÑ(Ø˜GÐ#ØóˆNð ×$Ñ$×FÑFÀxÔPØ'+×'<Ñ'<×'FÑ'FÀxÓ'Pò N�OÙ" 8¨^¸_ÕMñNñ Ø˜n¨d×.CÑ.C×.MÑ.MÈhÓ.Wôð ×!Ñ!×+Ñ+¨H°nÕEð%	Fð( Ðr   rƒ   c                 ó:   — | j                   j                  |«       y r9   )r²   r…   r†   s     r   Ú_handle_event_creationz#EventHandler._handle_event_creation¨  ó   € Ø�
‰
×Ñ Õ&r   c                 ó:   — | j                   j                  |«       y r9   )r²   r‰   r†   s     r   Ú_handle_event_deletionz#EventHandler._handle_event_deletion«  rÆ   r   c                 ó<   — | j                   j                  ||«       y r9   )r²   r“   r’   s      r   Ú_handle_event_recordz!EventHandler._handle_event_record®  s   € Ø�
‰
×Ñ  vÕ.r   c                 ó<   — | j                   j                  ||«       y r9   )r²   rž   r’   s      r   Ú_handle_event_waitzEventHandler._handle_event_wait±  s   € Ø�
‰
×(Ñ(¨°Õ7r   r4   c                 ó  — | j                   j                  |«       t        j                  j	                  t        j
                  t        j                  «       «      d¬«      }|j                  «        | j                   j                  ||«       y )NFr¼   )
r±   rc   r.   r/   r¾   r¿   rÀ   rÁ   rÂ   r^   re   s      r   Ú_handle_memory_allocationz&EventHandler._handle_memory_allocation´  sr   € Ø×Ñ×:Ñ:¸8ÔDÜ×,Ñ,×4Ñ4Ü× Ñ ¤×!5Ñ!5Ó!7Ó8Àuð 5ó 
ˆð
 	×ÑÔØ×Ñ×+Ñ+ØØõ	
r   c                 óp   — | j                   j                  |«       | j                   j                  |«       y r9   )r±   r`   rb   r_   s     r   Ú_handle_memory_deallocationz(EventHandler._handle_memory_deallocationÁ  s*   € Ø×Ñ×2Ñ2°8Ô<Ø×Ñ×+Ñ+¨HÕ5r   c                 ó:   — | j                   j                  |«       y r9   )r²   r~   r�   s     r   Ú_handle_stream_creationz$EventHandler._handle_stream_creationÅ  s   € Ø�
‰
× Ñ  Õ(r   c                 ó8   — | j                   j                  «        y r9   )r²   r§   r   s    r   Ú_handle_device_synchronizationz+EventHandler._handle_device_synchronizationÈ  s   € Ø�
‰
×#Ñ#Õ%r   c                 ó:   — | j                   j                  |«       y r9   )r²   r¥   r�   s     r   Ú_handle_stream_synchronizationz+EventHandler._handle_stream_synchronizationË  s   € Ø�
‰
×.Ñ.¨vÕ6r   c                 ó:   — | j                   j                  |«       y r9   )r²   r¡   r†   s     r   Ú_handle_event_synchronizationz*EventHandler._handle_event_synchronizationÎ  s   € Ø�
‰
×-Ñ-¨eÕ4r   rw   )r   r   r   r'   r:   r*   ÚsetrJ   r+   r­   Úintr,   r1   rÃ   r¬   rÅ   rÈ   rÊ   rÌ   rÎ   rÐ   rÒ   rÔ   rÖ   rØ   r   r   r   r¯   r¯   Q  s;  „ ñó!ð
HàðHð �w‘<ðHð ˜‘Lð	Hð
 �W‘ðHð ðHð ˜S $ s¡)˜^Ñ,ðHð 
Ð"Ñ	#óHðT'¨Gð '¸ó 'ð'¨Gð '¸ó 'ð/¨'ð /¸8ð /Èó /ð8¨ð 8¸ð 8Àdó 8ð
°'ð 
¸dó 
ð6°Gð 6Àó 6ð)¨hð )¸4ó )ó&ð7°Xð 7À$ó 7ð5°7ð 5¸tô 5r   r¯   ÚaÚbrW   c              #   óZ   K  — | j                  «       D ]  \  }}||v sŒ||||   f–— Œ y ­wr9   )r™   )rÛ   rÜ   ÚargÚvalues       r   Ú
zip_by_keyrà   Ò  s7   è ø€ Ø—g‘g“iò %‰
ˆˆUØ�!Š8Ø�u˜a ™fÐ$Ó$ñ%ùs   ‚+ž+ÚschemaÚargs.Úkwargsc              #   ó  K  — | j                   d t        |«       }| j                   t        |«      d  D �ci c]  }|j                  |“Œ }}t        ||«      E d {  –—†  t	        ||«      D ]  \  }}}||f–— Œ y c c}w 7 Œ%­wr9   )Ú	argumentsrP   ÚnameÚziprà   )	rá   râ   rã   Úschema_argsrÞ   Úschema_kwargsÚ_Úargumentrß   s	            r   Úzip_argumentsrì   Ø  s‹   è ø€ ð ×"Ñ" ;¤S¨£YÐ/€KØ.4×.>Ñ.>¼sÀ4»y¸{Ð.KÖL s�S—X‘X˜s‘]ÐL€MÐLä�; Ó%×%Ð%ä(¨¸Ó?ò  Ñˆˆ8�UØ˜ÐÓñ ùò	 Mà%ús   ‚3BµA;Á	BÁB Á&Bc                   ó°   — e Zd Zdd„Z	 	 ddedededee   deddfd	„Zd
e	j                  deedf   deeef   deddf
d„Zd
e	j                  dededdfd„Zy)ÚArgumentHandlerrW   Nc                 ól   — t        «       | _        t        «       | _        i | _        t        «       | _        y r9   )rÙ   Údataptrs_readÚdataptrs_writtenr¶   rµ   r   s    r   r:   zArgumentHandler.__init__å  s'   € Ü+.«5ˆÔÜ.1«eˆÔØ8:ˆÔÜ%(£Uˆ�r   rß   Úis_writeÚmetadata_onlyræ   r%   c                 óž  — t        |t        j                  «      r³|j                  r¦|j	                  «       }|r| j
                  j                  |«       n|s| j                  j                  |«       | j                  j                  |g «       |�| j                  |   j                  |«       |r| j                  j                  |«       y y y y r9   )Ú
isinstanceÚtorchÚTensorÚis_cudar4   rñ   Úaddrð   r¶   Ú
setdefaultrr   rµ   )r   rß   rò   ró   ræ   r%   r4   s          r   Ú_handle_argumentz ArgumentHandler._handle_argumentë  s©   € ô �eœUŸ\™\Ô*¨u¯}ª}Ø—~‘~Ó'ˆHÙØ×%Ñ%×)Ñ)¨(Õ3Ù"Ø×"Ñ"×&Ñ& xÔ0à×Ñ×*Ñ*¨8°RÔ8ØÐØ×#Ñ# HÑ-×4Ñ4°TÔ:ÙØ—‘× Ñ  Õ*ð ð 0=Ð*r   rá   râ   .rã   Ú
is_factoryc          	      óR  — t        |||«      D ]—  \  }}|j                  d uxr |j                  j                  }|xs' |j                  d uxr |j                  j                   }t        j                  t        j                  | j                  ||j                  |¬«      |«       Œ™ y )N)rò   ræ   ró   )	rì   Ú
alias_inforò   ÚpytreeÚ	tree_map_Ú	functoolsÚpartialrû   ræ   )	r   rá   râ   rã   rü   rë   rß   rò   ró   s	            r   Úparse_inputszArgumentHandler.parse_inputs   s«   € ô  -¨V°T¸6ÓBò 	‰OˆH�eØ×*Ñ*°$Ð6ÒW¸8×;NÑ;N×;WÑ;WˆHð 'ò Ø×#Ñ#¨4Ð/ÒT¸×8KÑ8K×8TÑ8TÐ4Tð ô ×ÑÜ×!Ñ!Ø×)Ñ)Ø%Ø!Ÿ™Ø"/ô	ð õñ	r   rµ   c          	      ó  — t        |j                  |f«      D ]h  \  }}|xs' |j                  d uxr |j                  j                   }t	        j
                  t        j                  | j                  | d|¬«      |«       Œj y )NT)rò   r%   ró   )	rç   Úreturnsrþ   rò   rÿ   r   r  r  rû   )r   rá   rµ   rü   Úresrß   ró   s          r   Úparse_outputszArgumentHandler.parse_outputs  s‡   € ô ˜fŸn™n¨w¨jÓ9ò 	‰JˆC�Ø&ò Ø—‘ dÐ*ÒJ°3·>±>×3JÑ3JÐ/Jð ô ×ÑÜ×!Ñ!Ø×)Ñ)Ø!.Ð.Ø"Ø"/ô	ð õñ		r   rw   ©NF)r   r   r   r:   r   r-   r   r+   rû   rö   ÚFunctionSchemaÚtupler­   r  r  r   r   r   rî   rî   ä  sÈ   „ ó+ð #Øñ+àð+ð ð+ð ð	+ð
 �s‰mð+ð ð+ð 
ó+ð*à×$Ñ$ðð �C˜�H‰oðð �S˜#�X‘ð	ð ðð 
óð2Ø×*Ñ*ðØ58ðØIMðà	ôr   rî   c                   ó   — e Zd Zdd„Zdd„Zy)ÚCUDASanitizerDispatchModeNc                 ó’  — t        «       | _        t        j                  j	                  «        t        j                  | j                  j                  «       t        j                  | j                  j                  «       t        j                  | j                  j                  «       t        j                  | j                  j                  «       t        j                  | j                  j                  «       t        j                   | j                  j"                  «       t        j$                  | j                  j&                  «       t        j(                  | j                  j*                  «       t        j,                  | j                  j.                  «       t        j0                  | j                  j2                  «       y r9   )r¯   Úevent_handlerrö   Ú_CÚ_activate_gpu_traceÚ	gpu_traceÚ$register_callback_for_event_creationrÅ   Ú$register_callback_for_event_deletionrÈ   Ú"register_callback_for_event_recordrÊ   Ú register_callback_for_event_waitrÌ   Ú'register_callback_for_memory_allocationrÎ   Ú)register_callback_for_memory_deallocationrÐ   Ú%register_callback_for_stream_creationrÒ   Ú,register_callback_for_device_synchronizationrÔ   Ú,register_callback_for_stream_synchronizationrÖ   Ú+register_callback_for_event_synchronizationrØ   r   s    r   r:   z"CUDASanitizerDispatchMode.__init__,  sP  € Ü)›^ˆÔÜ�‰×$Ñ$Ô&Ü×6Ñ6Ø×Ñ×5Ñ5ô	
ô 	×6Ñ6Ø×Ñ×5Ñ5ô	
ô 	×4Ñ4Ø×Ñ×3Ñ3ô	
ô 	×2Ñ2Ø×Ñ×1Ñ1ô	
ô 	×9Ñ9Ø×Ñ×8Ñ8ô	
ô 	×;Ñ;Ø×Ñ×:Ñ:ô	
ô 	×7Ñ7Ø×Ñ×6Ñ6ô	
ô 	×>Ñ>Ø×Ñ×=Ñ=ô	
ô 	×>Ñ>Ø×Ñ×=Ñ=ô	
ô 	×=Ñ=Ø×Ñ×<Ñ<õ	
r   c                 óx  — |€i }t        t        j                  |j                  j                  «      «      }t        «       }|j                  |j                  |||¬«        ||i |¤Ž}|j                  |j                  ||¬«       | j                  j                  t        j                  j                  «       j                  |j                  |j                  z
  |j                  |j                   |j                  |j"                  «      }|r-|D ]  }	t%        |	t&        j(                  ¬«       Œ t+        |«      ‚|S )N)rü   )Úfile)r-   ÚFACTORY_FUNCTION_REGEXÚmatchÚ_schemaræ   rî   r  r  r  rÃ   rö   Úcudar¨   Úcuda_streamrð   rñ   rµ   r¶   ÚprintÚsysÚstderrrL   )
r   ÚfuncÚtypesrâ   rã   rü   Úargument_handlerrµ   rM   Úerrors
             r   Ú__torch_dispatch__z,CUDASanitizerDispatchMode.__torch_dispatch__N  s  € Øˆ>ØˆFäÔ0×6Ñ6°t·|±|×7HÑ7HÓIÓJˆ
ä*Ó,ÐØ×%Ñ% d§l¡l°D¸&ÈZÐ%ÔXá˜Ð' Ñ'ˆà×&Ñ& t§|¡|°WÈÐ&ÔTØ×#Ñ#×9Ñ9Ü�J‰J×%Ñ%Ó'×3Ñ3Ø×*Ñ*Ð-=×-NÑ-NÑNØ×-Ñ-Ø×$Ñ$Ø�L‰LØ×+Ñ+ó
ˆñ Øò .�Ü�e¤#§*¡*Ö-ð.ä% fÓ-Ð-àˆr   rw   )r   N)r   r   r   r:   r*  r   r   r   r  r  +  s   „ ó 
ôDr   r  c                   ó*   — e Zd ZdZdd„Zd„ Zd„ Zd„ Zy)ÚCUDASanitizera‰  Manages the lifetime of a CUDASanitizer dispatch mode object.

    The CUDASanitizer class wraps the entering/exiting functions of the dispatch mode
    context manager in the enable function/destructor, respectively. This is to
    explicitly set the lifetime of the dispatch mode object to that of the application.
    This approach was deemed more elegant than using the atexit module.
    Nc                 ó0   — t        «       | _        d| _        y r  )r  ÚdispatchÚenabledr   s    r   r:   zCUDASanitizer.__init__s  s   € Ü1Ó3ˆŒØˆ�r   c                 óF   — | j                   j                  «        d| _        y )NT)r.  Ú	__enter__r/  r   s    r   ÚenablezCUDASanitizer.enablew  s   € Ø�‰×ÑÔ!Øˆ�r   c                 óL   — | j                   j                  d d d «       d| _        y r  )r.  Ú__exit__r/  r   s    r   ÚdisablezCUDASanitizer.disable{  s   € Ø�‰×Ñ˜t T¨4Ô0Øˆ�r   c                 óv   — t         �3t        j                  «       s| j                  r| j                  «        y y y y r9   )r$  Úis_finalizingr/  r5  r   s    r   Ú__del__zCUDASanitizer.__del__  s/   € ô ˆO¤c×&7Ñ&7Ô&9¸t¿|º|Ø�L‰L�Nð @LÐ&9ˆOr   rw   )r   r   r   r'   r:   r2  r5  r8  r   r   r   r,  r,  j  s   „ ñóòòó	r   r,  c                  ó,   — t         j                  «        y)ac  Enable CUDA Sanitizer.

    The sanitizer will begin to analyze low-level CUDA calls invoked by torch functions
    for synchronization errors. All data races found will be printed to the standard
    error output along with stack traces of suspected causes. For best results, the
    sanitizer should be enabled at the very beginning of the program.
    N)Úcuda_sanitizerr2  r   r   r   Úenable_cuda_sanitizerr;  ‹  s   € ô ×ÑÕr   )Br'   r   r  rÀ   rE   ÚloggingÚrer$  rG   r.   Úcollections.abcr   Údataclassesr   r   Útypingr   r   r   rö   Útorch.cuda._gpu_tracer!  Ú
_gpu_tracer  Útorch.utilsr	   rÿ   Útorch.utils._python_dispatchr
   r   r   r   r   rÚ   rJ   r*   r¬   r)   Ú	getLoggerr   r\   Úcompiler  ÚEnumr   r   Ú	Exceptionr1   r3   rL   rR   rV   ry   r¯   r­   r
  rà   r	  r+   ÚArgumentrì   rî   r  r,  r;  r:  r   r   r   ú<module>rJ     sì  ðñ
ó Û Û Û 	Û Û 	Û 
Û Û Ý $ß (ß )Ñ )ã ß )Ð )Ý )Ý :ð Ð áˆTƒ]€Ùˆeƒn€Ùˆeƒn€à
€Ø€Ø
€Ø	€à	ˆ×	Ñ	˜8Ó	$€ð $˜Ÿ™Ð$6Ó7Ð ôK�—‘ô Kð ÷(ð (ó ð(ô.<˜9ô <ô4&Ð 4ô 4&ôn5˜)ô 5ð ÷#ð #ó ð#÷ 4+ñ 4+÷nnYñ nY÷b~5ñ ~5ðB%�$�r˜3�w‘-ð % D¨¨S¨¡Mð %°h¸uÀRÈÈcÀ\Ñ?RÑ6Só %ð	 Ø× Ñ ð	 Ø(-¨c°3¨h©ð	 ØAEÀcÈ3ÀhÁð	 àˆe�E—N‘N CÐ'Ñ(Ñ)ó	 ÷Dñ DôN<Ð 1ô <÷~ñ òBñ “�r   