o
    ߗi1                     @   s  U d dl 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 d dlZeeegef  ed< e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	 d	ZG d
d dZG dd deZeeegef  ed< ej rd dlmZ ndZG dd deZeG dd dZ G d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dZ$deeejf de
e fddZ%dee	ee
e f  fdd Z&d!d" Z'dS )#    N)	dataclass)AnyCallableDictIterableOptionalTupleTypeUnionget_cuda_stream)_cuda_getCurrentRawStream caching_worker_device_propertiescaching_worker_current_devicesc                   @   s|  e Zd ZdZG dd dZG dd dZG dd dZG dd	 d	Zed
d Z	ede
fddZededefddZededefddZedd ZedefddZedejfddZedd ZedejfddZededed efd!d"Zed#edefd$d%Zed3de
fd'd(Zed3de
fd)d*Zed3de
fd+d,Zed4d.efd/d0Zed3de
defd1d2Zd&S )5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                   @   s   e Zd ZdefddZdS )zDeviceInterface.devicedevicec                 C      t NNotImplementedErrorclsr    r   \/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/torch/_dynamo/device_interface.py__new__   s   zDeviceInterface.device.__new__N)__name__
__module____qualname__	_device_tr   r   r   r   r   r      s    r   c                   @      e Zd Zdd ZdS )zDeviceInterface.Eventc                 O      t d)NzYEvent should be inherited from torch.Event, otherwise, it couldn't be captured by dynamo.r   r   argskwargsr   r   r   r   !      zDeviceInterface.Event.__new__Nr   r   r   r   r   r   r   r   Event        r%   c                   @   r   )zDeviceInterface.Streamc                 O   r   )Nz[Stream should be inherited from torch.Stream, otherwise, it couldn't be captured by dynamo.r   r    r   r   r   r   '   r#   zDeviceInterface.Stream.__new__Nr$   r   r   r   r   Stream&   r&   r'   c                   @   sH   e Zd ZdZedefddZedefddZeddefd	d
Z	dS )z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                 C   r   r   r   r   r   r   r   
set_device4      z!DeviceInterface.Worker.set_devicereturnc                   C   r   r   r   r   r   r   r   current_device8   r*   z%DeviceInterface.Worker.current_deviceNc                 C   r   r   r   r(   r   r   r   get_device_properties<   r*   z,DeviceInterface.Worker.get_device_propertiesr   )
r   r   r   __doc__staticmethodintr)   r,   r   r-   r   r   r   r   Worker,   s    r1   c                   C   r   r   r   r   r   r   r   r,   @   r*   zDeviceInterface.current_devicec                 C   r   r   r   r(   r   r   r   r)   D   r*   zDeviceInterface.set_devicer+   c                 C   r   r   r   r(   r   r   r   maybe_exchange_deviceH   r*   z%DeviceInterface.maybe_exchange_devicec                 C   r   r   r   r(   r   r   r   exchange_deviceL   r*   zDeviceInterface.exchange_devicec                   C   r   r   r   r   r   r   r   device_countP   r*   zDeviceInterface.device_countc                   C   r   r   r   r   r   r   r   is_availableT   r*   zDeviceInterface.is_availablestreamc                 C   r   r   r   r6   r   r   r   r6   X   r*   zDeviceInterface.streamc                   C   r   r   r   r   r   r   r   current_stream\   r*   zDeviceInterface.current_streamc                 C   r   r   r   r7   r   r   r   
set_stream`   r*   zDeviceInterface.set_stream	stream_iddevice_indexdevice_typec                 C   r   r   r   )r:   r;   r<   r   r   r   _set_stream_by_idd   r*   z!DeviceInterface._set_stream_by_id
device_idxc                 C   r   r   r   r>   r   r   r   get_raw_streamh   r*   zDeviceInterface.get_raw_streamNc                 C   r   r   r   r(   r   r   r   synchronizel   r*   zDeviceInterface.synchronizec                 C   s   | j |S r   )r1   r-   r   r   r   r   r-   p      z%DeviceInterface.get_device_propertiesc                 C   r   r   r   r(   r   r   r   get_compute_capabilityt   r*   z&DeviceInterface.get_compute_capabilityFincluding_emulationc                 C   r   r   r   rD   r   r   r   is_bf16_supportedx   r*   z!DeviceInterface.is_bf16_supportedc                 C   r   r   r   r(   r   r   r   memory_allocated|   r*   z DeviceInterface.memory_allocatedr   F)r   r   r   r.   r   r%   r'   r1   r/   r,   r   r)   r0   r2   r3   r4   boolr5   torchr6   r8   r9   r=   r@   rA   classmethodr-   rC   rF   rG   r   r   r   r   r      sL    


r   c                   @   sL   e Zd ZdZdee dee ddfddZdd	 Z	d
e
de
de
fd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                 C   s   || _ || _d| _d S )N)rM   idxprev_idx)selfrM   rN   r   r   r   __init__   s   
zDeviceGuard.__init__c                 C   s"   | j d ur| j| j | _d S d S r   )rP   rM   r3   rQ   )rR   r   r   r   	__enter__   s   
zDeviceGuard.__enter__typevalue	tracebackc                 C   s   | j d ur| j| j| _ dS )NF)rP   rM   r2   rQ   )rR   rU   rV   rW   r   r   r   __exit__   s   
zDeviceGuard.__exit__)r   r   r   r.   r	   r   r   r0   rS   rT   r   rX   r   r   r   r   rL      s    	
rL   c                   @   s   e Zd ZejjZejjZejjZG d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dZe	d
defdd	ZdS )CudaInterfacec                   @   D   e Zd ZedefddZedefddZed
defdd	ZdS )zCudaInterface.Workerr   c                 C      | t d< d S Ncudar   r(   r   r   r   r)      rB   zCudaInterface.Worker.set_devicer+   c                   C      dt v rt d S tj S r\   )r   rJ   r]   r,   r   r   r   r   r,         
z#CudaInterface.Worker.current_deviceNc                 C      | d urt | trt| } | jdksJ t | tjr| j} | d u r'tj } dt	vr;dd t
tj D }|t	d< t	d |  S )Nr]   c                 S      g | ]}t j|qS r   )rJ   r]   r-   .0ir   r   r   
<listcomp>       
z>CudaInterface.Worker.get_device_properties.<locals>.<listcomp>)
isinstancestrrJ   r   rU   rN   rY   r1   r,   r   ranger]   r4   r   device_propr   r   r   r-         


z*CudaInterface.Worker.get_device_propertiesr   	r   r   r   r/   r0   r)   r,   r   r-   r   r   r   r   r1          r1   r+   c                   C   
   t j S r   )rJ   r]   r5   r   r   r   r   r5         
zCudaInterface.is_availableNr   c                 C   sB   t jjd u rt j| \}}|d | S t j| jddd S )N
   :   r   )rJ   versionhipr]   get_device_capabilityr-   gcnArchNamesplit)r   majorminr   r   r   rC      s   z$CudaInterface.get_compute_capabilityr   )r   r   r   rJ   r]   r   r%   r'   r1   r/   r,   r)   r4   r6   r8   r9   r=   rA   r-   r   r@   _exchange_devicer3   _maybe_exchange_devicer2   rG   rF   rI   r5   r   rC   r   r   r   r   rY      s.    rY   get_xpu_stream)_xpu_getCurrentRawStreamc                   @   s  e Zd ZejjZejjZejjZG d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dZe	ddefdd	Ze	ddedefddZdS )XpuInterfacec                   @   rZ   )zXpuInterface.Workerr   c                 C   r[   Nxpur^   r(   r   r   r   r)      rB   zXpuInterface.Worker.set_devicer+   c                   C   r_   r   )r   rJ   r   r,   r   r   r   r   r,      r`   z"XpuInterface.Worker.current_deviceNc                 C   ra   )Nr   c                 S   rb   r   )rJ   r   r-   rc   r   r   r   rf     rg   z=XpuInterface.Worker.get_device_properties.<locals>.<listcomp>)rh   ri   rJ   r   rU   rN   r   r1   r,   r   rj   r   r4   rk   r   r   r   r-      rm   z)XpuInterface.Worker.get_device_propertiesr   rn   r   r   r   r   r1      ro   r1   r+   c                   C   rp   r   )rJ   r   r5   r   r   r   r   r5     rq   zXpuInterface.is_availableNr   c                 C   s   t j| }|S r   )rJ   r   rw   )r   ccr   r   r   rC     s   z#XpuInterface.get_compute_capabilityFrD   c                 C   rp   r   )rJ   r   rF   rE   r   r   r   rF   #  rq   zXpuInterface.is_bf16_supportedr   rH   )r   r   r   rJ   r   r   r%   r'   r1   r/   r,   r)   r4   r6   r8   r9   r=   rA   r-   r~   r@   r|   r3   r}   r2   rG   rI   r5   r   rC   rF   r   r   r   r   r      s0    r   c                   @   s   e Zd ZU eed< dS )CpuDevicePropertiesmulti_processor_countN)r   r   r   r0   __annotations__r   r   r   r   r   (  s   
 r   c                   @   s   e Zd ZG dd dejZedefddZeddede	fdd	Z
edefd
dZedd ZeddefddZG dd dZdS )CpuInterfacec                   @   s.   e Zd Zd
ddZdefddZddd	ZdS )zCpuInterface.EventTc                 C   s
   d| _ d S )Ng        time)rR   enable_timingr   r   r   rS   /  s   
