
    9jT                    "   U d Z ddlmZ ddlZddlZddlmZ ddlmZm	Z	m
Z
 ddlZddlZddlmZmZ e
rddlmZ ddlmZ d	d
lmZ d	dlmZmZmZmZmZ d	dlmZmZ da ej@                         Z! ejD                         Z#g a$de%d<    e&ejN                  dd       Z( e       a)dZ*de%d<   d@dZ+ e+       rCejN                  jX                  Z,ejN                  jZ                  Z.ejN                  j^                  Z0n ed      Z,dAdZ.dAdZ0 ed	      dBd       Z1d@dZ2dCdDdZ3d@dZ4d Z5dEd Z6dEd!Z7dEd"Z8 G d# d$      Z9 G d% d      Z: G d& d'e:      Z;dFd(Z<dGdHd)Z= ed      dGdId*       Z>	 dG	 	 	 dJd+Z?dBd,Z@dKd-ZAdLd.ZB G d/ d0      ZCdMd1ZDdEd2ZEdNd3ZFdGdOd4ZGdGdPd5ZHdGdFd6ZIdQd7ZJdRd8ZKdSd9ZL	 dT	 	 	 	 	 dUd:ZMdTdVd;ZNd	d<lOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z` d	d=lambZbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZj  e	d>ekelelf         Zmg d?Zny)Wz
This package introduces support for the XPU backend, specifically tailored for
Intel GPU optimization.

This package is lazily initialized, so you can always import it, and use
:func:`is_available()` to determine if your system supports XPU.
    )annotationsN)	lru_cache)AnyNewTypeTYPE_CHECKING)_dummy_type_LazySeedTracker)Callable)Device   )_get_device_index)graphgraph_pool_handleis_current_stream_capturingmake_graphed_callablesXPUGraph)EventStreamFz*list[tuple[Callable[[], None], list[str]]]_queued_calls_xpu_isInBadForkc                      yNF r       R/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/xpu/__init__.py<lambda>r   ,   s    r   r   ztuple[torch._C.Generator]default_generatorsc                 6    t         j                  j                  S )z(Return true if compile with XPU support.)torch_C_has_xpur   r   r   _is_compiledr"   1   s    88r   _XpuDevicePropertiesdevicec                    t        d      Nz(PyTorch was compiled without XPU supportNotImplementedErrorr$   s    r   _exchange_devicer*   >       !"LMMr   c                    t        d      r&   r'   r)   s    r   _maybe_exchange_devicer-   A   r+   r   )maxsizec                 T    t               syt        j                  j                         S )z*Return the number of XPU device available.r   )r"   r   r    _xpu_getDeviceCountr   r   r   device_countr1   E   s     >88''))r   c                     t               dkD  S )z7Return a bool indicating if XPU is currently available.r   )r1   r   r   r   is_availabler3   M   s     >Ar   c                p    t               sy| xs( t        j                  j                         j                  S )zKReturn a bool indicating if the current XPU device supports dtype bfloat16.F)r3   r   xpuget_device_propertieshas_bfloat16_conversions)including_emulations    r   is_bf16_supportedr9   S   s.    > 	F99**,EEr   c                 h    t               syt        j                  j                         j                  S )zGReturn a bool indicating if the current XPU device supports dtype tf32.F)r3   r   r5   r6   'has_subgroup_matrix_multiply_accumulater   r   r   is_tf32_supportedr<   ]   s%    >
 99**,TTTr   c                 (    t         xr t                S )z8Return whether PyTorch's XPU state has been initialized.)_initialized_is_in_bad_forkr   r   r   is_initializedr@   h   s    1 111r   c                f   t               r |         y |j                  dd      r)t        j                  | t	        j
                                y |j                  dd      r)t        j                  | t	        j
                                y t        j                  | t	        j
                         f       y )Nseed_allFseed)	r@   get_lazy_seed_trackerqueue_seed_all	tracebackformat_stack
queue_seedr   append)callablekwargss     r   
_lazy_callrM   m   s{    
 ::j%(--h	8N8N8PQZZ&))(I4J4J4LM   (I,B,B,D!EFr   c                     t                y)zInitialize PyTorch's XPU state.
    This is a Python API about lazy initialization that avoids initializing
    XPU until the first time it is accessed. Does nothing if the XPU state is
    already initialized.
    N)
