U
    ©Ê¹j³  ã                   @   sD  U d Z ddlmZ ddlmZmZmZmZ ddlZddddd	d
dddddgZ	ee
 ed< G dd„ dƒZeƒ Zeejjef Zejedœdd„Zejedœdd„Zejedœdd„Zeejed dœdd	„ƒZeeed dœdd
„ƒZeejdœdd„Zeeddœdd„Zejeddœdd„Zeedœdd„Zeejjdœd d„ZdS )!zWUtilities for eliminating boilerplate code to handle abstract streams with
CPU device.
é    )Úcontextmanager)Ú	GeneratorÚListÚUnionÚcastNÚCPUStreamTypeÚ
new_streamÚcurrent_streamÚdefault_streamÚ
use_deviceÚ
use_streamÚ
get_deviceÚwait_streamÚrecord_streamÚis_cudaÚas_cudaÚ__all__c                   @   s   e Zd ZdS )r   N)Ú__name__Ú
__module__Ú__qualname__© r   r   úe/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/distributed/pipeline/sync/stream.pyr      s   )ÚdeviceÚreturnc                 C   s   | j dkrtS tj | ¡S )z3Creates a new stream for either CPU or CUDA device.Úcuda)ÚtypeÚ	CPUStreamÚtorchr   ÚStream©r   r   r   r   r      s    
c                 C   s   | j dkrtS tj | ¡S )z@:func:`torch.cuda.current_stream` for either CPU or CUDA device.r   )r   r   r   r   r	   r   r   r   r   r	   &   s    
c                 C   s   | j dkrtS tj | ¡S )z@:func:`torch.cuda.default_stream` for either CPU or CUDA device.r   )r   r   r   r   r
   r   r   r   r   r
   -   s    
)NNNc              	   c   s6   | j dkrdV  dS tj | ¡� dV  W 5 Q R X dS )z8:func:`torch.cuda.device` for either CPU or CUDA device.r   N)r   r   r   r   r   r   r   r   r   4   s
    
)Ústreamr   c              	   c   s8   t | ƒsdV  dS tj t| ƒ¡� dV  W 5 Q R X dS )z8:func:`torch.cuda.stream` for either CPU or CUDA stream.N)r   r   r   r    r   ©r    r   r   r   r   ?   s
    c                 C   s   t | ƒrt| ƒjS t d¡S )z(Gets the device from CPU or CUDA stream.Úcpu)r   r   r   r   r!   r   r   r   r   J   s    
)ÚsourceÚtargetr   c                 C   s4   t |ƒr0t | ƒr$t| ƒ t|ƒ¡ nt|ƒ ¡  dS )zœ:meth:`torch.cuda.Stream.wait_stream` for either CPU or CUDA stream. It
    makes the source stream wait until the target stream completes work queued.
    N)r   r   r   Zsynchronize)r#   r$   r   r   r   r   Q   s    )Útensorr    r   c                 C   s0   t |ƒr,|  dg¡ |  ¡ ¡} |  t|ƒ¡ dS )zA:meth:`torch.Tensor.record_stream` for either CPU or CUDA stream.r   N)r   Z	new_emptyÚset_Z_typed_storager   r   )r%   r    r   r   r   r   `   s    	c                 C   s   | t k	S )z<Returns ``True`` if the given stream is a valid CUDA stream.)r   r!   r   r   r   r   q   s    c                 C   s   t tjj| ƒS )z5Casts the given stream as :class:`torch.cuda.Stream`.)r   r   r   r   r!   r   r   r   r   v   s    )Ú__doc__Ú
contextlibr   Útypingr   r   r   r   r   r   ÚstrÚ__annotations__r   r   r   r   ZAbstractStreamr   r   r	   r
   r   r   r   r   ZTensorr   Úboolr   r   r   r   r   r   Ú<module>   s6        þ

