o
    I&i                     @   sX  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 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	eZG d
d dedZG dd deZi Zeeee f ed< dedee fddZdedee fddZ deeeee f  fddZ!ede 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                    sz   |d }d|v rt |d rt|d tsJ dd|v r0t |d r,t|d ts0J dt j| g|R i |S )N   Eventz>DeviceInterface member Event should be inherit from _EventBaseStreamz@DeviceInterface member Stream should be inherit from _StreamBase)inspectisclass
issubclassr
   r   super__new__)metaclsargskwargsZclass_member	__class__ IC:\wamp64\www\opt\env\Lib\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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d Zed$defddZed$defd d!Zed$def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defddZdS )zDeviceInterface.devicedevicec                 C      t  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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-   r0   r+   r1   r   r   r   r   Worker,   s    r5   c                   C   r&   r'   r(   r   r   r   r   r0   @   r.   zDeviceInterface.current_devicec                 C   r&   r'   r(   r,   r   r   r   r-   D   r.   zDeviceInterface.set_devicec                   C   r&   r'   r(   r   r   r   r   device_countH   r.   zDeviceInterface.device_countr/   c                   C   r&   r'   r(   r   r   r   r   is_availableL   r.   zDeviceInterface.is_availablestreamc                 C   r&   r'   r(   r8   r   r   r   r8   P   r.   zDeviceInterface.streamc                   C   r&   r'   r(   r   r   r   r   current_streamT   r.   zDeviceInterface.current_streamc                 C   r&   r'   r(   r9   r   r   r   
set_streamX   r.   zDeviceInterface.set_stream	stream_iddevice_indexdevice_typec                 C   r&   r'   r(   )r<   r=   r>   r   r   r   _set_stream_by_id\   r.   z!DeviceInterface._set_stream_by_idc                   C   r&   r'   r(   r   r   r   r   get_raw_stream`   r.   zDeviceInterface.get_raw_streamNc                 C   r&   r'   r(   r,   r   r   r   synchronized   r.   zDeviceInterface.synchronizec                 C   r&   r'   r(   r,   r   r   r   r1   h   r.   z%DeviceInterface.get_device_propertiesc                 C   r&   r'   r(   r,   r   r   r   get_compute_capabilityl   r.   z&DeviceInterface.get_compute_capabilityr'   )r    r!   r"   r2   r%   r5   r3   r0   r+   r-   r6   boolr7   torchr   r8   r:   r;   r4   r?   r@   rA   r1   rB   r   r   r   r   r$   "   s8    



r$   )	metaclassc                   @   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	defddZe	d
defdd	ZdS )CudaInterfacec                   @   sD   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   s   | t d< d S Ncuda)r   r,   r   r   r   r-   z   s   zCudaInterface.Worker.set_devicer/   c                   C   s   dt v rt d S tj S rG   )r   rD   rH   r0   r   r   r   r   r0   ~   s   
z#CudaInterface.Worker.current_deviceNc                 C   s   | 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 )NrH   c                 S   s   g | ]}t j|qS r   )rD   rH   r1   ).0ir   r   r   
<listcomp>   s    
z>CudaInterface.Worker.get_device_properties.<locals>.<listcomp>)
isinstancestrrD   r%   typeindexrF   r5   r0   r   rangerH   r6   )r%   Zdevice_propr   r   r   r1      s   


z*CudaInterface.Worker.get_device_propertiesr'   )	r    r!   r"   r3   r4   r-   r0   r+   r1   r   r   r   r   r5   y   s    r5   r/   c                   C   s
   t j S r'   )rD   rH   r7   r   r   r   r   r7      s   
zCudaInterface.is_availableNr%   c                 C   s   t j| \}}|d | S )N
   )rD   rH   Zget_device_capability)r%   majorminr   r   r   rB      s   z$CudaInterface.get_compute_capabilityr'   )r    r!   r"   rD   rH   r%   r   r   r5   r3   r0   r-   r6   r8   r:   r;   r?   rA   r1   r   r@   rC   r7   r+   rB   r   r   r   r   rF   q   s&    rF   device_interfacesr%   device_interfacec                 C   s   |t | < d S r'   )rT   )r%   rU   r   r   r   register_interface_for_device   s   rV   r/   c                 C   s   | t v rt |  S td|  )NzNo interface for device )rT   r)   r,   r   r   r   get_interface_for_device   s   rW   c                   C   s   t  S r'   )rT   itemsr   r   r   r    get_registered_device_interfaces   s   rY   rH   )"r   typingr   r   r   r   r   r   r   r	   rD   Ztorch._streambaser
   r   r4   __annotations__rH   Z_is_compiledZtorch._Cr   r   r%   rM   r+   r   r   rN   r   r$   rF   rT   rV   rW   rY   r   r   r   r   <module>   s&   
 (
O=