+
    –°³jr*  ã                   ó„  € R t ^ RIt^ RIt^ RIHt ^ RIHtHt ^ RIH	t	 ^ RI
t
^ RIt
^ RIHt ^ RIHt ^ RIHt ^ RIHtHtHtHtHtHt ^ R	IHtHtHtHtHt ^ R
IH t  ^RI!H"t" ]PF                  ! ]$4      t%R R lt&R R lt'R R lt(R R lt)R R lt*R R lt+R R lt, ! R R4      t-]"! R]-! 4       R7       R R R llt.R# )!a�  
This module implements CUDA graphs support for TorchDynamo backends.

CUDA graphs allow for capturing and replaying GPU operations, which can significantly
reduce CPU overhead in GPU-accelerated PyTorch models. This module provides:

- CUDA graph creation and management for both forward and backward passes
- Input mutation detection and handling
- Device compatibility checking
- Stack trace management for debugging
- Integration with TorchInductor's cudagraph trees

The backend supports two main modes:
1. cudagraphs: Full CUDA graph support with both forward and backward pass optimization
2. cudagraphs_inner: Lower-level CUDA graph implementation used for benchmarking

Key components:
- CudagraphsBackend: Main backend class for CUDA graph integration
- Mutation detection utilities to ensure graph safety
- Device mapping and compatibility checks
- Stack trace collection for debugging
N)Údefaultdict)ÚCallableÚSequence)ÚAny)Úconfig)Úaot_autograd)Ú	boxed_nop)ÚBoxedDeviceIndexÚ'check_multiple_devices_or_any_cpu_nodesÚformat_default_skip_messageÚget_mutation_stack_traceÚget_placeholder_infoÚ#log_cudagraph_skip_and_bump_counter)Ú	BoxedBoolÚcount_tangentsÚ%get_first_incompatible_cudagraph_nodeÚnum_fw_fixed_argumentsÚoutput_node)ÚStorageWeakRef)Úregister_backendc                ón   € V ^8„  d   QhR\         P                  P                  R\        \        ,          /# )é   ÚgÚreturn)ÚtorchÚfxÚGraphÚsetÚint)Úformats   "Úb/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torch/_dynamo/backends/cudagraphs.pyÚ__annotate__r!   :   s&   € ÷ $ñ $œEŸH™HŸN™Nð $¬s´3­xñ $ó    c           	      ó  € R  R lp\        \        4      p^ p\        4       pV P                   EFÎ  pVP                  R8X  d{   \	        V! VP
                  4      \        P                  4      '       d@   V\        V! VP
                  4      P                  4       4      ,          P                  V4       V^,          pK�  VP                  R8X  g   K¢  \        VP                  R4      '       g   KÀ  VP                  P                  p\        VP                  4       Fß  w  rxV\!        VP"                  4      8  d   VP"                  V,          p	M:VP$                  VP&                  9  d   KP  VP&                  VP$                  ,          p	Rp
VP(                  '       d   VP(                  P*                  '       d   Rp
V
'       g   K©  WB\        V! V	P
                  4      P                  4       4      ,          ,          pKá  	  EKÑ  	  V# )c                óR   € V ^8„  d   QhR\         \        \        3,          R\        /# )r   Úmetar   )ÚdictÚstrr   )r   s   "r    r!   Ú*find_input_mutations.<locals>.__annotate__;   s&   € ÷ Eñ E”dœ3¤˜8•nð E¬ñ Er"   c                 ó4   € R V 9   d
   V R ,          # V R,          # )ÚvalÚfake_result© )r%   s   &r    Úmeta_fkÚ%find_input_mutations.<locals>.meta_fk;   s   € Ø# tœmˆt�E�{ÐD°°mÕ1DÐDr"   ÚplaceholderÚcall_functionÚ_schemaFT)r   r   ÚnodesÚopÚ
isinstancer%   r   ÚTensorr   Ú_typed_storageÚaddÚhasattrÚtargetr1   Ú	enumerateÚ	argumentsÚlenÚargsÚnameÚkwargsÚ
alias_infoÚis_write)r   r-   ÚinputsÚ	input_idxÚmutated_inputsÚnÚschemaÚiÚargÚargumentÚmut_args   &          r    Úfind_input_mutationsrK   :   sg  € õEô œÓ€FØ€IÜ“U€NØ�W�WˆØ�4‰4�=Ô Ü™' !§&¡&›/¬5¯<©<×8Ò8Ø”~¡g¨a¯f©f£o×&DÑ&DÓ&FÓGÕH×LÑLÈYÔWØ˜�NŠIØ�T‰T�_Ö$Ü˜1Ÿ8™8 Y×/Ò/Ùà—X‘X×%Ñ%ˆFÜ# F×$4Ñ$4Ö5‘�Ø”s˜1Ÿ6™6“{”?Ø Ÿv™v a�y‘Hà—x‘x q§x¡xÔ/Ù Ø Ÿx™x¨¯©Õ1�HØ�Ø—>—>�>Ø—~‘~×.×.Ð.Ø"&˜ß‘7ð #Ü&¡w¨x¯}©}Ó'=×'LÑ'LÓ'NÓOõ'õ ’Nô 6ñ ð: Ðr"   c                ó¶   € V ^8„  d   QhR\         P                  P                  R\        \         P                  \         P                  P
                  3,          /# ©r   Úgmr   )r   r   ÚGraphModuler&   ÚdeviceÚNode)r   s   "r    r!   r!   a   s<   € ÷ ñ Ü�‰×Ñðä	Œ%�,‰,œŸ™Ÿ™Ð
