
    %VjiU                        U d Z ddlZddlZ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Zeeegef                  ed<   ej                                        rddlmZ ndZi Zeee
f         ed	<   i Zeeef         ed
<    G d d          Z G d d          Z G d de          Zeeegef                  ed<   ej                                        rddlmZ  ndZ  G d de          Z!eeegef                  ed<   ej"                                        rddlm#Z$ ndZ$ G d de          Z%e G d d                      Z& G d de          Z' G d de          Z(i Z)eee*e         f         ed<   d a+d!eeej,        f         d"e*e         d#dfd$Z-d!eeej,        f         d#e*e         fd%Z.d#ee/ee*e         f                  fd&Z0d(d'Z1dS ))a  
Device abstraction layer for TorchDynamo and Inductor backends.

This module provides a unified interface for different hardware backends (CUDA, XPU,
CPU, MPS, MTIA) through a common device interface. Key components include:

- DeviceInterface: Base class defining the common API for all device types
- Device-specific implementations: CudaInterface, XpuInterface, CpuInterface, MpsInterface, MtiaInterface
- Device registration system for managing available backends
- Worker APIs for multi-processing scenarios
- Stream and event management across different devices
- Device property caching for worker processes

The abstraction layer enables device-agnostic code in TorchDynamo while allowing
specialized implementations for each hardware backend's unique features.
    N)
namedtuple)Iterable)	dataclass)AnyCallableLiteralOptionalUnionget_cuda_stream)_cuda_getCurrentRawStream caching_worker_device_propertiescaching_worker_current_devicesc            	          e Zd ZdZ G d d          Z G d d          Z G d d          Z G d d	          Zed
e	fd            Z
edej        j        d
dfd            Zede	d
e	fd            Zede	d
e	fd            Zed
e	fd            Zed
efd            Zedej        d
efd            Zed
ej        fd            Zedej        d
dfd            Zede	de	de	d
dfd            Zede	d
e	fd            Zed'dej        j        d
dfd            Zed'dej        j        d
efd            Zed'dej        j        d
efd            Zed(d ed
efd!            Ze	 d(d"ej        d ed
efd#            Z ed'dej        j        d
e	fd$            Z!ed'dej        j        d
efd%            Z"ed'dej        j        d
dfd&            Z#dS ))DeviceInterfacez
    This is a simple device runtime interface for Inductor. It enables custom
    backends to be integrated with Inductor in a device-agnostic semantic.
    c                   2    e Zd Zdej        j        defdZdS )DeviceInterface.devicedevicereturnc                     t           NNotImplementedErrorclsr   s     X/root/voice-cloning/.venv/lib/python3.11/site-packages/torch/_dynamo/device_interface.py__new__zDeviceInterface.device.__new__.   s    %%    N)__name__
__module____qualname__torchtypesDevicer   r    r   r   r   r   -   s;        	&!3 	& 	& 	& 	& 	& 	& 	&r   r   c                   "    e Zd ZdededefdZdS )DeviceInterface.Eventargskwargsr   c                      t          d          )NzYEvent should be inherited from torch.Event, otherwise, it couldn't be captured by dynamo.r   r   r'   r(   s      r   r   zDeviceInterface.Event.__new__2   s    %k  r   Nr   r   r    r   r   r$   r   r   Eventr&   1   =        	 	s 	s 	 	 	 	 	 	r   r,   c                   "    e Zd ZdededefdZdS )DeviceInterface.Streamr'   r(   r   c                      t          d          )Nz[Stream should be inherited from torch.Stream, otherwise, it couldn't be captured by dynamo.r   r*   s      r   r   zDeviceInterface.Stream.__new__8   s    %m  r   Nr+   r$   r   r   Streamr/   7   r-   r   r1   c                       e Zd ZdZededdfd            Zedefd            Zeddej	        j
        defd            ZdS )	DeviceInterface.Workera  
        Worker API to query device properties that will work in multi processing
        workers that cannot use the GPU APIs (due to processing fork() and
        initialization time issues). Properties are recorded in the main process
        before we fork the workers.
        r   r   Nc                     t           r   r   r   s    r   
