
    9jQ+                        d Z ddlmZ ddlmZ ddlmZ ddlZddlm	Z	m
Z
 ddlmZ dd	lmZmZmZmZmZmZmZmZmZmZ g d
ZdefdZdefdZddedej:                  dz  fdZdefdZ  ede       e      Z!de!_         ed de	de"e#ef   fd       Z$de	ddfdZ%  ede       e%      Z&de&_         d de	dejN                  fdZ(dejN                  ddfdZ)d de	ddfdZ* G d d      Z+y)!z]
This package introduces support for the current :ref:`accelerator<accelerators>` in python.
    )cache)Any)
deprecatedN   )	_device_t_get_device_index)Graph)
empty_cacheempty_host_cacheget_memory_infomax_memory_allocatedmax_memory_reservedmemory_allocatedmemory_reservedmemory_statsreset_accumulated_memory_statsreset_peak_memory_stats)r	   current_acceleratorcurrent_device_idxcurrent_device_indexget_device_capabilitycurrent_streamdevice_countdevice_indexr
   r   r   is_availabler   r   r   r   r   r   r   set_device_idxset_device_index
set_streamsynchronizereturnc                  f    t               } | yt        j                  |       }|j                         S )a  Return the number of current :ref:`accelerator<accelerators>` available.

    Returns:
        int: the number of the current :ref:`accelerator<accelerators>` available.
            If there is no available accelerators, return 0.

    .. note:: This API delegates to the device-specific version of `device_count`.
        On CUDA, this API will NOT poison fork if NVML discovery succeeds.
        Otherwise, it will. For more details, see :ref:`multiprocessing-poison-fork-note`.
    r   )r   torchget_device_moduler   accmods     Z/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/accelerator/__init__.pyr   r   6   s3     
C
{

!
!#
&C    c                  f    t               } | yt        j                  |       }|j                         S )a  Check if the current accelerator is available at runtime: it was build, all the
    required drivers are available and at least one device is visible.
    See :ref:`accelerator<accelerators>` for details.

    Returns:
        bool: A boolean indicating if there is an available :ref:`accelerator<accelerators>`.

    .. note:: This API delegates to the device-specific version of `is_available`.
        On CUDA, when the environment variable ``PYTORCH_NVML_BASED_CUDA_CHECK=1`` is set,
        this function will NOT poison fork. Otherwise, it will. For more details, see
        :ref:`multiprocessing-poison-fork-note`.

    Example::

        >>> assert torch.accelerator.is_available() "No available accelerators detected."
    F)r   r"   r#   r   r$   s     r'   r   r   I   s3    * 
C
{

!
!#
&Cr(   check_availablec                 d    t         j                  j                         x}| r| rt               r|S y)aJ  Return the device of the accelerator available at compilation time.
    If no accelerator were available at compilation time, returns None.
    See :ref:`accelerator<accelerators>` for details.

    Args:
        check_available (bool, optional): if True, will also do a runtime check to see
            if the device :func:`torch.accelerator.is_available` on top of the compile-time
            check.
            Default: ``False``

    Returns:
        torch.device: return the current accelerator as :class:`torch.device`.

    .. note:: The index of the returned :class:`torch.device` will be ``None``, please use
        :func:`torch.accelerator.current_device_index` to know the current index being used.
        This API does NOT poison fork. For more details, see :ref:`multiprocessing-poison-fork-note`.

    Example::

        >>> # xdoctest:
        >>> # If an accelerator is available, sent the model to it
        >>> model = torch.nn.Linear(2, 2)
        >>> if (current_device := current_accelerator(check_available=True)) is not None:
        >>>     model.to(current_device)
    N)r"   _C_accelerator_getAcceleratorr   )r*   r%   s     r'   r   r   f   s-    4 xx3355B_Jr(   c                  >    t         j                  j                         S )zReturn the index of a currently selected device for the current :ref:`accelerator<accelerators>`.

    Returns:
        int: the index of a currently selected device.
    )r"   r,   _accelerator_getDeviceIndex r(   r'   r   r      s     88//11r(   z#Use `current_device_index` instead.)categorya  
    (Deprecated) Return the index of a currently selected device for the current :ref:`accelerator<accelerators>`.

    Returns:
        int: the index of a currently selected device.

    .. warning::

        :func:`torch.accelerator.current_device_idx` is deprecated in favor of :func:`torch.accelerator.current_device_index`
        and will be removed in a future PyTorch release.
    devicec                Z    t        | d      }t        j                  j                  |      S )a  Return the capability of the currently selected device.

    Args:
        device (:class:`torch.device`, str, int, optional): The device to query capabilities for
            :ref:`accelerator<accelerators>` device type. If not given,
            use :func:`torch.accelerator.current_device_index` by default.

    Returns:
        dict[str, Any]: A dictionary containing device capability information. The dictionary includes:
            - ``supported_dtypes`` (set(torch.dtype)): Set of PyTorch data types for which
              tensors can be allocated on the accelerator and type conversion across
              supported dtypes are supported. Any operator support outside of that
              is not guaranteed

    Examples:
        >>> # xdoctest: +SKIP("requires cuda")
        >>> # Query capabilities for current device
        >>> capabilities = torch.accelerator.get_device_capability("cuda:0")
        >>> print("Supported dtypes:", capabilities["supported_dtypes"])
    Toptional)r   r"   r,    _accelerator_getDeviceCapabilityr2   r   s     r'   r   r      s%    , %Vd;L8844\BBr(   c                \    t        | d      }t        j                  j                  |       y)a   Set the current device index to a given device.

    Args:
        device (:class:`torch.device`, str, int): a given device that must match the current
            :ref:`accelerator<accelerators>` device type.

    .. note:: This function is a no-op if this device index is negative.
    Fr4   N)r   r"   r,   _accelerator_setDeviceIndexr7   s     r'   r   r      s"     %Ve<L	HH((6r(   zUse `set_device_index` instead.a  
    (Deprecated) Set the current device index to a given device.

    Args:
        device (:class:`torch.device`, str, int): a given device that must match the current
            :ref:`accelerator<accelerators>` device type.

    .. warning::

        :func:`torch.accelerator.set_device_idx` is deprecated in favor of :func:`torch.accelerator.set_device_index`
        and will be removed in a future PyTorch release.
    c                Z    t        | d      }t        j                  j                  |      S )a  Return the currently selected stream for a given device.

    Args:
        device (:class:`torch.device`, str, int, optional): a given device that must match the current
            :ref:`accelerator<accelerators>` device type. If not given,
            use :func:`torch.accelerator.current_device_index` by default.

    Returns:
        torch.Stream: the currently selected stream for a given device.
    Tr4   )r   r"   r,   _accelerator_getStreamr7   s     r'   r   r      s%     %Vd;L88**<88r(   streamc                 B    t         j                  j                  |        y)a  Set the current stream to a given stream.

    Args:
        stream (torch.Stream): a given stream that must match the current :ref:`accelerator<accelerators>` device type.

    .. note:: This function will set the current device index to the device index of the given stream.
    N)r"   r,   _accelerator_setStream)r<   s    r'   r   r      s     