zCpuInterface.Event.__init__r+   c                 C   s   |j | j  d S )Ni  r   )rR   	end_eventr   r   r   elapsed_time2  s   zCpuInterface.Event.elapsed_timeNc                 C   s   t  | _ d S r   )r   perf_counter)rR   r6   r   r   r   record5  s   zCpuInterface.Event.record)Tr   )r   r   r   rS   floatr   r   r   r   r   r   r%   .  s    
r%   r+   c                   C      dS )NTr   r   r   r   r   r5   8  r*   zCpuInterface.is_availableNr   c                 C   r   )N r   r(   r   r   r   rC   <  r*   z#CpuInterface.get_compute_capabilityc                 C   r   Nr   r   r?   r   r   r   r@   @  r*   zCpuInterface.get_raw_streamc                   C   r   r   r   r   r   r   r   r,   D  r*   zCpuInterface.current_devicec                 C   s   d S r   r   r(   r   r   r   rA   H  r*   zCpuInterface.synchronizec                   @   s    e Zd ZeddefddZdS )zCpuInterface.WorkerNr   c                 C   s   dd l }| }t|S r   )multiprocessing	cpu_countr   )r   r   r   r   r   r   r-   M  s   z)CpuInterface.Worker.get_device_propertiesr   )r   r   r   r/   r   r-   r   r   r   r   r1   L  s    r1   r   )r   r   r   rJ   r%   r/   rI   r5   r   ri   rC   r0   r@   r,   rA   r1   r   r   r   r   r   -  s    

r   device_interfacesFr   rM   c                 C   s   t | tjr	| j} |t| < d S r   )rh   rJ   r   rU   r   )r   rM   r   r   r   register_interface_for_deviceY  s   r   r+   c                 C   s:   t | tjr	| j} tst  | tv rt|  S td|  )NzNo interface for device )rh   rJ   r   rU   _device_initializedinit_device_regr   r   r(   r   r   r   get_interface_for_devicea  s   r   c                   C   s   t st  t S r   )r   r   r   itemsr   r   r   r    get_registered_device_interfacesk  s   r   c                  C   sn   t dt ttj D ]
} t d|  t qt dt ttj D ]
} t d|  t q#t dt da	d S )Nr]   zcuda:r   zxpu:cpuT)
r   rY   rj   rJ   r]   r4   r   r   r   r   )re   r   r   r   r   q  s   


r   )(r   dataclassesr   typingr   r   r   r   r   r   r	   r
   rJ   r0   r   r]   _is_compiledtorch._Cr   r   r   ri   r   r   r   r   rL   rY   r   r   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s@   
(
kD
A(
 