set_devicez!DeviceInterface.Worker.set_deviceE       %%r   c                      t           r   r   r$   r   r   current_devicez%DeviceInterface.Worker.current_deviceI   r7   r   c                     t           r   r   r5   s    r   get_device_propertiesz,DeviceInterface.Worker.get_device_propertiesM   r7   r   r   )r   r   r    __doc__staticmethodintr6   r9   r!   r"   r#   r   r;   r$   r   r   Workerr3   =   s        	 	 
	&s 	&t 	& 	& 	& 
	& 
	& 	& 	& 	& 
	& 
	& 	&%+*< 	& 	& 	& 	& 
	& 	& 	&r   r?   r   c                      t           r   r   r$   r   r   r9   zDeviceInterface.current_deviceQ       !!r   Nc                     t           r   r   r5   s    r   r6   zDeviceInterface.set_deviceU   rA   r   c                     t           r   r   r5   s    r   maybe_exchange_devicez%DeviceInterface.maybe_exchange_deviceY   rA   r   c                     t           r   r   r5   s    r   exchange_devicezDeviceInterface.exchange_device]   rA   r   c                      t           r   r   r$   r   r   device_countzDeviceInterface.device_counta   rA   r   c                      t           r   r   r$   r   r   is_availablezDeviceInterface.is_availablee   rA   r   streamc                     t           r   r   rK   s    r   rK   zDeviceInterface.streami   rA   r   c                      t           r   r   r$   r   r   current_streamzDeviceInterface.current_streamm   rA   r   c                     t           r   r   rM   s    r   
set_streamzDeviceInterface.set_streamq   rA   r   	stream_iddevice_indexdevice_typec                     t           r   r   )rR   rS   rT   s      r   _set_stream_by_idz!DeviceInterface._set_stream_by_idu   rA   r   
device_idxc                     t           r   r   rW   s    r   get_raw_streamzDeviceInterface.get_raw_streamy   rA   r   c                     t           r   r   r5   s    r   synchronizezDeviceInterface.synchronize}   rA   r   c                 6    | j                             |          S r   )r?   r;   r   s     r   r;   z%DeviceInterface.get_device_properties   s    z//777r   c                     t           r   r   r5   s    r   get_compute_capabilityz&DeviceInterface.get_compute_capability   rA   r   Fincluding_emulationc                     t           r   r   r`   s    r   is_bf16_supportedz!DeviceInterface.is_bf16_supported   rA   r   dtypec                 L    |t           j        k    p|                     |          S r   )r!   bfloat16rc   r   rd   r`   s      r   is_dtype_supportedz"DeviceInterface.is_dtype_supported   s%     &T#*?*?@S*T*TTr   c                     t           r   r   r5   s    r   memory_allocatedz DeviceInterface.memory_allocated   rA   r   c                     dS )z
        Returns True if the device has Triton support, False otherwise, even if
        the appropriate Triton backend is not available.
        Fr$   r5   s    r   is_triton_capablez!DeviceInterface.is_triton_capable   s	     ur   c                 L    |                                  st          d          dS )aH  
        Raises a `RuntimeError` with the appropriate human-readable instructions
        to resolve the issue if Triton is not available for the given device, or
        the default device if `device` is `None`.

        The caller should ensure the presence of the 'triton' package before
        calling this method.
        z/This device is not capable of supporting TritonN)rl   RuntimeErrorr   s     r   raise_if_triton_unavailablez+DeviceInterface.raise_if_triton_unavailable   s4     $$&& 	RPQQQ	R 	Rr   r   F)$r   r   r    r<   r   r,   r1   r?   r=   r>   r9   r!   r"   r#   r6   rD   rF   rH   boolrJ   r   rK   rO   rQ   rV   rZ   r\   classmethodr;   r_   rc   rd   rh   rj   rl   ro   r$   r   r   r   r   '   s        
