o
    "ja                     @   s@   d dl Z ddlmZmZ ddlmZ edG dd deZdS )    N   )PassBaseregister_pass)AutoParallelStreamTypeZ!allreduce_matmul_grad_overlappingc                       sN   e Zd Z fddZdd Zdd Zdd Zd	d
 ZdddZdd Z	  Z
S )"AllreduceMatmulGradOverlappingPassc                    s   t    | dd  d S )NZallreduce_stream)super__init__Zset_attrself	__class__ |/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/distributed/passes/allreduce_matmul_grad_overlapping.pyr       s   
z+AllreduceMatmulGradOverlappingPass.__init__c                 C      dS NTr   r	   r   r   r   _check_self$      z.AllreduceMatmulGradOverlappingPass._check_selfc                 C   r   r   r   )r
   Z
other_passr   r   r   _check_conflict'   r   z2AllreduceMatmulGradOverlappingPass._check_conflictc                 C   s"   |  }| |}| || d S N)Zglobal_block(_get_all_matmul_grad_and_allreduce_pairs0_split_matmul_grad_and_multi_streaming_allreduce)r
   Zmain_programZstartup_programcontextblockmatmul_grad_id_to_allreduce_idr   r   r   _apply_single_impl*   s   z5AllreduceMatmulGradOverlappingPass._apply_single_implc           
      C   s   |j }t|}t }t|D ]:\}}|jdkrI|ddu rI|ddu rI|d}t|d |D ]}|| }	|	jdkrH|		d|krH|||< q2q|S )	NZmatmul_v2_gradtrans_xFtrans_yX@GRADr   Zc_allreduce_sumX)
opslencollectionsOrderedDict	enumeratetypeattroutputrangeinput)
r
   r   r   Zop_numr   iZop_ix_gradjZop_jr   r   r   r   3   s   


zKAllreduceMatmulGradOverlappingPass._get_all_matmul_grad_and_allreduce_pairsNc           	      C   s|   | |d }|d u r|j|d  d|jdd}|j|d  d|jd}|j|dd|i||d	||d
d |  |S )Nr   @reshape.outFnamedtypeZpersistablez@reshape.xshape)r.   r/   Zreshape2r   )OutZXShape)shapeop_roleindexr$   ZinputsZoutputsattrs)var
create_varr/   _insert_op_without_sync_sync_with_cpp)	r
   r   r4   xr1   r2   outvar_xZx_shaper   r   r   _insert_reshape_opG   s&   z5AllreduceMatmulGradOverlappingPass._insert_reshape_opc              
   C   sh  |j }t| D ]'\}}|| }|| }|d}|r%J d| d|d}	|	r4J d| dtjj|j_|	d}
|	d}|	d}|
d	}|
d
}|d}||
d }||d }||d }|j}|j}|j}t|t|ksJ dt| dt| dt|dkr|dd |dd ksJ d| d| d|d |d  gt|dd   }|d |d  gt|dd   }| ||d |
||}| ||d |||}|j|d  d|jdd}|j|d d||dd|idd|dd | ||d |jg||| |j|d d||dd|idd|dd || |  q	d S )Nr   zmatmul_grad(id=zV) with tran_x == True is not supported for column parallel linear backward overlappingr   zV) with tran_y == True is not supported for column parallel linear backward overlappingr   YzOut@GRADr   zY@GRADr2   r   zBThe rank of x must be equal to that of out_grad, but got x rank = z and out_grad rank = .   zPThe first two dimensions of x must be equal to that of out_grad, but got x_dims:z and out_grad_dims:r   r,   Fr-      Z	matmul_v2)r   r>   r0   T)r   r   r2   r3      )r   reverseditemsr%   r   Z	MP_STREAMvalueZ	dist_attrZexecution_streamr(   r&   r6   r1   r    listr=   r7   r/   r8   r.   Z
_remove_opr9   )r
   r   r   r   Zmatmul_grad_idZallreduce_idZmatmul_grad_opZallreduce_opZtran_xZtran_yr:   yZout_gradr*   Zy_gradr2   r<   Zvar_out_gradZ
var_y_gradZx_dimsZout_grad_dimsZy_grad_dimsZ
new_x_dimsZnew_out_grad_dimsZnew_xZnew_out_gradZ
new_y_gradr   r   r   r   ^   s   









"
	


zSAllreduceMatmulGradOverlappingPass._split_matmul_grad_and_multi_streaming_allreducer   )__name__
__module____qualname__r   r   r   r   r   r=   r   __classcell__r   r   r   r   r      s    	
r   )r!   Z	pass_baser   r   Z
pass_utilsr   r   r   r   r   r   <module>   s
   