_lazy_initr   r   r   initrP   {   s	     Lr   c            	        t               st        t        d      ry t        5  t               r
	 d d d        y t	               rt        d      t               st        d      t        j                  j                          dt        _        t        j                  d t        j                         D               	 t        D ]  \  } }	  |          	 t'        t        d       dad d d        y # t         $ r1}dt#        |       ddj%                  |       }t!        |      |d }~ww xY w# t'        t        d       w xY w# 1 sw Y   y xY w)	Nis_initializingzuCannot re-initialize XPU in forked subprocess. To use XPU with multiprocessing, you must use the 'spawn' start methodz#Torch not compiled with XPU enabledTc              3  &   K   | ]	  }|s|  y wNr   ).0callss     r   	<genexpr>z_lazy_init.<locals>.<genexpr>   s     XuRWUXs   z5XPU call failed lazily at initialization with error: z'

XPU call was originally invoked at:

 )r@   hasattr_tls_initialization_lockr?   RuntimeErrorr"   AssertionErrorr   r    	_xpu_initrR   r   extendrE   	get_calls	Exceptionstrjoindelattrr>   )queued_callorig_tracebackemsgs       r   rO   rO      sA   74):;	 ! 	! ! I  ~ !FGG  $X0B0L0L0NXX	-/< 0+^0M0 D+,C! !2 ! 0OPSTUPVx XBBD''.BYAZ\  $C.a/0 D+,A! !sM   D=BD=9D(C+D(D=+	D%4,D  D%%D((D::D==Ec                  "    e Zd ZddZd ZddZy)_DeviceGuardc                     || _         d| _        y N)idxprev_idx)selfindexs     r   __init__z_DeviceGuard.__init__   s    r   c                `    t         j                  j                  | j                        | _        y rT   r   r5   r*   rn   ro   rp   s    r   	__enter__z_DeviceGuard.__enter__       		22488<r   c                `    t         j                  j                  | j                        | _        yr   r   r5   r-   ro   rn   rp   typevaluerG   s       r   __exit__z_DeviceGuard.__exit__       9933DMMBr   N)rq   intreturnNoner{   r   r|   r   rG   r   )__name__