& & & & & & & &              & & & & & & & &( "C " " " \" "5;- "$ " " " \" "c "c " " " \" " " " " " \" "# " " " \" "$ " " " \" "u| " " " " \" "EL " " " \" "5< "D " " " \" "S " "# "RV " " " \" "3 "3 " " " \" " "EK. "$ " " " \" 8 85;+= 8 8 8 8 [8 " "u{'9 "S " " " \" " "t " " " " \" =BU UKU6:U	U U U [U
 " "!3 "s " " " \"  %+"4     \ 
R 
R1C 
Rt 
R 
R 
R [
R 
R 
Rr   r   c            	       j    e Zd ZdZdee         dee         ddfdZddZ	de
d	e
d
e
ded         fdZdS )DeviceGuarda_  
    This class provides a context manager for device switching. This is a stripped
    down version of torch.{device_name}.device.

    The context manager changes the current device to the given device index
    on entering the context and restores the original device on exiting.
    The device is switched using the provided device interface.
    device_interfaceindexr   Nc                 0    || _         || _        d| _        d S )N)ru   idxprev_idx)selfru   rv   s      r   __init__zDeviceGuard.__init__   s     !1r   c                 `    | j         &| j                            | j                   | _        d S d S r   )ry   ru   rF   rz   )r{   s    r   	__enter__zDeviceGuard.__enter__   s0    8 1AA$(KKDMMM  r   typevalue	tracebackFc                 \    | j         $| j                            | j                  | _         dS NF)ry   ru   rD   rz   )r{   r   r   r   s       r   __exit__zDeviceGuard.__exit__   s)    8,BB4=QQDHur   r   N)r   r   r    r<   r   r   r	   r>   r|   r~   r   r   r   r$   r   r   rt   rt      s          $_ 5>Fsm	   L L L LS         r   rt   c                   v   e Zd Zej        j        Zej        j        Zej        j        Z G d d          Z e	ej        j
                  Z
 e	ej        j                  Z e	ej        j                  Z e	ej        j                  Z e	ej        j                  Z e	ej        j                  Z e	ej        j                  Z e	ej        j                  Z e	ej        j                  Z e	e          Z e	ej        j                  Z e	ej        j                  Z e	ej        j                  Z e	ej        j                  Ze	defd            Ze	d
dej        j        dee e!f         fd            Z"e	d
dej        j        defd            Z#e	d
dej        j        ddfd	            Z$dS )CudaInterfacec                       e Zd Zededdfd            Zedefd            Zeddej        j	        de
fd            ZdS )CudaInterface.Workerr   r   Nc                     | t           d<   d S Ncudar   r5   s    r   r6   zCudaInterface.Worker.set_device       5;*6222r   c                  j    dt           v rt           d         S t          j                                        S r   )r   r!   r   r9   r$   r   r   r9   z#CudaInterface.Worker.current_device   -    7775f==:,,...r   c                    | Wt          | t                    r!t          j        |           } | j        dk    sJ t          | t          j                  r| j        } | t          j                                        } dt          vr?d t          t          j                                                  D             }|t          d<   t          d         |          S )Nr   c                 L    g | ]!}t           j                            |          "S r$   )r!   r   r;   .0is     r   
<listcomp>z>CudaInterface.Worker.get_device_properties.<locals>.<listcomp>   8        J44Q77  r   )
isinstancestrr!   r   r   rv   r   r?   r9   r   ranger   rH   r   device_props     r   r;   z*CudaInterface.Worker.get_device_properties       !fc** 1"\&11F!;&0000fel33 *#\F~&-<<>>=== "5:#:#:#<#<==   <G083F;FCCr   r   r   r   r    r=   r>   r6   r9   r!   r"   r#   r   r;   r$   r   r   r?   r              		<s 	<t 	< 	< 	< 
	< 
	/ 	/ 	/ 	/ 
	/
 
	D 	D%+*< 	D 	D 	D 	D 
	D 	D 	Dr   r?   r   c                  >    t           j                                        S r   )r!   r   rJ   r$   r   r   rJ   zCudaInterface.is_available   s    z&&(((r   Nr   c                     t           j        j        *t           j                            |           \  }}|dz  |z   S t           j                            |           j                            dd          d         S )N
   :   r   )r!   versionhipr   get_device_capabilityr;   gcnArchNamesplit)r   majormins      r   r_   z$CudaInterface.get_compute_capability  se    =$99&AAJE32:##:33F;;GMMcSTUUVWXXr   c                 x    t           j        j        d up't           j                            |           j        dk    S )N   )r!   r   r   r   r;   r   r5   s    r   rl   zCudaInterface.is_triton_capable  s7     MT) Cz//77=B	
r   c                 `   ddl m} t                              |           s<t          j                            |           } ||t          j                              dd l	}t          j
        j        d|j        j        vrt          d          d S d|j        j        vrt          d          d S )Nr   )GPUTooOldForTritonamdz'triton not built with the 'amd' backendnvidiaz*triton not built with the 'nvidia' backend)torch._inductor.excr   r   rl   r!   r   r;   inspectcurrentframetriton.backendsr   r   backendsrn   )r   r   device_propstritons       r   ro   z)CudaInterface.raise_if_triton_unavailable  s    ::::::..v66 	K :;;FCCL$$\73G3I3IJJJ=(FO444"#LMMM 54V_555KLLL 65r   r   )%r   r   r    r!   r   r   r,   r1   r?   r=   r9   r6   rH   rK   rO   rQ   rV   r\   r;   r   rZ   _exchange_devicerF   _maybe_exchange_devicerD   rj   rc   rq   rJ   r"   r#   r
   r>   r   r_   rl   ro   r$   r   r   r   r      sf       ZF JEZFD D D D D D D D> "\%*";<<Nej344J<
 788L\%*+,,F!\%*";<<Nej344J$UZ%ABB,uz566K(L)IJJ!\/22N"l5:#>??O(L)JKK#|EJ$?@@$UZ%ABB )$ ) ) ) \) Y Yu{'9 YU3PS8_ Y Y Y \Y 
 
