
    9j                     T    d dl Z d dlmZ d dlmZ d dlZd dlmZ  G d de      ZdgZ	y)    N)Literal)Self)_acceleratorGraphc            
       "    e Zd ZdZ	 dddddedeeef   dz  ded   d	ef fd
Z		 dddddedeeef   dz  ded   d	df fdZ
d fdZd fdZd fdZd fdZd fdZd	eeef   f fdZd fdZded	df fdZddZded	dfdZ xZS )Grapha\  
    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         |   | |      S N)super__new__)clsr   r
   r   	__class__s       X/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/accelerator/graphs.pyr   zGraph.__new__3   s     wsJ//    c                @    t         |   |       || _        || _        y r   )r   __init__
graph_poolr   )selfr   r
   r   r   s       r   r   zGraph.__init__>   s!     	$"4r   c                 P    t         |   | j                  | j                         y)a  
        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   zGraph.capture_beginL   s&     	T5L5L 	 	
r   c                 "    t         |           y)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!   zGraph.capture_endW        	r   c                 "    t         |           y)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$   zGraph.instantiate_   r"   r   c                 "    t         |           y)z'Replay the work captured by this graph.N)r   replayr   s    r   r&   zGraph.replayg   s    r   c                 "    t         |           y)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(   zGraph.resetk   s     	r   c                      t         |          S )aT  
        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
   z
Graph.poolt   s    $ w|~r   c                      t         |          S )z)Enable debugging mode for ``debug_dump``.)r   enable_debug_moder   s    r   r+   zGraph.enable_debug_mode   s    w(**r   pathc                 "    t         |   |      S )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   r,   r   s     r   r.   zGraph.debug_dump   s    ( w!$''r   c                 H   t         j                  j                          t         j                  j                  j
                  rt        j                          t         j                  j                          t         j                  j                          | j                          y r   )torchacceleratorsynchronizecompilerconfigforce_cudagraph_gcgccollectempty_cacheempty_host_cacher   )r   s    r   	__enter__zGraph.__enter__   sb    %%'>>  33 JJL%%'**,r   exc_infoc                 $    | j                          y r   )r!   )r   r;   s     r   __exit__zGraph.__exit__   s    r   )F)r   N)__name__
__module____qualname____doc__booltupleintr   r   r   r   r   r!   r$   r&   r(   r
   r+   strr.   r:   objectr=   __classcell__)r   s   @r   r   r   	   s   'V !	0 (, 	0	0 CHo$		0
 $:
	0 
	0 !5 (, 55 CHo$	5
 $:
5 
5	
eCHo (+(s (t (,	& T r   r   )
r6   typingr   typing_extensionsr   r0   torch._Cr   r   __all__ r   r   <module>rM      s-    	  "  &e eP )r   