__module____qualname__rr   rv   r}   r   r   r   rj   rj      s    =r   rj   c                  &    e Zd ZdZddZd ZddZy)r$   zContext-manager that changes the selected device.

    Args:
        device (torch.device or int or str): device index to select. It's a no-op if
            this argument is a negative integer or ``None``.
    c                6    t        |d      | _        d| _        y )NToptionalrm   )r   rn   ro   )rp   r$   s     r   rr   zdevice.__init__   s    $Vd;r   c                `    t         j                  j                  | j                        | _        y rT   rt   ru   s    r   rv   zdevice.__enter__   rw   r   c                `    t         j                  j                  | j                        | _        yr   ry   rz   s       r   r}   zdevice.__exit__   r~   r   N)r$   r   r   r   r   )r   r   r   __doc__rr   rv   r}   r   r   r   r$   r$      s    =r   c                  $     e Zd ZdZd fdZ xZS )	device_ofa  Context-manager that changes the current device to that of given object.

    You can use both tensors and storages as arguments. If a given object is
    not allocated on a XPU, this is a no-op.

    Args:
        obj (Tensor or Storage): object allocated on the selected device.
    c                `    |j                   r|j                         nd}t        |   |       y rl   )is_xpu
get_devicesuperrr   )rp   objrn   	__class__s      r   rr   zdevice_of.__init__   s$    "%**cnn"r   r   r   )r   r   r   r   rr   __classcell__)r   s   @r   r   r      s     r   r   c                x    t                t        |       } | dk\  r t        j                  j	                  |        yy)zSet the current device.

    Args:
        device (torch.device or int or str): selected device. This function is a
            no-op if this argument is negative.
    r   N)rO   r   r   r    _xpu_setDevicer)   s    r   
set_devicer      s1     Lv&F{' r   c                ,    t        |       j                  S )a  Get the name of a device.

    Args:
        device (torch.device or int or str, optional): device for which to
            return the name. This function is a no-op if this argument is a
            negative integer. It uses the current device, given by :func:`~torch.xpu.current_device`,
            if :attr:`device` is ``None`` (default).

    Returns:
        str: the name of the device
    )r6   namer)   s    r   get_device_namer      s     !(---r   c           	        t        |       }t        t        t        t        t        d      t        t        t        f}t        |      D ci c].  }|j                  d      st        t        ||      x}|      r||0 c}S c c}w )a  Get the xpu capability of a device.

    Args:
        device (torch.device or int or str, optional): device for which to
            return the device capability. This function is a no-op if this
            argument is a negative integer. It uses the current device, given by
            :func:`~torch.xpu.current_device`, if :attr:`device` is ``None``
            (default).

    Returns:
        dict[str, Any]: the xpu capability dictionary of the device
    N__)r6   r   floatboolrb   r{   listtupledictdir
startswith
isinstancegetattr)r$   propsserializable_typeskeyr|   s        r   get_device_capabilityr      sv     "&)EudCdT5$O u:~~d#!447IJ 	U
  s   3A>c                F    t                t        | d      } t        |       S )a  Get the properties of a device. Returns _XpuDeviceProperties containing the following device properties:

    - ``name`` (str): device name.
    - ``platform_name`` (str): SYCL platform name.
    - ``vendor`` (str): device vendor.
    - ``device_id`` (int): device identifier (product ID).
    - ``driver_version`` (str): driver version.
    - ``version`` (str): runtime version.
    - ``max_compute_units`` (int): number of parallel compute units.
    - ``gpu_eu_count`` (int): number of EUs (Execution Unit).
    - ``max_work_group_size``: (int): maximum number of work-items permitted in a work-group.
    - ``max_num_sub_groups`` (int): maximum number of sub-groups supported in a work-group.
    - ``memory_clock_rate`` (int) maximum clock rate of device's global memory in MHz.
    - ``memory_bus_width`` (int) maximum bus width between device and memory in bits.
    - ``sub_group_sizes``: (list[int]): a list of supported sub-group sizes.
    - ``local_mem_size`` (int): device local memory capacity that can be allocated per work-group in bytes.
    - ``has_fp16`` (bool): whether float16 dtype is supported.
    - ``has_fp64`` (bool): whether float64 dtype is supported.
    - ``has_atomic64`` (bool): whether 64-bit atomic operations are supported.
    - ``has_bfloat16_conversions`` (bool): whether bfloat16 conversions are supported.
    - ``has_subgroup_matrix_multiply_accumulate`` (bool): whether DPAS (Dot Product Accumulate Systolic) is supported.
    - ``has_subgroup_matrix_multiply_accumulate_tensor_float32`` (bool): whether DPAS with tf32 inputs is supported.
    - ``has_subgroup_2d_block_io`` (bool): whether 2D block I/O for efficient matrix multiplication is supported.
    - ``total_memory`` (int): device global memory in bytes.
    - ``gpu_subslice_count`` (int): number of subslice.
    - ``architecture`` (int): device architecture identifier (experimental).
    - ``type`` (str): device type, e.g. 'cpu', 'gpu', accelerator', 'host', 'unknown'.
    - ``uuid`` (Any): device UUID (Universal Unique ID), 16 bytes.

    Args:
        device (torch.device or int or str): device for which to return the
            properties of the device.

    Returns:
        _XpuDeviceProperties: the properties of the device
    Tr   )rO   r   _get_device_propertiesr)   s    r   r6   r6     s!    N Lv5F!&))r   c                 R    t                t        j                  j                         S )z0Return the index of a currently selected device.)rO   r   r    _xpu_getDevicer   r   r   current_devicer   =  s    L88""$$r   c                    t        | t              rt        j                  |       } | S t        | t              rt        j                  d|       } | S )zReturn the torch.device type object from the passed in device.

    Args:
        device (torch.device or int or str): selected device.
    r5   )r   rb   r   r$   r   r)   s    r   _get_devicer   C  sD     &#f% M 
FC	 eV,Mr   c                    t                t        | d      } t        |d      }t        j                  j	                  | |      S )a/  Query whether a device can access a peer device's memory.

    Args:
        device (torch.device or int or str): selected device.
        peer (torch.device or int or str): peer device to query access to.

    Returns:
        bool: ``True`` if ``device`` can access ``peer``, ``False`` otherwise.
    Tr   )rO   r   r   r    _xpu_canDeviceAccessPeer)r$   peers     r   can_device_access_peerr   P  s8     Lv5FTD1D88,,VT::r   c                  2    e Zd ZU dZded<   ddZd Zd	dZy)
StreamContexta  Context-manager that selects a given stream.

    All XPU kernels queued within its context will be enqueued on a selected
    stream.

    Args:
        Stream (Stream): selected stream. This manager is a no-op if it's
            ``None``.
    .. note:: Streams are per-device.
    torch.xpu.Stream | None
cur_streamc                \    || _         t        d d      | _        | j                  d| _        y y )NTrm   )streamr   rn   )rp   r   s     r   rr   zStreamContext.__init__n  s-    $T4088DH r   c                   | j                   }|| j                  dk(  ry t        j                  j	                  d       | _        | j
                  j                  |j                  k7  rLt        |j                        5  t        j                  j	                  |j                        | _        d d d        t        j                  j                  |       y # 1 sw Y   )xY wrl   )	r   rn   r   r5   current_streamsrc_prev_streamr$   dst_prev_stream
set_stream)rp   r   s     r   rv   zStreamContext.__enter__t  s    [[
R$yy77= &&**;*;;
))* S',yy'?'?
@Q@Q'R$S		Z(S Ss   ;/CCc                *   | j                   }|| j                  dk(  ry | j                  j                  |j                  k7  r)t        j
                  j                  | j                         t        j
                  j                  | j                         y rl   )r   rn   r   r$   r   r5   r   r   )rp   r{   r|   rG   r   s        r   r}   zStreamContext.__exit__  sj    [[
R &&**;*;;II  !5!56		T112r   N)r   r   r   r   r   )r   r   r   r   __annotations__rr   rv   r}   r   r   r   r   r   `  s    	 ('
)3r   r   c                    t        |       S )zWrap around the Context-manager StreamContext that selects a given stream.

    Arguments:
        stream (Stream): selected stream. This manager is a no-op if it's ``None``.
    )r   r   s    r   r   r     s       r   c                H    t         j                  j                  | ||       y)a  set stream specified by the stream id, device index and device type

    Args: stream_id (int): not visible to the user, used to assigned to the specific stream.
          device_index (int): selected device index.
          device_type (int): selected device type.
    	stream_iddevice_indexdevice_typeN)r   r    _xpu_setStreamr   s      r   _set_stream_by_idr     s$     