%+"4 
 
 
 
 \
 M MEK,> M$ M M M \M M Mr   r   get_mtia_stream)_mtia_getCurrentRawStreamc                   f   e Zd Zej        j        Zej        j        Zej        j        Z G d d          Z e	ej        j
                  Z
 e	ej        j                  Z e	ej        j                  Z e	ej        j                  Z e	ej        j                  Z e	ej        j                  Z e	ej        j                  Z e	ej        j                  Z e	ej        j                  Z e	e          Z e	ej        j                  Z e	ej        j                  Z e	ej        j                  Z e	ej        j                  Ze	defd            Ze	ddej        j        defd            Z e	ddej        j        defd            Z!e	dd	ej        j        ddfd
            Z"dS )MtiaInterfacec                       e Zd Zededdfd            Zedefd            Zeddej        j	        de
fd            ZdS )MtiaInterface.Workerr   r   Nc                     | t           d<   d S Nmtiar   r5   s    r   r6   zMtiaInterface.Worker.set_device0  r   r   c                  j    dt           v rt           d         S t          j                                        S r   )r   r!   r   r9   r$   r   r   r9   z#MtiaInterface.Worker.current_device4  r   r   c                    | Wt          | t                    r!t          j        |           } | j        dk    sJ t          | t          j                  r| j        } | t          j                                        } dt          vr?d t          t          j                                                  D             }|t          d<   t          d         |          S )Nr   c                 L    g | ]!}t           j                            |          "S r$   )r!   r   r;   r   s     r   r   z>MtiaInterface.Worker.get_device_properties.<locals>.<listcomp>F  r   r   )r   r   r!   r   r   rv   r   r?   r9   r   r   r   rH   r   s     r   r;   z*MtiaInterface.Worker.get_device_properties:  r   r   r   r   r$   r   r   r?   r   /  r   r   r?   r   c                  B    t           j                                        } | S r   )r!   r   rJ   )rets    r   rJ   zMtiaInterface.is_available^  s    j%%''
r   Nr   c                 D    t           j                            |           }|S r   )r!   r   r   r   ccs     r   r_   z$MtiaInterface.get_compute_capabilityc  s    Z--f55	r   c                     dS NTr$   r5   s    r   rl   zMtiaInterface.is_triton_capableh      tr   evicec                 H    dd l }d|j        j        vrt          d          d S )Nr   r   z(triton not built with the 'mtia' backendr   r   rn   )r   r   s     r   ro   z)MtiaInterface.raise_if_triton_unavailablel  s5    111IJJJ 21r   r   )#r   r   r    r!   r   r   r,   r1   r?   r=   r9   r6   rH   rK   rO   rQ   rV   r\   r;   r   rZ   r   rF   r   rD   rj   rc   rq   rJ   r"   r#   r   r_   rl   ro   r$   r   r   r   r   *  sT       ZFJEZFD D D D D D D D> "\%*";<<Nej344J<
 788L\%*+,,F!\%*";<<Nej344J$UZ%ABB,uz566K(L)IJJ!\/22N"l5:#>??O(L)JKK#|EJ$?@@$UZ%ABB $    \  u{'9 S    \  %+"4     \ K K5;+= K K K K \K K Kr   r   get_xpu_stream)_xpu_getCurrentRawStreamc                   ^   e Zd Zej        j        Zej        j        Zej        j        Z G d d          Z e	ej        j
                  Z
 e	ej        j                  Z e	ej        j                  Z e	ej        j                  Z e	ej        j                  Z e	ej        j                  Z e	ej        j                  Z e	ej        j                  Z e	ej        j                  Z e	e          Z e	ej        j                  Z e	ej        j                  Z e	ej        j                  Ze	defd            Ze	ddej        j        defd            Ze	dd	edefd
            Z e	ddej        j        defd            Z!e	ddej        j        ddfd            Z"dS )XpuInterfacec                       e Zd Zededdfd            Zedefd            Zeddej        j	        de