%Õ&ñr"   c                 ó  € / pV P                   P                   Fb  pVP                  P                  R R4      p\	        V\
        P                  4      '       g   KA  VP                  V9  g   KT  W!VP                  &   Kd  	  V# )r*   N)Úgraphr2   r%   Úgetr4   r   r5   rP   )rN   Údevice_node_mappingrE   Úts   &   r    Úget_device_node_mappingrW   a   sb   € ð >@ÐØ�X‰X�^Œ^ˆØ�F‰F�J‰J�u˜dÓ#ˆÜ�aœŸ™×&Ô&¨1¯8©8Ð;NÖ+NØ,- §¡Ó)ñ ð Ðr"   c                ór   € V ^8„  d   QhR\         P                  P                  R\        R\        R,          /# ©r   Ú	aot_modelÚ	num_fixedr   N©r   r   rO   r   r'   )r   s   "r    r!   r!   l   s7   € ÷ Dñ DÜ�x‰x×#Ñ#ðDÜ03ðDäˆ4…ZñDr"   c                 ó²   € \        V P                  4      \        \        V4      4      ,
          pV'       g   R # \	        V P                  4      p\        W24      # ©N)rK   rS   r   Úranger   r   )rZ   r[   Úmutation_indicesÚplaceholderss   &&  r    Ú3check_for_mutation_ignore_cuda_graph_managed_tensorrb   l   sA   € ô ,¨I¯O©OÓ<¼sÄ5ÈÓCSÓ?TÕTÐßÙä'¨	¯©Ó8€LÜ# LÓCÐCr"   c                ór   € V ^8„  d   QhR\         P                  P                  R\        R\        R,          /# rY   r\   )r   s   "r    r!   r!   w   s/   € ÷ ñ œeŸh™h×2Ñ2ð ¼sð ÄsÈTÅzñ r"   c                 óð   € \         P                  '       g   \        W4      ;p'       d   V# \        \	        V 4      4      ;p'       d   V# \        V 4      ;p'       d   \        R VP                   R24      # R# )zincompatible op (Ú)N)r   Ú(cudagraph_backend_support_input_mutationrb   r
   rW   r   r   r>   )rZ   r[   Úmut_skipÚskipÚnodes   &&   r    Úcheck_for_skiprj   w   s{   € Ü×:×:Ð:ÜJØó
ð 
ˆ8ö 
ð ˆOä6Ü 	Ó*óð €tö ð ˆä4°YÓ?Ð?€tÖ?Ü*Ð->¸t¿y¹y¸kÈÐ+KÓLÐLár"   c                óX   € V ^8„  d   QhR\         P                  P                  R\        /# rM   )r   r   rO   r   )r   s   "r    r!   r!   ‰   s$   € ÷ ñ œŸ™×-Ñ-ð ´#ñ r"   c                 ó¦   € \        \        \        V 4      4      4      pVP                  R 8w  d   \	        RVP                   24      hVP
                  # )ÚcudazExpected CUDA device, got )ÚnextÚiterrW   ÚtypeÚAssertionErrorÚindex)rN   rP   s   & r    Úget_device_indexrs   ‰   sD   € Ü”$Ô.¨rÓ2Ó3Ó4€FØ‡{�{�fÔÜÐ9¸&¿+¹+¸ÐGÓHÐHØ�<‰<Ðr"   c                ó|   € V ^8„  d   QhR\         P                  P                  R\        \        R,          ,          /# )r   rN   r   N)r   r   rO   Úlistr'   )r   s   "r    r!   r!   �   s-   € ÷ ñ œŸ™×-Ñ-ð ´$´s¸TµzÕ2Bñ r"   c                 óŠ  € \        V 4      p\        VP                  4      ^8w  d"   \        R\        VP                  4       24      hVP                  ^ ,          p\	        VR4      '       g   . # V Uu. uFE  p\        V\        P                  P                  P                  4      '       d   VP                  MRNKG  	  up# u upi )é   z(Expected output node to have 1 arg, got Ú__iter__N)r   r<   r=   rq   r8   r4   r   r   ri   rQ   Ústack_trace)rN   Úoutputr=   rH   s   &   r    Úget_stack_tracesr{   �   s¨   € Ü˜‹_€FÜ
ˆ6�;‰;Ó˜1ÔÜØ6´s¸6¿;¹;Ó7GÐ6HÐIó
ð 	
ð �;‰;�q�>€DÜ�4˜×$Ò$Øˆ	ñ óáˆCô ' s¬E¯H©H¯M©M×,>Ñ,>×?Ò?ˆ�ŠÀTÒ	IÙñð ùò s   Á2AC c                óz   € V ^8„  d   QhR\         P                  P                  R\        \        ,          R\        /# )r   Údynamo_modelÚdynamo_inputsr   ©r   r   rO   r   r   )r   s   "r    r!   r!   Ÿ   s5   € ÷ V7ñ V7œUŸX™X×1Ñ1ð V7Ä(Ì3Å-ð V7ÔTWñ V7r"   c           	      ó  aaaa€ ^ RI Ho \        R4      o\        R4      oR
R VVVV3R lllpR VVV3R llp\	        VV\
        P                  ! VRR7      \        P                  P                  P                  R	7      pV! V S4      # )é    )Úcudagraphify_implTNc                ó†   € V ^8„  d   QhR\         P                  P                  R\        \        ,          R\
        R\        /# )r   rZ   Ú
aot_inputsÚis_inferencer   )r   r   rO   ru   r   Úbool)r   s   "r    r!   Ú cudagraphs.<locals>.__annotate__¥   s>   € ÷ ñ Ü—8‘8×'Ñ'ðäœ•Iðô ðô 
ñ	r"   c                 ó´  <€ \        W4      p\        \        S
4      \        V4      4      p\        W4      ;p'       d'   \        P
                  ! S	4       \        R V 24       V# SP                  \        V 4      4       S! VV\        V4      SP                  RV\        V 4      \        V P                  4      \        V P                  4      R7	      pRVn        V# )úskipping cudagraphs due to F©Údevice_indexÚis_backwardr…   Ústack_tracesra   Úmutated_input_idxsT)r   r   r<   rj   r   Údisabler   r   rs   r_   Úvaluer{   r   rS   rK   Ú_boxed_call)rZ   r„   r…   ÚinterpÚfixedÚskip_msgÚoutÚboxed_device_indexr‚   Údo_cudagraphsr~   s   &&&    €€€€r    Úforward_cudagraphsÚ&cudagraphs.<locals>.forward_cudagraphs¥   sÃ   ø€ ô
 ˜9Ó1ˆÜ&¤s¨=Ó'9¼3¸z»?ÓKˆÜ% iÓ7Ð7ˆ8Ö7Ü×Ò˜mÔ,Ü/Ø-¨h¨ZÐ8ôð ˆMà×ÑÔ/°	Ó:Ô;ÙØØÜ�%‹LØ+×1Ñ1ØØ%Ü)¨)Ó4Ü-¨i¯o©oÓ>Ü3°I·O±OÓDô