HH##F+r(   c                \    t        | d      }t        j                  j                  |       y)a  Wait for all kernels in all streams on the given device to complete.

    Args:
        device (:class:`torch.device`, str, int, optional): device for which to synchronize. It must match
            the current :ref:`accelerator<accelerators>` device type. If not given,
            use :func:`torch.accelerator.current_device_index` by default.

    .. note:: This function is a no-op if the current :ref:`accelerator<accelerators>` is not initialized.

    Example::

        >>> # xdoctest: +REQUIRES(env:TORCH_DOCTEST_CUDA)
        >>> assert torch.accelerator.is_available() "No available accelerators detected."
        >>> start_event = torch.Event(enable_timing=True)
        >>> end_event = torch.Event(enable_timing=True)
        >>> start_event.record()
        >>> tensor = torch.randn(100, device=torch.accelerator.current_accelerator())
        >>> sum = torch.sum(tensor)
        >>> end_event.record()
        >>> torch.accelerator.synchronize()
        >>> elapsed_time_ms = start_event.elapsed_time(end_event)
    Tr4   N)r   r"   r,   _accelerator_synchronizeDevicer7   s     r'   r   r      s"    . %Vd;L	HH++L9r(   c                   >    e Zd ZdZdedz  ddfdZd	dZdeddfdZy)
r   a  Context manager to set the current device index for the current :ref:`accelerator<accelerators>`.
    Temporarily changes the current device index to the specified value for the duration
    of the context, and automatically restores the previous device index when exiting
    the context.

    Args:
        device (Optional[int]): a given device index to temporarily set. If None,
            no device index switching occurs.

    Examples:

        >>> # xdoctest: +REQUIRES(env:TORCH_DOCTEST_CUDA)
        >>> # Set device 0 as the current device temporarily
        >>> with torch.accelerator.device_index(0):
        ...     # Code here runs with device 0 as the current device
        ...     pass
        >>> # Original device is now restored
        >>> # No-op when None is passed
        >>> with torch.accelerator.device_index(None):
        ...     # No device switching occurs
        ...     pass
    r2   Nr    c                     || _         d| _        y )N)idxprev_idx)selfr2   s     r'   __init__zdevice_index.__init__)  s    r(   c                 z    | j                   /t        j                  j                  | j                         | _        y y N)rD   r"   r,   _accelerator_exchangeDevicerE   )rF   s    r'   	__enter__zdevice_index.__enter__-  s+    88!HH@@JDM  r(   exc_infoc                 p    | j                   *t        j                  j                  | j                         y y rI   )rD   r"   r,    _accelerator_maybeExchangeDevicerE   )rF   rL   s     r'   __exit__zdevice_index.__exit__1  s'    88HH55dmmD  r(   )r    N)	__name__
__module____qualname____doc__intrG   rK   objectrO   r0   r(   r'   r   r     s:    .sTz  KE& ET Er(   r   )FrI   ),rS   	functoolsr   typingr   typing_extensionsr   r"   _utilsr   r   graphsr	   memoryr
   r   r   r   r   r   r   r   r   r   __all__rT   r   boolr   r2   r   r   FutureWarningr   dictstrr   r   r   Streamr   r   r   r   r0   r(   r'   <module>rb      sU     (  0   6c &d : %,,:M @2c 2Z)  

   C) C$sCx. C C4
7Y 
7d 
7% 
 99 95<< 9,u|| , ,:	 : :6"E "Er(   