fd            ZdS )XpuInterface.Workerr   r   Nc                     | t           d<   d S Nxpur   r5   s    r   r6   zXpuInterface.Worker.set_device  s    4:*5111r   c                  j    dt           v rt           d         S t          j                                        S r   )r   r!   r   r9   r$   r   r   r9   z"XpuInterface.Worker.current_device  s-    6665e<<9++---r   c                    | Wt          | t                    r!t          j        |           } | j        dk    sJ t          | t          j                  r| j        } | t          j                                        } dt          vr?d t          t          j                                                  D             }|t          d<   t          d         |          S )Nr   c                 L    g | ]!}t           j                            |          "S r$   )r!   r   r;   r   s     r   r   z=XpuInterface.Worker.get_device_properties.<locals>.<listcomp>  s8        I33A66  r   )r   r   r!   r   r   rv   r   r?   r9   r   r   r   rH   r   s     r   r;   z)XpuInterface.Worker.get_device_properties  s    !fc** 0"\&11F!;%////fel33 *#\F~%,;;==<<< "59#9#9#;#;<<   ;F073E:6BBr   r   r   r$   r   r   r?   r     s        		;s 	;t 	; 	; 	; 
	; 
	. 	. 	. 	. 
	.
 
	C 	C%+*< 	C 	C 	C 	C 
	C 	C 	Cr   r?   r   c                  >    t           j                                        S r   )r!   r   rJ   r$   r   r   rJ   zXpuInterface.is_available  s    y%%'''r   Nr   c                 D    t           j                            |           }|S r   )r!   r   r   r   s     r   r_   z#XpuInterface.get_compute_capability  s    Y,,V44	r   Fr`   c                 >    t           j                                        S r   )r!   r   rc   rb   s    r   rc   zXpuInterface.is_bf16_supported  s    y**,,,r   c                     dS r   r$   r5   s    r   rl   zXpuInterface.is_triton_capable  r   r   c                 H    dd l }d|j        j        vrt          d          d S )Nr   intelz)triton not built with the 'intel' backendr   r   r   s     r   ro   z(XpuInterface.raise_if_triton_unavailable  s5    &/222JKKK 32r   r   rp   )#r   r   r    r!   r   r   r,   r1   r?   r=   r9   r6   rH   rK   rO   rQ   rV   r\   r;   r   rZ   r   rF   r   rD   rj   rq   rJ   r"   r#   r   r_   rc   rl   ro   r$   r   r   r   r   {  sq       YFIOEYFC C C C C C C C> "\%)":;;Nei233J<	 677L\%)*++F!\%)":;;Nei233J$UY%@AA,uy455K(L)HII!\.11N"l59#=>>O(L)IJJ#|EI$>?? ($ ( ( ( \(  u{'9 S    \ - -t - - - - \-  %+"4     \ L LEK,> L$ L L L \L L Lr   r   c                       e Zd ZU eed<   dS )CpuDevicePropertiesmulti_processor_countN)r   r   r    r>   __annotations__r$   r   r   r   r     s         r   r   c                      e Zd Z G d dej                  Z G d d          Zedefd            Zeddedefd	            Z	eddej
        j        defd            Zededefd            Zedefd            Zeddej
        j        dd
fd            Zeddej
        j        defd            Zeddej
        j        dd
fd            Zd
S )CpuInterfacec                   B    e Zd Zd
deddfdZdedefdZddeddfd	ZdS )CpuInterface.EventTenable_timingr   Nc                     d| _         d S )Ng        time)r{   r   s     r   r|   zCpuInterface.Event.__init__  s    DIIIr   	end_eventc                 &    |j         | j         z
  dz  S )Ni  r   )r{   r   s     r   elapsed_timezCpuInterface.Event.elapsed_time  s    NTY.$66r   rK   c                 6    t          j                    | _         d S r   )r   perf_counter)r{   rK   s     r   recordzCpuInterface.Event.record  s    )++DIIIr   )Tr   )	r   r   r    rq   r|   r   floatr   r   r$   r   r   r,   r     s        	 	$ 	$ 	 	 	 		7# 	7% 	7 	7 	7 	7	, 	, 	, 	, 	, 	, 	, 	, 	,r   r,   c                   F    e Zd Ze	 ddej        j        defd            ZdS )CpuInterface.WorkerNr   r   c                 P    dd l }|                                }t          |          S Nr   )multiprocessing	cpu_countr   )r   r   r   s      r   r;   z)CpuInterface.Worker.get_device_properties  s/     #"""'1133I&y111r   r   )	r   r   r    r=   r!   r"   r#   r   r;   r$   r   r   r?   r     sO        	)-	2 	2K&	2 	2 	2 	2 
	2 	2 	2r   r?   r   c                      dS r   r$   r$   r   r   rJ   zCpuInterface.is_available  r   r   Fr`   c                     dS r   r$   rb   s    r   rc   zCpuInterface.is_bf16_supported  r   r   Nr   c                     dS N r$   r5   s    r   r_   z#CpuInterface.get_compute_capability      rr   rW   c                     dS r   r$   rY   s    r   rZ   zCpuInterface.get_raw_stream      qr   c                      dS r   r$   r$   r   r   r9   zCpuInterface.current_device  r  r   c                     d S r   r$   r5   s    r   r\   zCpuInterface.synchronize  s    r   c                     dS r   r$   r5   s    r   rl   zCpuInterface.is_triton_capable  r   r   c                 H    dd l }d|j        j        vrt          d          d S )Nr   cpuz'triton not built with the 'cpu' backendr   r   s     r   ro   z(CpuInterface.raise_if_triton_unavailable  s5    000HIII 10r   rp   r   )r   r   r    r!   r,   r?   r=   rq   rJ   rc   r"   r#   r   r_   r   r>   rZ   r9   r\   rl   ro   r$   r   r   r   r     s        , , , , , , , ,2 2 2 2 2 2 2 2 $    \  t     \  u{'9 S    \ 3 3    \ C    \  EK. $    \  %+"4     \ J JEK,> J$ J J J \J J Jr   r   c                       e Zd Zeddedefd            Ze	 ddej        dedefd            Z	edefd            Z
edefd            Zedd
ej        j        defd            Zedd
ej        j        dd	fd            Z G d d          Zd	S )MpsInterfaceFr`   r   c                 L    t           j        j                            dd          S )N   r   )r!   r   mpsis_macos_or_newerrb   s    r   rc   zMpsInterface.is_bf16_supported  s    ~!33B:::r   rd   c                     |t           j        t           j        fv rdS |t           j        k    p|                     |          S r   )r!   float64
complex128rf   rc   rg   s      r   rh   zMpsInterface.is_dtype_supported
  s?     U]E$45555&T#*?*?@S*T*TTr   c                  H    t           j        j                                        S r   )r!   r   r  rJ   r$   r   r   rJ   zMpsInterface.is_available  s    ~!..000r   c                      dS r   r$   r$   r   r   r9   zMpsInterface.current_device  r  r   Nr   c                     dS r  r$   r5   s    r   r_   z#MpsInterface.get_compute_capability  r  r   c                 B    t           j                                         d S r   )r!   r  r\   r5   s    r   r\   zMpsInterface.synchronize  s    	r   c                   `    e Zd Zeddej        j        defd            Zede	fd            Z
dS )MpsInterface.WorkerNr   r   c                 x     t          ddg          t          j        j                                                  S )NMPSPropertiesr   )r   r!   r   r  get_core_countr5   s    r   r;   z)MpsInterface.Worker.get_device_properties#  s8    I:o0G/HII"1133  r   c                      dS r   r$   r$   r   r   r9   z"MpsInterface.Worker.current_device)  s    1r   r   )r   r   r    r=   r!   r"   r#   r   r;   r>   r9   r$   r   r   r?   r  "  sq        		 	%+*< 	 	 	 	 
	
 
	 	 	 	 
	 	 	r   r?   rp   r   )r   r   r    r=   rq   rc   rr   r!   rd   rh   rJ   r>   r9   r"   r#   r   r_   r\   r?   r$   r   r   r  r    su       ; ;t ; ; ; ; \; =BU UKU6:U	U U U [U 1$ 1 1 1 \1 C    \  u{'9 S    \    EK.  $       \ 	 	 	 	 	 	 	 	 	 	r   r  device_interfacesFr   ru   r   c                 \    t          | t          j                  r| j        } |t          | <   d S r   )r   r!   r   r   r  )r   ru   s     r   register_interface_for_devicer   2  s0     &%,''  0fr   c                     t          | t          j                  r| j        } t          st                       | t          v rt          |          S t          d|            )NzNo interface for device )r   r!   r   r   _device_initializedinit_device_regr  r   r5   s    r   get_interface_for_devicer$  :  s_    &%,''  """ ((
AAA
B
BBr   c                  ^    t           st                       t                                          S r   )r"  r#  r  itemsr$   r   r    get_registered_device_interfacesr'  D  s(     ""$$$r   c                     t          dt                     t          t          j                                                  D ]} t          d|  t                     t          dt                     t          t          j                                                  D ]} t          d|  t                     t          dt                     t          t          j	                                                  D ]} t          d|  t                     t          dt                     t          dt                     d	ad S )
Nr   zcuda:r   zxpu:r   zmtia:r
  r  T)r   r   r   r!   r   rH   r   r   r   r   r   r  r"  )r   s    r   r#  r#  J  s   !&-8885:**,,-- B B%kakk=AAAA!%66659))++,, @ @%jQjj,????!&-8885:**,,-- B B%kakk=AAAA!%666!%666r   r   )2r<   r   r   collectionsr   collections.abcr   dataclassesr   typingr   r   r   r	   r
   r!   r>   r   r   _is_compiledtorch._Cr   r   r   dictr   r   r   rt   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r"  r   r   r$  tupler'  r#  r$   r   r   <module>r1     s>    "   " " " " " " $ $ $ $ $ $ ! ! ! ! ! ! : : : : : : : : : : : : : :  (C5#:./ / / /: EEEEEEEO 46  $sCx. 5 5 513 S#X 3 3 3CR CR CR CR CR CR CR CRL       6XM XM XM XM XMO XM XM XMv (C5#:./ / / /: EEEEEEEOGK GK GK GK GKO GK GK GKT 3%*-. . . .9 CCCCCCCNIL IL IL IL IL? IL IL ILX        6J 6J 6J 6J 6J? 6J 6J 6Jr& & & & &? & & &R 79 4T/223 8 8 8 1#u|#$18<_8M1	1 1 1 1CU3+<%= C$BW C C C C%(5d?>S9S3T*U % % % %     r   