ˆð ˆŒØˆ
r"   c                óz   € V ^8„  d   QhR\         P                  P                  R\        \        ,          R\        /# )r   rZ   r„   r   )r   r   rO   ru   r   )r   s   "r    r!   r‡   Â   s2   € ÷ +ñ +Ü—8‘8×'Ñ'ð+Ü59¼#µYð+ä	ñ+r"   c                 ó  <a a€ \        S V4      pS'       g   S # \        S 4      p\        S V4      ;p'       dn   \        R V 24       S	P                  pVf   ^ p\
        P                  P                  P                  VRR7      oSf   \        R4      hR V V3R llpRVn
        V# S
! VV\        V4      \        S 4      RR\        S 4      \        S P                  4      \!        S P                  4      R7	      pRVn
        V# )r‰   F)Úcreate_if_none_existsz)cudagraph manager must exist for backwardc                óF   € V ^8„  d   QhR\         \        ,          R\        /# )r   rB   r   )ru   r   )r   s   "r    r!   Ú=cudagraphs.<locals>.backward_cudagraphs.<locals>.__annotate__Ù   s   € ÷ )ñ )œ4¤�9ð )¬ñ )r"   c                 ó4   <€ SP                  4        S! V 4      # r^   )Úset_to_running_backward)rB   rZ   Úmanagers   &€€r    ÚfnÚ3cudagraphs.<locals>.backward_cudagraphs.<locals>.fnÙ   s   ø€ à×/Ñ/Ô1Ù  Ó(Ð(r"   TrŠ   )r   r   rj   r   r�   r   Ú	_inductorÚcudagraph_treesÚget_managerrq   r‘   r_   rs   r{   r   rS   rK   )rZ   r„   r’   r“   r”   Ú
