
    3j                     T    S SK r S SKJr  S SKJr  S SKrS SKJr   " S S\5      rS/r	g)    N)Literal)Self)_acceleratorGraphc            
       ^  ^  \ rS rSrSr SSSS.S\S\\\4   S-  S\S	   S
\	4U 4S jjjjr
 SSSS.S\S\\\4   S-  S\S	   S
S4U 4S jjjjrSU 4S jjrSU 4S jjrSU 4S jjrSU 4S jjrSU 4S jjrS
\\\4   4U 4S jjrSU 4S jjrS\S
S4U 4S jjrSS jrS\S
S4S jrSrU =r$ )Graph	   a  
Wrapper around an :ref:`accelerator<accelerators>` graph that supports capture and replay.

A graph captures a sequence of operations and their dependencies, allowing them to be
replayed efficiently with reduced overhead. This class can be used as a context manager
to automatically capture operations on the current stream.

Arguments:
    keep_graph (bool, optional): If ``False``, the underlying graph is destroyed and the
        executable graph is instantiated on the GPU at the end of ``capture_end``.
        If ``True``, the underlying graph is preserved after ``capture_end``. In this case,
        the executable graph is not instantiated automatically; it must be explicitly created
        by calling ``instantiate``, or it will be instantiated on the first call to ``replay``.
        Defaults to ``False``.
    pool (tuple[int, int], optional): Memory pool identifier for this graph. Multiple graphs
        can share the same pool by passing the same identifier, which can reduce memory overhead.
        Defaults to ``None``.
    capture_error_mode (Literal["default", "global", "thread_local", "relaxed"], optional):
        Specifies the behavior of graph capture. The exact semantics are backend-specific.
        ``"default"``: backend-defined default capture behavior.
        ``"global"``: potentially unsafe API calls are prohibited. Errors may occur if capture
        in the current thread affects other threads.
        ``"thread_local"``: potentially unsafe API calls are prohibited. Errors occur only if
        capture in the current thread affects itself.
        ``"relaxed"``: the current thread is allowed to make potentially unsafe API calls, except
        for calls that inherently conflict with stream capture.
        Default: ``"default"``.

Example::

    >>> # xdoctest: +SKIP
    >>> x = torch.zeros([2000], device=0)

    >>> stream = torch.Stream()
    >>> graph = torch.accelerator.Graph()
    >>> with stream, graph:
    ...     x += 1

    >>> graph.replay()
Ndefaultpoolcapture_error_mode
keep_graphr   r   )r	   globalthread_localrelaxedreturnc                "   > [         TU ]  X5      $ N)super__new__)clsr   r   r   	__class__s       R/home/wildlama/miniconda3/lib/python3.13/site-packages/torch/accelerator/graphs.pyr   Graph.__new__3   s     ws//    c                <   > [         TU ]  U5        X l        X0l        g r   )r   __init__
graph_poolr   )selfr   r   r   r   s       r   r   Graph.__init__>   s     	$"4r   c                 J   > [         TU ]  U R                  U R                  S9  g)z
Begin graph capture on the current stream.

All operations on the current stream after this call will be recorded into the graph until
``capture_end`` is called, using the memory pool and capture error mode provided at construction time.
r
   N)r   capture_beginr   r   r   r   s    r   r!   Graph.capture_beginL   s&     	T5L5L 	 	
r   c                 "   > [         TU ]  5         g)z|
End graph capture on the current stream of the current device.

After this call, the graph can be replayed via ``replay``.
N)r   capture_endr"   s    r   r%   Graph.capture_endW        	r   c                 "   > [         TU ]  5         g)z
Instantiate the underlying graph. Will be called by ``capture_end``
if ``keep_graph=False``, or by ``replay`` if ``keep_graph=True`` and
``instantiate`` has not already been explicitly called.
N)r   instantiater"   s    r   r)   Graph.instantiate_   r'   r   c                 "   > [         TU ]  5         g)z'Replay the work captured by this graph.N)r   replayr"   s    r   r,   Graph.replayg   s    r   c                 "   > [         TU ]  5         g)z
Delete the graph currently held by this instance.

After this call, the graph can be recaptured. Set :attr:`graph_pool` or
:attr:`capture_error_mode` beforehand to use different settings on the next capture.
N)r   resetr"   s    r   r/   Graph.resetk   s     	r   c                     > [         TU ]  5       $ )a  
Return an opaque token representing the id of this graph's memory pool.

This id can optionally be passed to another graph's ``capture_begin``,
which hints the other graph may share the same memory pool.

Example::
    >>> # xdoctest: +SKIP
    >>> g1 = torch.accelerator.Graph()
    >>> g1.capture_begin()
    >>> # ... operations ...
    >>> g1.capture_end()

    >>> # Share g1's memory pool with a new graph
    >>> pool_id = g1.pool()
    >>> g2 = torch.accelerator.Graph(pool=pool_id)
)r   r   r"   s    r   r   
Graph.poolt   s    $ w|~r   c                     > [         TU ]  5       $ )z)Enable debugging mode for ``debug_dump``.)r   enable_debug_moder"   s    r   r4   Graph.enable_debug_mode   s    w(**r   pathc                 "   > [         TU ]  U5      $ )a  
Dump the captured graph to a file for debugging purposes if the debugging is
enabled via ``enable_debug_mode``.

Arguments:
    path (str): Path to dump the graph to.

Example::
    >>> # xdoctest: +SKIP
    >>> s = torch.Stream()
    >>> g = torch.accelerator.Graph()
    >>> g.enable_debug_mode()

    >>> with s, g:
    >>> # ... operations ...

    >>> # Dump captured graph to a file "graph_dump.dot"
    >>> g.debug_dump("graph_dump.dot")
)r   
debug_dump)r   r6   r   s     r   r8   Graph.debug_dump   s    ( w!$''r   c                 T   [         R                  R                  5         [         R                  R                  R
                  (       a  [        R                  " 5         [         R                  R                  5         [         R                  R                  5         U R                  5         g r   )torchacceleratorsynchronizecompilerconfigforce_cudagraph_gcgccollectempty_cacheempty_host_cacher!   )r   s    r   	__enter__Graph.__enter__   sb    %%'>>  33 JJL%%'**,r   exc_infoc                 $    U R                  5         g r   )r%   )r   rG   s     r   __exit__Graph.__exit__   s    r   )r   r   )F)r   N)__name__
__module____qualname____firstlineno____doc__booltupleintr   r   r   r   r!   r%   r)   r,   r/   r   r4   strr8   rE   objectrI   __static_attributes____classcell__)r   s   @r   r   r   	   s   'V !	0 (, 	0	0 CHo$		0
 $:
	0 
	0 	0 !5 (, 55 CHo$	5
 $:
5 
5 5	
eCHo (+(s (t (,	& T  r   r   )
rA   typingr   typing_extensionsr   r;   torch._Cr   r   __all__ r   r   <module>r\      s-    	  "  &e eP )r   