
    8h                      Z   S r SSKJr  SSKJr  SSKrSSKJrJr  / SQr	S\
4S	 jrS\4S
 jrSS\S\\R                     4S jjrS\
4S jr\" S\S9" \5      rS\SS4S jr\" S\S9" \5      rSS\S\R*                  4S jjrS\R*                  SS4S jrSS\SS4S jjr " S S5      rg)z]
This package introduces support for the current :ref:`accelerator<accelerators>` in python.
    )Optional)
deprecatedN   )	_device_t_get_device_index)current_acceleratorcurrent_device_idxcurrent_device_indexcurrent_streamdevice_countdevice_indexis_availableset_device_idxset_device_index
set_streamsynchronizereturnc                  j    [        5       n U c  g[        R                  " U 5      nUR                  5       $ )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     T/var/www/fran/franai/venv/lib/python3.13/site-packages/torch/accelerator/__init__.pyr   r      s3     
C
{

!
!#
&C    c                  j    [        5       n U c  g[        R                  " U 5      nUR                  5       $ )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   /   s3    * 
C
{

!
!#
&Cr   check_availablec                     [         R                  R                  5       =nb  U (       a  U (       a  [        5       (       a  U$ g)a  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   L   s/    4 xx3355B_Jr   c                  >    [         R                  R                  5       $ )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
   l   s     88//11r   z#Use `current_device_index` instead.)categorydevicec                V    [        U SS9n[        R                  R                  U5        g)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.
FoptionalN)r   r   r   _accelerator_setDeviceIndexr%   r   s     r   r   r   {   s"     %Ve<L	HH((6r   zUse `set_device_index` instead.c                T    [        U SS9n[        R                  R                  U5      $ )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.
Tr'   )r   r   r   _accelerator_getStreamr*   s     r   r   r      s%     %Vd;L88**<88r   streamc                 B    [         R                  R                  U 5        g)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                V    [        U SS9n[        R                  R                  U5        g)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)
Tr'   N)r   r   r   _accelerator_synchronizeDevicer*   s     r   r   r      s"    . %Vd;L	HH++L9r   c                   L    \ rS rSrSrS\\   SS4S jrSS jrS\	SS4S	 jr
S
rg)r      aM  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
r%   r   Nc                    Xl         SU l        g )Nidxprev_idx)selfr%   s     r   __init__device_index.__init__   s    r   c                 |    U R                   b/  [        R                  R                  U R                   5      U l        g g N)r7   r   r   _accelerator_exchangeDevicer8   )r9   s    r   	__enter__device_index.__enter__   s+    88!HH@@JDM  r   exc_infoc                 r    U R                   b*  [        R                  R                  U R                  5        g g r=   )r7   r   r    _accelerator_maybeExchangeDevicer8   )r9   rA   s     r   __exit__device_index.__exit__   s'    88HH55dmmD  r   r6   )r   N)__name__
__module____qualname____firstlineno____doc__r   intr:   r?   objectrD   __static_attributes__r#   r   r   r   r      s:    .x} D KE& ET Er   r   )Fr=   )rJ   typingr   typing_extensionsr   r   _utilsr   r   __all__rK   r   boolr   r%   r   r
   FutureWarningr	   r   r   Streamr   r   r   r   r#   r   r   <module>rU      s     (  0c &d : (5<<:P @2c 2  )  
7Y 
7d 
7 % 99 95<< 9,u|| , ,:	 : :6"E "Er   