U
    zh,                     @   s  U d dl Z d dlmZmZmZmZmZmZmZm	Z	 d dl
Z
d dlmZmZ eeegef  ed< e
j rxd 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	eZG d
d dedZG dd dZG d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 deZ"i Z#eeee f ed< da$e	ee
jf ee dddZ%e	ee
jf ee dddZ&eeeee f  dddZ'd d! Z(dS )"    N)AnyCallableDictIterableOptionalTupleTypeUnion)
_EventBase_StreamBaseget_cuda_stream)_cuda_getCurrentRawStream caching_worker_device_propertiescaching_worker_current_devicesc                       s   e Zd Z fddZ  ZS )DeviceInterfaceMetac                    st   |d }d|kr4t |d r,t|d ts4tdd|kr`t |d rXt|d ts`tdt j| f||S )N   Eventz>DeviceInterface member Event should be inherit from _EventBaseStreamz@DeviceInterface member Stream should be inherit from _StreamBase)inspectisclass
issubclassr
   AssertionErrorr   super__new__)metaclsargskwargsZclass_member	__class__ P/var/www/html/venv/lib/python3.8/site-packages/torch/_dynamo/device_interface.pyr      s       zDeviceInterfaceMeta.__new__)__name__
__module____qualname__r   __classcell__r   r   r   r    r      s   r   c                   @   s"  e Zd ZdZG dd dZG dd dZedd Zeedd	d
Z	ee
e
dddZee
e
dddZedd ZeedddZeejdddZedd ZeejdddZee
e
e
dddZedd  Zed(edd"d#Zed)edd$d%Zed*edd&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                   @   s   e Zd ZedddZdS )zDeviceInterface.devicedevicec                 C   s   t d S NNotImplementedError)clsr'   r   r   r    r   *   s    zDeviceInterface.device.__new__N)r!   r"   r#   	_device_tr   r   r   r   r    r'   )   s   r'   c                   @   sH   e Zd ZdZeedddZeedddZeded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   s   t d S r(   r)   r&   r   r   r    
set_device5   s    z!DeviceInterface.Worker.set_devicereturnc                   C   s   t d S r(   r)   r   r   r   r    current_device9   s    z%DeviceInterface.Worker.current_deviceNc                 C   s   t d S r(   r)   r&   r   r   r    get_device_properties=   s    z,DeviceInterface.Worker.get_device_properties)N)
r!   r"   r#   __doc__staticmethodintr-   r0   r,   r1   r   r   r   r    Worker-   s   r5   c                   C   s   t d S r(   r)   r   r   r   r    r0   A   s    zDeviceInterface.current_devicer&   c                 C   s   t d S r(   r)   r&   r   r   r    r-   E   s    zDeviceInterface.set_devicer'   r/   c                 C   s   t d S r(   r)   r&   r   r   r    maybe_exchange_deviceI   s    z%DeviceInterface.maybe_exchange_devicec                 C   s   t d S r(   r)   r&   r   r   r    exchange_deviceM   s    zDeviceInterface.exchange_devicec                   C   s   t d S r(   r)   r   r   r   r    device_countQ   s    zDeviceInterface.device_countr.   c                   C   s   t d S r(   r)   r   r   r   r    is_availableU   s    zDeviceInterface.is_availablestreamc                 C   s   t d S r(   r)   r;   r   r   r    r<   Y   s    zDeviceInterface.streamc                   C   s   t d S r(   r)   r   r   r   r    current_stream]   s    zDeviceInterface.current_streamc                 C   s   t d S r(   r)   r;   r   r   r    
set_streama   s    zDeviceInterface.set_streamZ	stream_idZdevice_indexZdevice_typec                 C   s   t d S r(   r)   r?   r   r   r    _set_stream_by_ide   s    z!DeviceInterface._set_stream_by_idc                   C   s   t d S r(   r)   r   r   r   r    get_raw_streami   s    zDeviceInterface.get_raw_streamNc                 C   s   t d S r(   r)   r&   r   r   r    synchronizem   s    zDeviceInterface.synchronizec                 C   s   t d S r(   r)   r&   r   r   r    r1   q   s    z%DeviceInterface.get_device_propertiesc                 C   s   t d S r(   r)   r&   r   r   r    get_compute_capabilityu   s    z&DeviceInterface.get_compute_capability)N)N)N)r!   r"   r#   r2   r'   r5   r3   r0   r,   r-   r4   r7   r8   r9   boolr:   torchr   r<   r=   r>   r@   rA   rB   r1   rC   r   r   r   r    r%   #   s>   



