
    Vha:                        U d Z ddlZddlmZ ddlmZ ddlmZmZm	Z	m
Z
 ddlZe	eegef      ed<   ej                  j                         rddlmZ ndZe
ej&                  eedf   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j8                  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   fdZ&de
eej&                  f   de$e   fd Z'dee(ee$e   f      fd!Z)d" Z*y)#a  
Device abstraction layer for TorchDynamo and Inductor backends.

This module provides a unified interface for different hardware backends (CUDA, XPU,
CPU, MPS) 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
- 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)Iterable)	dataclass)AnyCallable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
        Z	ede
fd       Zededefd       Zededefd       Zed        Zedefd       Zedej                  fd       Zed        Zedej                  fd       Zedededefd       Zededefd       Zed$de
fd       Zed$de
fd       Zed$de
fd       Zed%defd        Ze	 d%d!ej:                  dedefd"       Zed$de
defd#       Zy)&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                       e Zd ZdefdZy)DeviceInterface.devicedevicec                     t         NNotImplementedErrorclsr   s     N/home/dcms/DCMS/lib/python3.12/site-packages/torch/_dynamo/device_interface.py__new__zDeviceInterface.device.__new__0   s    %%    N)__name__
__module____qualname__	_device_tr    r   r   r   r   /   s    	& 	&r   r   c                       e Zd Zd Zy)DeviceInterface.Eventc                     t        d      )NzYEvent should be inherited from torch.Event, otherwise, it couldn't be captured by dynamo.r   r   argskwargss      r   r   zDeviceInterface.Event.__new__4   s    %k r   Nr   r   r   r   r   r   r   Eventr!   3       	r   r'   c                       e Zd Zd Zy)DeviceInterface.Streamc                     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__:   s    %m r   Nr&   r   r   r   Streamr*   9   r(   r   r,   c                   T    e Zd ZdZedefd       Zedefd       Zeddefd       Z	y)	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   c                     t         r   r   r   s    r   
set_devicez!DeviceInterface.Worker.set_deviceG       %%r   returnc                      t         r   r   r   r   r   current_devicez%DeviceInterface.Worker.current_deviceK   r2   r   Nc                     t         r   r   r0   s    r   get_device_propertiesz,DeviceInterface.Worker.get_device_propertiesO   r2   r   r   )
r   r   r   __doc__staticmethodintr1   r5   r   r7   r   r   r   Workerr.   ?   sX    	 
	&s 	& 
	& 
	& 	& 
	& 
	&) 	& 
	&r   r;   c                      t         r   r   r   r   r   r5   zDeviceInterface.current_deviceS       !!r   c                     t         r   r   r0   s    r   r1   zDeviceInterface.set_deviceW   r=   r   r3   c                     t         r   r   r0   s    r   maybe_exchange_devicez%DeviceInterface.maybe_exchange_device[   r=   r   c                     t         r   r   r0   s    r   exchange_devicezDeviceInterface.exchange_device_   r=   r   c                      t         r   r   r   r   r   device_countzDeviceInterface.device_countc   r=   r   c                      t         r   r   r   r   r   is_availablezDeviceInterface.is_availableg   r=   r   streamc                     t         r   r   rG   s    r   rG   zDeviceInterface.streamk   r=   r   c                      t         r   r   r   r   r   current_streamzDeviceInterface.current_streamo   r=   r   c                     t         r   r   rI   s    r   
set_streamzDeviceInterface.set_streams   r=   r   	stream_iddevice_indexdevice_typec                     t         r   r   )rN   rO   rP   s      r   _set_stream_by_idz!DeviceInterface._set_stream_by_idw   r=   r   
device_idxc                     t         r   r   rS   s    r   get_raw_streamzDeviceInterface.get_raw_stream{   r=   r   Nc                     t         r   r   r0   s    r   synchronizezDeviceInterface.synchronize   r=   r   c                 8    | j                   j                  |      S r   )r;   r7   r   s     r   r7   z%DeviceInterface.get_device_properties   s    zz//77r   c                     t         r   r   r0   s    r   get_compute_capabilityz&DeviceInterface.get_compute_capability   r=   r   including_emulationc                     t         r   r   r\   s    r   is_bf16_supportedz!DeviceInterface.is_bf16_supported   r=   r   dtypec                 N    |t         j                  k7  xs | j                  |      S r   )torchbfloat16r_   r   r`   r\   s      r   is_dtype_supportedz"DeviceInterface.is_dtype_supported   s$     &T#*?*?@S*TTr   c                     t         r   r   r0   s    r   memory_allocatedz DeviceInterface.memory_allocated   r=   r   r   F) r   r   r   r8   r   r'   r,   r;   r9   r5   r   r1   r:   r@   rB   rD   boolrF   rb   rG   rK   rM   rR   rV   rX   classmethodr7   r[   r_   r`   re   rg   r   r   r   r   r   )   s4   
& &  & &( " " "9 " " "c "c " " " " " " " " "$ " " "u|| " " " " "5<< " " "S " "# " " "3 "3 " " "I " " 89 8 8 "y " " "t " " =BUKKU6:U	U U
 " "c " "r   r   c                   J    e Zd ZdZdee   dee   ddfdZd Z	de
d	e
d
e
fdZy)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indexr3   Nc                 .    || _         || _        d| _        y )N)rm   idxprev_idx)selfrm   rn   s      r   __init__zDeviceGuard.__init__   s     !1r   c                 r    | j                   +| j                  j                  | j                         | _        y y r   )rq   rm   rB   rr   )rs   s    r   	__enter__zDeviceGuard.__enter__   s-    88 11AA$((KDM  r   typevalue	tracebackc                 p    | j                   *| j                  j                  | j                        | _         yNF)rq   rm   r@   rr   )rs   rw   rx   ry   s       r   __exit__zDeviceGuard.__exit__   s+    88,,BB4==QDHr   )r   r   r   r8   rw   r   r   r:   rt   rv   r   r|   r   r   r   rl   rl      sM     $_ 5>Fsm	LS   r   rl   c                      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                  j2                        Z e	ej                  j4                        Ze	defd       Ze	ddefd       Zy)	CudaInterfacec                   P    e Zd Zedefd       Zedefd       Zeddefd       Zy)CudaInterface.Workerr   c                     | t         d<   y Ncudar   r0   s    r   r1   zCudaInterface.Worker.set_device   s    5;*62r   r3   c                  `    dt         v r	t         d   S t        j                  j                         S r   )r   rb   r   r5   r   r   r   r5   z#CudaInterface.Worker.current_device   s)    775f==::,,..r   Nc                    | \t        | t              r&t        j                  |       } | j                  dk(  sJ t        | t        j                        r| j
                  } | t        j                  j                         } dt        vrZt        t        j                  j                               D cg c]!  }t        j                  j                  |      # }}|t        d<   t        d   |    S c c}w r   )
isinstancestrrb   r   rw   rn   r~   r;   r5   r   ranger   rD   r7   r   idevice_props      r   r7   z*CudaInterface.Worker.get_device_properties   s    !fc*"\\&1F!;;&000fell3#\\F~&--<<>== #5::#:#:#<= JJ44Q7  <G083F;FCC   0&C-r   	r   r   r   r9   r:   r1   r5   r   r7   r   r   r   r;   r      sT    		<s 	< 
	< 
	/ 	/ 
	/
 
	D) 	D 
	Dr   r;   r3   c                  >    t         j                  j                         S r   )rb   r   rF   r   r   r   rF   zCudaInterface.is_available   s    zz&&((r   Nr   c                    t         j                  j                  *t         j                  j	                  |       \  }}|dz  |z   S t         j                  j                  |       j                  j                  dd      d   S )N
   :   r   )rb   versionhipr   get_device_capabilityr7   gcnArchNamesplit)r   majormins      r   r[   z$CudaInterface.get_compute_capability   sh    ==$99&AJE32:##::33F;GGMMcSTUVWXXr   r   )r   r   r   rb   r   r   r'   r,   r;   r9   r5   r1   rD   rG   rK   rM   rR   rX   r7   r	   rV   _exchange_devicerB   _maybe_exchange_devicer@   rg   r_   ri   rF   r   r[   r   r   r   r~   r~      s   ZZF JJEZZFD D> "%**";";<Nejj334J

 7 78L%**++,F!%**";";<Nejj334J$UZZ%A%ABuzz556K()I)IJ!/2N"5::#>#>?O()J)JK#EJJ$?$?@$UZZ%A%AB )$ ) ) Yy Y Y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                  j2                        Ze	defd       Ze	d
defd       Ze	ddedefd	       Zy)XpuInterfacec                   P    e Zd Zedefd       Zedefd       Zeddefd       Zy)XpuInterface.Workerr   c                     | t         d<   y Nxpur   r0   s    r   r1   zXpuInterface.Worker.set_device  s    4:*51r   r3   c                  `    dt         v r	t         d   S t        j                  j                         S r   )r   rb   r   r5   r   r   r   r5   z"XpuInterface.Worker.current_device
  s)    665e<<99++--r   Nc                    | \t        | t              r&t        j                  |       } | j                  dk(  sJ t        | t        j                        r| j
                  } | t        j                  j                         } dt        vrZt        t        j                  j                               D cg c]!  }t        j                  j                  |      # }}|t        d<   t        d   |    S c c}w r   )r   r   rb   r   rw   rn   r   r;   r5   r   r   r   rD   r7   r   s      r   r7   z)XpuInterface.Worker.get_device_properties  s    !fc*"\\&1F!;;%///fell3#\\F~%,,;;=<< #599#9#9#;< II33A6  ;F073E:6BBr   r   r   r   r   r   r;   r     sT    		;s 	; 
	; 
	. 	. 
	.
 
	C) 	C 
	Cr   r;   r3   c                  >    t         j                  j                         S r   )rb   r   rF   r   r   r   rF   zXpuInterface.is_available3  s    yy%%''r   Nr   c                 D    t         j                  j                  |       }|S r   )rb   r   r   )r   ccs     r   r[   z#XpuInterface.get_compute_capability7  s    YY,,V4	r   r\   c                 >    t         j                  j                         S r   )rb   r   r_   r^   s    r   r_   zXpuInterface.is_bf16_supported<  s    yy**,,r   r   rh   )r   r   r   rb   r   r   r'   r,   r;   r9   r5   r1   rD   rG   rK   rM   rR   rX   r7   r   rV   r   rB   r   r@   rg   ri   rF   r   r[   r_   r   r   r   r   r      s   YYFIIOOEYYFC C> "%))":":;Neii223J		 6 67L%))**+F!%))":":;Neii223J$UYY%@%@Auyy445K()H)HI!.1N"599#=#=>O()I)IJ#EII$>$>? ($ ( ( y   -t - - -r   r   c                       e Zd ZU eed<   y)CpuDevicePropertiesmulti_processor_countN)r   r   r   r:   __annotations__r   r   r   r   r   A  s    r   r   c                       e Zd Z G d dej                        Zedefd       Zeddefd       Zedde	de
fd	       Zedefd
       Zed        Zedde	fd       Z G d d      Zy)CpuInterfacec                   (    e Zd ZddZdefdZddZy)CpuInterface.Eventc                     d| _         y )Ng        time)rs   enable_timings     r   rt   zCpuInterface.Event.__init__H  s	    DIr   r3   c                 :    |j                   | j                   z
  dz  S )Ni  r   )rs   	end_events     r   elapsed_timezCpuInterface.Event.elapsed_timeK  s    NNTYY.$66r   Nc                 6    t        j                         | _         y r   )r   perf_counter)rs   rG   s     r   recordzCpuInterface.Event.recordN  s    ))+DIr   )Tr   )r   r   r   rt   floatr   r   r   r   r   r'   r   G  s    		7U 	7	,r   r'   r3   c                       yNTr   r   r   r   rF   zCpuInterface.is_availableQ      r   r\   c                      yr   r   r^   s    r   r_   zCpuInterface.is_bf16_supportedU  r   r   Nr   c                      yN r   r0   s    r   r[   z#CpuInterface.get_compute_capabilityY      r   c                      yNr   r   rU   s    r   rV   zCpuInterface.get_raw_stream]      r   c                       yr   r   r   r   r   r5   zCpuInterface.current_devicea  r   r   c                      y r   r   r0   s    r   rX   zCpuInterface.synchronizee  s    r   c                   $    e Zd Zeddefd       Zy)CpuInterface.WorkerNr   c                 @    dd l }|j                         }t        |      S r   )multiprocessing	cpu_countr   )r   r   r   s      r   r7   z)CpuInterface.Worker.get_device_propertiesj  s    "'113I&y11r   r   )r   r   r   r9   r   r7   r   r   r   r;   r   i  s    		2) 	2 
	2r   r;   rh   r   )r   r   r   rb   r'   r9   ri   rF   r_   r   r   r[   r:   rV   r5   rX   r;   r   r   r   r   r   F  s    , , $   t   y C   c     I  2 2r   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        Zedd	edefd
       Zedd	efd       Z G d d      Zy)MpsInterfacer\   r3   c                 V    t         j                  j                  j                  dd      S )N   r   )rb   backendsmpsis_macos_or_newerr^   s    r   r_   zMpsInterface.is_bf16_supporteds  s    ~~!!33B::r   r`   c                 v    |t         j                  k(  ry|t         j                  k7  xs | j                  |      S r{   )rb   float64rc   r_   rd   s      r   re   zMpsInterface.is_dtype_supportedw  s3     EMM!&T#*?*?@S*TTr   c                  R    t         j                  j                  j                         S r   )rb   r   r   rF   r   r   r   rF   zMpsInterface.is_available  s    ~~!!..00r   c                       yr   r   r   r   r   r5   zMpsInterface.current_device  r   r   Nr   c                      yr   r   r0   s    r   r[   z#MpsInterface.get_compute_capability  r   r   c                 @    t         j                  j                          y r   )rb   r   rX   r0   s    r   rX   zMpsInterface.synchronize  s    		r   c                   4    e Zd Zeddefd       Zed        Zy)MpsInterface.WorkerNr   c                     i S r   r   r0   s    r   r7   z)MpsInterface.Worker.get_device_properties  s    Ir   c                       yr   r   r   r   r   r5   z"MpsInterface.Worker.current_device  s    r   r   )r   r   r   r9   r   r7   r5   r   r   r   r;   r     s/    		) 	 
	 
	 
	r   r;   rh   r   )r   r   r   r9   ri   r_   rj   rb   r`   re   rF   r5   r   r   r[   rX   r;   r   r   r   r   r   r  s    ;t ; ; ; =BUKKU6:U	U U 1$ 1 1   y C    I     r   r   device_interfacesFr   rm   c                 b    t        | t        j                        r| j                  } |t        | <   y r   )r   rb   r   rw   r   )r   rm   s     r   register_interface_for_devicer     s&     &%,,' 0fr   r3   c                     t        | t        j                        r| j                  } t        s