HH!  r   c                v    | yt                t        | j                  | j                  | j                         y)a  Set the current stream. This is a wrapper API to set the stream.
        Usage of this function is discouraged in favor of the ``stream``
        context manager.

    Args:
        stream (Stream): selected stream. This function is a no-op
            if this argument is ``None``.
    Nr   )rO   r   r   r   r   r   s    r   r   r     s4     ~L""((&&r   c                    t                t        j                  j                  t	        | d            }t        |d   |d   |d         S )aR  Return the currently selected :class:`Stream` for a given device.

    Args:
        device (torch.device or int, optional): selected device. Returns
            the currently selected :class:`Stream` for the current device, given
            by :func:`~torch.xpu.current_device`, if :attr:`device` is ``None``
            (default).
    Tr   r   r      r   )rO   r   r    _xpu_getCurrentStreamr   r   )r$   
streamdatas     r   r   r     sJ     L//&40J Q-jmTU r   c                    t                t        j                  j                  | t	        |d            }t        |d   |d   |d         S )a;  Return a :class:`Stream` from an external SYCL queue.

    This function is used to wrap SYCL queue created in other libraries in order
    to facilitate data exchange and multi-library interactions.

    .. note:: This function doesn't manage the queue life-cycle, it is the user
       responsibility to keep the referenced queue alive while this returned stream is
       being used. The different SYCL queue pointers will result in distinct
       :class:`Stream` objects, even if the SYCL queues they dereference are equivalent.

    Args:
        data_ptr(int): Integer representation of the `sycl::queue*` value passed externally.
        device(torch.device or int, optional): the device where the queue was originally created.
            It is the user responsibility to ensure the device is specified correctly.
    Tr   r   r   r   r   )rO   r   r    _xpu_getStreamFromExternalr   r   )data_ptrr$   r   s      r   get_stream_from_externalr     sM      L44#FT:J Q-jmTU r   c                n    t                t        | d      } t        j                  j	                  |       S )a*  Wait for all kernels in all streams on a XPU device to complete.

    Args:
        device (torch.device or int, optional): device for which to synchronize.
            It uses the current device, given by :func:`~torch.xpu.current_device`,
            if :attr:`device` is ``None`` (default).
    Tr   )rO   r   r   r    _xpu_synchronizer)   s    r   synchronizer     s*     Lv5F88$$V,,r   c                 ~    t               sg S t        j                  j                         } | g S | j	                         S )z<Return list XPU architectures this library was compiled for.)r"   r   r    _xpu_getArchFlagssplit)
