U
    ©Ê¹j�  ã                   @   sº   U d Z ddlmZ ddlmZmZmZmZmZ ddl	Z	ddl	m
Z
 ddlmZmZmZmZmZmZ dd	d
gZee ed< ee
 ZG dd„ dƒZG dd	„ d	e	jjƒZG dd
„ d
e	jjƒZdS )zkAutograd functions for stream-aware CUDA copy. It is used to overlap copy
and computation on the same GPU.
é    )Údeque)ÚDequeÚListÚOptionalÚTupleÚSequenceN)ÚTensoré   )ÚAbstractStreamÚcurrent_streamÚ
get_deviceÚrecord_streamÚ
use_streamÚwait_streamÚContextÚCopyÚWaitÚ__all__c                   @   s   e Zd ZU eed< eed< dS )r   Úprev_streamÚnext_streamN)Ú__name__Ú
__module__Ú__qualname__r
   Ú__annotations__© r   r   úc/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/distributed/pipeline/sync/copy.pyr      s   
c                   @   sJ   e Zd ZdZeeeeedœdd„ƒZeee	e
ee	 df dœdd„ƒZd	S )
r   z#Copies tensors on specific streams.©Úctxr   r   Úreturnc              
   G   sœ   || _ || _g }tt|ƒƒ}t|ƒ�j t|ƒ�V |D ]J}t |¡rt|jt|ƒdd�}| |¡ t	||ƒ t	||ƒ q4| |¡ q4W 5 Q R X W 5 Q R X t
|ƒS )NT©Znon_blocking)r   r   r   r   r   ÚtorchÚ	is_tensorÚtoÚappendr   Útuple)r   r   r   ÚinputÚoutputZoutput_streamÚxÚyr   r   r   Úforward!   s    


 zCopy.forward.)r   Úgrad_outputr   c           	   
   G   sœ   | j }| j}tt|ƒd�}tt|ƒƒ}t|ƒ�X t|ƒ�D t|ƒD ]4}|jt|ƒdd�}| 	|¡ t
||ƒ t
||ƒ qBW 5 Q R X W 5 Q R X d}|t|ƒ S )N)ÚmaxlenTr   ©NN)r   r   r   Úlenr   r   r   Úreversedr"   Ú
appendleftr   r$   )	r   r*   r   r   Ú
grad_inputZinput_streamr'   r(   Úgrad_streamsr   r   r   Úbackward:   s    

 zCopy.backwardN©r   r   r   Ú__doc__Ústaticmethodr   r
   ÚTensorsr)   r   r   r   r2   r   r   r   r   r      s
   c                   @   sJ   e Zd ZdZeeeeedœdd„ƒZeee	e
ee	 df dœdd„ƒZd	S )
r   z½Synchronizes a stream to another stream.

    Place it just before you want to start an operation on the next stream,
    provided that all operations on the previous stream are done.

    r   c                 G   s(   || _ || _t||ƒ tdd„ |D ƒƒS )Nc                 s   s$   | ]}t  |¡r| ¡ n|V  qd S )N)r    r!   Údetach)Ú.0r'   r   r   r   Ú	<genexpr>a   s     zWait.forward.<locals>.<genexpr>)r   r   r   r$   )r   r   r   r%   r   r   r   r)   Y   s    
zWait.forward.)r   r0   r   c                 G   s"   | j }| j}t||ƒ d}|| S )Nr,   )r   r   r   )r   r0   r   r   r1   r   r   r   r2   c   s
    
zWait.backwardNr3   r   r   r   r   r   Q   s
   )r4   Úcollectionsr   Útypingr   r   r   r   r   r    r   Ústreamr
   r   r   r   r   r   r   Ústrr   r6   r   ZautogradÚFunctionr   r   r   r   r   r   Ú<module>   s    3