t                | t        v r	t        |    S t        d|        )NzNo interface for device )r   rb   r   rw   _device_initializedinit_device_regr   r   r0   s    r   get_interface_for_devicer     sI    &%,,'"" ((
 8A
BBr   c                  J    t         s
t                t        j                         S r   )r   r   r   itemsr   r   r    get_registered_device_interfacesr     s    ""$$r   c                     t        dt               t        t        j                  j                               D ]  } t        d|  t                t        dt               t        t        j                  j                               D ]  } t        d|  t                t        dt               t        dt               da
y )Nr   zcuda:r   zxpu:cpur   T)r   r~   r   rb   r   rD   r   r   r   r   r   )r   s    r   r   r     s    !&-85::**,- B%aSk=AB "%6599))+, @%QCj,?@ "%6!%6r   )+r8   r   collections.abcr   dataclassesr   typingr   r   r   r   rb   r:   r   r   _is_compiledtorch._Cr
   r	   r   r   r   r   dictr   r   rl   r~   r   r   r   r   r   r   r   r   rw   r   r   r   tupler   r   r   r   r   <module>r      s  "  $ ! 1 1  (C5#:./ /::EO%,,S$./	 46  $sCx. 513 S#X 3n" n"b 6AYO AYH 3%*-. .99CN>-? >-B   )2? )2X$? $N 79 4T/223 8 1#u||#$18<_8M1CU3+<%= C$BW C%(5d?>S9S3T*U %r   