arch_flagss    r   get_arch_listr     s8    >	++-J	r   c                 j    t               } t        |       dk(  ryddj                  d | D               S )zIReturn XPU AOT(ahead-of-time) build flags this library was compiled with.r   rX   z-device ,c              3      K   | ]  }|  y wrT   r   )rU   archs     r   rW   z$get_gencode_flags.<locals>.<genexpr>  s     :t:s   )r   lenrc   )	arch_lists    r   get_gencode_flagsr     s5    I
9~chh:	::;<<r   c                l    | j                   }|
t               }t        j                  j                  |   S )zuReturn the XPU Generator object for the given device.

    Args:
        device (torch.device): selected device.
    )rq   r   r   r5   r   )r$   rn   s     r   _get_generatorr     s/     ,,C
{99'',,r   c                B     t        |      d fd}t        |       y)a$  Set the random number generator state offset of the specified GPU.

    Args:
        offset (int): The desired offset
        device (torch.device or int, optional): The device to set the RNG state.
            Default: ``'xpu'`` (i.e., ``torch.device('xpu')``, the current XPU device).
    c                 >    t              } | j                         y rT   )r   
set_offset)default_generatorfinal_deviceoffsets    r   cbz!_set_rng_state_offset.<locals>.cb  s    *<8$$V,r   Nr   )r   rM   )r   r$   r   r   s   `  @r   _set_rng_state_offsetr     s     v&L- rNr   c                b    t                t        |       }t        |      }|j                         S )aL  Return the random number generator state offset of the specified GPU.

    Args:
        device (torch.device or int, optional): The device to return the RNG state offset of.
            Default: ``'xpu'`` (i.e., ``torch.device('xpu')``, the current XPU device).

    .. warning::
        This function eagerly initializes XPU.
    )rO   r   r   
get_offset)r$   r   r   s      r   _get_rng_state_offsetr     s-     Lv&L&|4''))r   )change_current_allocatorempty_cacheget_per_process_memory_fractionmax_memory_allocatedmax_memory_reservedmem_get_infomemory_allocatedmemory_reservedmemory_snapshotmemory_statsmemory_stats_as_nested_dictMemPoolreset_accumulated_memory_statsreset_peak_memory_statsset_per_process_memory_fractionuse_mem_poolXPUPluggableAllocator)	get_rng_stateget_rng_state_allinitial_seedmanual_seedmanual_seed_allrC   rB   set_rng_stateset_rng_state_all_POOL_HANDLE)9r   r   r   r  r   r   r   r   r   r   r$   r   r1   r   r   r   r   r6   r   r   r  r  r   r   r   rP   r  r3   r9   r   r@   r<   r   r  r  r   r   r   r   r   r   r   r   r   r  r   r   rC   rB   r   r   r  r	  r   r   streamsr   )r   r   )r$   r   r   r   )r   r   )T)r8   r   r   r   r   )r$   r   r   r   rT   )r$   r   r   rb   )r$   r   r   zdict[str, Any])r$   r   r   r#   )r$   int | str | torch.devicer   torch.device)r$   r   r   r   r   r   )r   r   r   r   )r   r   r   r   )r$   r   r   r   )r   r   r$   r   r   r   )r   z	list[str])r   rb   )r$   r  r   ztorch._C.Generator)r5   )r   r   r$   r  r   r   )r$   r  r   r   )or   
__future__r   	threadingrG   	functoolsr   typingr   r   r   r   torch._Ctorch._utilsr   r	   collections.abcr
   torch.typesr   _utilsr   graphsr   r   r   r   r   r  r   r   r>   localrZ   Lockr[   r   r   r   r    r?   rE   r   r"   r#   _xpu_exchangeDevicer*   _xpu_maybeExchangeDevicer-   r1   r3   r9   r<   r@   rM   rP   rO   rj   r$   r   r   r   r   r6   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   memoryr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  randomr  r  r  r  r  rC   rB   r  r	  r   r   r
  __all__r   r   r   <module>r     sK   #    . .   6 (" %  # y%y~~'      %(($6F%' 02 - 2
 > 8888xx33"XX>> ''=>NN 1* *U2
G%P
 
 ( 
(. 4 2 )*)*)*X%
; (3 (3V!&$2
-=	- 5:1	&*"    &
 
 
 ~uS#X7:r   