r%   )	metaclassc                   @   sB   e Zd ZdZee ee dddZdd Z	e
e
e
d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indexc                 C   s   || _ || _d| _d S )N)rH   idxprev_idx)selfrH   rI   r   r   r    __init__   s    zDeviceGuard.__init__c                 C   s   | j d k	r| j| j | _d S r(   )rK   rH   r8   rL   )rM   r   r   r    	__enter__   s    
zDeviceGuard.__enter__)typevalue	tracebackc                 C   s   | j d k	r| j| j| _ dS )NF)rK   rH   r7   rL   )rM   rP   rQ   rR   r   r   r    __exit__   s    
zDeviceGuard.__exit__N)r!   r"   r#   r2   r   r%   r   r4   rN   rO   r   rS   r   r   r   r    rG   z   s   	rG   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dddZe	d
eddd	ZdS )CudaInterfacec                   @   sD   e Zd ZeedddZeedddZed
eddd	ZdS )zCudaInterface.Workerr&   c                 C   s   | t d< d S Ncudar   r&   r   r   r    r-      s    zCudaInterface.Worker.set_devicer.   c                   C   s   dt krt d S tj S rU   )r   rE   rV   r0   r   r   r   r    r0      s    z#CudaInterface.Worker.current_deviceNc                 C   s   | d k	r<t | tr*t| } | jdks*tt | tjr<| j} | d krNtj	 } dt
krvdd ttj D }|t
d< t
d |  S )NrV   c                 S   s   g | ]}t j|qS r   )rE   rV   r1   .0ir   r   r    
<listcomp>   s   z>CudaInterface.Worker.get_device_properties.<locals>.<listcomp>)
isinstancestrrE   r'   rP   r   rI   rT   r5   r0   r   rangerV   r9   r'   Zdevice_propr   r   r    r1      s    


z*CudaInterface.Worker.get_device_properties)N	r!   r"   r#   r3   r4   r-   r0   r,   r1   r   r   r   r    r5      s   r5   r.   c                   C   s
   t j S r(   )rE   rV   r:   r   r   r   r    r:      s    zCudaInterface.is_availableNr&   c                 C   sF   t jjd kr(t j| \}}|d | S t j| jddd S d S )N
   :   r   )rE   versionZhiprV   get_device_capabilityr1   ZgcnArchNamesplit)r'   majorminr   r   r    rC      s    z$CudaInterface.get_compute_capability)N)r!   r"   r#   rE   rV   r'   r   r   r5   r3   r0   r-   r9   r<   r=   r>   r@   rB   r1   r   rA   _exchange_devicer8   _maybe_exchange_devicer7   rD   r:   r,   rC   r   r   r   r    rT      s(   rT   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dddZe	d
eddd	ZdS )XpuInterfacec                   @   sD   e Zd ZeedddZeedddZed
eddd	ZdS )zXpuInterface.Workerr&   c                 C   s   | t d< d S NxpurW   r&   r   r   r    r-      s    zXpuInterface.Worker.set_devicer.   c                   C   s   dt krt d S tj S rn   )r   rE   ro   r0   r   r   r   r    r0      s    z"XpuInterface.Worker.current_deviceNc                 C   s   | d k	r<t | tr*t| } | jdks*tt | tjr<| j} | d krNtj	 } dt
krvdd ttj D }|t
d< t
d |  S )Nro   c                 S   s   g | ]}t j|qS r   )rE   ro   r1   rX   r   r   r    r[      s   z=XpuInterface.Worker.get_device_properties.<locals>.<listcomp>)r\   r]   rE   r'   rP   r   rI   rm   r5   r0   r   r^   ro   r9   r_   r   r   r    r1      s    


z)XpuInterface.Worker.get_device_properties)Nr`   r   r   r   r    r5      s   r5   r.   c                   C   s
   t j S r(   )rE   ro   r:   r   r   r   r    r:     s    zXpuInterface.is_availableNr&   c                 C   s   t j| }|S r(   )rE   ro   re   )r'   ccr   r   r    rC     s    z#XpuInterface.get_compute_capability)N)r!   r"   r#   rE   ro   r'   r   r   r5   r3   r0   r-   r9   r<   r=   r>   r@   rB   r1   rk   rA   ri   r8   rj   r7   rD   r:   r,   rC   r   r   r   r    rm      s(   rm   device_interfacesFr'   rH   c                 C   s    t | tjrt| } |t| < d S r(   )r\   rE   r'   r]   rq   rr   r   r   r    register_interface_for_device  s    rs   r6   c                 C   s@   t | tjrt| } tst  | tkr.t|  S td|  d S )NzNo interface for device )r\   rE   r'   r]   _device_initializedinit_device_regrq   r*   r&   r   r   r    get_interface_for_device$  s    rv   r.   c                   C   s   t s
t  t S r(   )rt   ru   rq   itemsr   r   r   r     get_registered_device_interfaces.  s    rx   c                  C   sd   t dt ttj D ]} t d|  t qt dt ttj D ]} t d|  t qFdad S )NrV   zcuda:ro   zxpu:T)	rs   rT   r^   rE   rV   r9   rm   ro   rt   )rZ   r   r   r    ru   4  s    

ru   ))r   typingr   r   r   r   r   r   r   r	   rE   Ztorch._streambaser
   r   r4   __annotations__rV   Z_is_compiledZtorch._Cr   r   r'   r]   r,   r   r   rP   r   r%   rG   rT   ro   rl   rk   rm   rq   rt   rs   rv   rx   ru   r   r   r   r    <module>   s8    (
WB< 