device_idxr¢   r•   r¡   r–   r‚   r—   s   f&      @€€€r    Úbackward_cudagraphsÚ'cudagraphs.<locals>.backward_cudagraphsÂ   s  ú€ ô ˜9 jÓ1ˆßØÐä˜yÓ)ˆÜ% i°Ó7Ð7ˆ8Ö7Ü/Ø-¨h¨ZÐ8ôð
 ,×1Ñ1ˆJØÒ!Ø�
Ü—o‘o×5Ñ5×AÑAØ°%ð Bó ˆGð ŠÜ$Ð%PÓQÐQ÷)ñ )ð
 "ˆBŒNØˆIáØØÜ�%‹LÜ)¨)Ó4ØØÜ)¨)Ó4Ü-¨i¯o©oÓ>Ü3°I·O±OÓDô

ˆð ˆŒØˆ
r"   )r…   )Úfw_compilerÚbw_compilerÚinference_compilerÚkeep_inference_input_mutations)F)Útorch._inductor.cudagraph_treesr‚   r   r	   r   Ú	functoolsÚpartialr   Ú_dynamor   Ú%cudagraph_backend_keep_input_mutation)r}   r~   r˜   r¨   Úaot_cudagraphsr–   r‚   r—   s   &f   @@@r    Ú
cudagraphsr´   Ÿ   st   û€ ÝAä˜d“O€MÜ)¨$Ó/Ð÷õ ÷:+ò +ôZ "Ø&Ø'Ü$×,Ò,Ð-?ÈdÔSÜ',§}¡}×';Ñ';×'aÑ'aô	€Nñ ˜,¨Ó6Ð6r"   c                   ó\   a € ] tR t^øt o Rt]V 3R lR l4       t]V 3R lR l4       tRtV t	R# )ÚCudagraphsBackendr´   c                ó   <€ V ^8„  d   QhRR/# )r   r   Nr,   )r   Ú__classdict__s   "€r    r!   ÚCudagraphsBackend.__annotate__ü   s   ø€ ÷  ñ  �4ñ  r"   c                 ó    € ^ RI Hp  V ! 4        R# )r�   ©Úreset_cudagraph_treesN)r®   r¼   r»   s    r    ÚresetÚCudagraphsBackend.resetû   s   € åIáÖr"   c                ój   <€ V ^8„  d   QhRS[ P                  P                  RS[S[,          RS[RS[/# )r   ÚmodelrB   r?   r   r   )r   r¸   s   "€r    r!   r¹     s;   ø€ ÷ )ñ )Ù�x‰x×#Ñ#ð)Ù-5±c­]ð)ÙFIð)á	ñ)r"   c                óT   € V'       d   \         P                  R V4       \        W4      # )z+cudagraphs backend ignoring extra kwargs %s)ÚlogÚwarningr´   )rÀ   rB   r?   s   &&,r    Ú__call__ÚCudagraphsBackend.__call__  s!   € ÷ Ü�K‰KÐEÀvÔNÜ˜%Ó(Ð(r"   r,   N)
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Úcompiler_nameÚstaticmethodr½   rÄ   Ú__static_attributes__Ú__classdictcell__)r¸   s   @r    r¶   r¶   ø   s0   ø‡ € Ø €Mà÷ ó ð ð
 ÷)ó ö)r"   r¶   r´   )r>   Úcompiler_fnc                ó´   € V ^8„  d   QhR\         R\        3,          R\        \        ,          R\        R\        R\         R\        \        ,          3,          /# )r   rÀ   .rB   Úcopy_outputsÚcopy_inputsr   )r   r   r   r†   )r   s   "r    r!   r!     sU   € ÷ /ñ /Ü�Cœ�HÕð/ä”S�Mð/ô ð/ô ð	/ô
 ˆc”8œC•=Ð Õ!ñ/r"   c                ó8  aaaaa	€ \        V\        \        34      '       g   \        R\	        V4       24      hS'       d(   V Uu. uF  p\
        P                  ! V4      NK  	  upoM\        V4      o\
        P                  P                  4        \
        P                  P                  4       pVP                  \
        P                  P                  4       4       \
        P                  P                  V4      ;_uu_ 4        V ! V!   RRR4       VP                  4        \
        P                  P                  4       P                  V4       \
        P                  P                  4        \
        P                  P                  4       o\
        P                  P                  SVR7      ;_uu_ 4        V ! S!  o	RRR4       \        S	\        \        34      '       g   S	3o	R VVVVV	3R llpV# u upi   + '       g   i     Lô; i  + '       g   i     LV; i)zBThis isn't registered as a backend, but is used in some benchmarksz+Expected inputs to be a list or tuple, got N)Ústreamc                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r   Ú
new_inputsr   )r   r   )r   s   "r    r!   Ú&cudagraphs_inner.<locals>.__annotate__0  s   € ÷ "ñ "œð "¤¬#¥ñ "r"   c                  óT  <€ \        S4      \        V 4      8w  d$   \        R \        S4       R\        V 4       24      hS'       d'   \        SV 4       F  w  rVP                  V4       K  	  SP	                  4        S'       d    S Uu. uF  q3P                  4       NK  	  up# S# u upi )z	Expected z inputs, got )r<   rq   ÚzipÚcopy_ÚreplayÚclone)	rÕ   ÚdstÚsrcÚxrÑ   rÐ   rS   Ústatic_inputsÚstatic_outputss	   *   €€€€€r    ÚrunÚcudagraphs_inner.<locals>.run0  s�   ø€ Üˆ}Ó¤ Z£Ô0Ü ØœC Ó.Ð/¨}¼SÀ»_Ð<MÐNóð ÷ Ü ¨zÖ:‘�Ø—	‘	˜#–ñ ;à�‰ŒßÙ'5Ó6¡~ !—G‘G–I¡~Ñ6Ð6à!Ð!ùò 7s   ÂB%)r4   ru   Útuplerq   rp   r   Ú
zeros_likerm   ÚsynchronizeÚStreamÚwait_streamÚcurrent_streamrÓ   Ú	CUDAGraphrS   )
rÀ   rB   rÐ   rÑ   rÞ   rÓ   rá   rS   rß   rà   s
   &&ff   @@@r    Úcudagraphs_innerrê     st  ü€ ô �fœt¤U˜m×,Ò,ÜØ9¼$¸v»,¸ÐHó
ð 	
÷ Ù6<Ó=±f°œ×)Ò)¨!Ö,±fÑ=‰ä˜V›ˆô 
‡J�J×ÑÔÜ�Z‰Z×ÑÓ €FØ
×Ñ”u—z‘z×0Ñ0Ó2Ô3Ü	�‰×	Ñ	˜6×	"Õ	"ÙˆvŠ÷ 
#à
×ÑÔÜ	‡J�J×ÑÓ×+Ñ+¨FÔ3Ü	‡J�J×ÑÔô �J‰J× Ñ Ó"€EÜ	�‰×	Ñ	˜%¨Ð	×	/Õ	/Ù Ñ.ˆ÷ 
0ä�n¤t¬U m×4Ò4Ø(Ð*ˆ÷"ô "ð €JùòG >÷ 
#×	"ú÷ 
0×	/ús   ÁG1ÄG6Æ4H	Ç6H	È	H	)TT)/Ú__doc__r¯   ÚloggingÚcollectionsr   Úcollections.abcr   r   Útypingr   r   Útorch.fxÚtorch._dynamor   Útorch._dynamo.backends.commonr   Ú torch._dynamo.backends.debuggingr   Útorch._inductor.cudagraph_utilsr	   r
   r   r   r   r   Útorch._inductor.utilsr   r   r   r   r   Ú torch.multiprocessing.reductionsr   Úregistryr   Ú	getLoggerrÆ   rÂ   rK   rW   rb   rj   rs   r{   r´   r¶   rê   r,   r"   r    Ú<module>rù      s£   ðñó. Û Ý #ß .Ý ã Û Ý  Ý 6Ý 6÷÷ ÷õ õ <å &ð ×Ò˜Ó!€õ$õNõDõõ$õõV7÷r)ñ )ñ( �lÑ0AÓ0CÕ D÷/ñ /r"   