o
    װi                     @   s  d dl Z d dlZd dlmZmZmZ d dlmZ d dlm	  m
Z d dlm	  mZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ ejrXd d
lmZ n	G dd dZeZejG dd dZe ee e!df f Z"ejrdee# de$e#ef fddZ%dededededede#defddZ&dS dee# de$e#ef fddZ%dededededede#defddZ&dS )    N)AnyIterableIterator)ndarray)Device)Event)Stream)get_current_stream)nccl)_get_nccl_dtype_and_count)NcclCommunicatorc                   @   s   e Zd ZdS )_MockCommunicatorN)__name__
__module____qualname__ r   r   Z/home/ubuntu/.local/lib/python3.10/site-packages/cupyx/distributed/array/_data_transfer.pyr      s    r   c                   @   sL   e Zd ZU eed< eed< dZeed< d
ddZe	j
dee fdd	ZdS )
_AsyncDataarrayreadyN
prevent_gcreturnc                 C   sT   |   }| j }|| j t|| | jW  d    S 1 s#w   Y  d S N)on_readyr   copyrecordr   r   r   )selfstreamr   r   r   r   r      s
   

$z_AsyncData.copyc                 c   sH    | j j t }|| j |V  W d    d S 1 sw   Y  d S r   )r   devicer	   
wait_eventr   )r   r   r   r   r   r   &   s   
"z_AsyncData.on_ready)r   r   )r   r   r   r   __annotations__r   r   r   r   
contextlibcontextmanagerr   r   r   r   r   r   r   r      s   
 
r   .devicesr   c                 C   s   t t| }dd |D S )Nc                 S   s   i | ]}|  |qS r   )	device_id).0commr   r   r   
<dictcomp>7   s    )_create_communicators.<locals>.<dictcomp>)_CommunicatorinitAlllist)r#   
comms_listr   r   r   _create_communicators3   s   r-   src_comm
src_streamsrc_datadst_comm
dst_streamdst_devc                 C   s  |j jj}||krt|j |jS t|}t|}zt| |  ||j t	
|j }	W d    n1 s9w   Y  t| |  t|	j|	j}
W d    n1 sYw   Y  t|	\}}t  t| | |	jj||| |j W d    n1 sw   Y  t|T ||
jj|||  |j t  t|
| |dW  d    W t| |  W d    n1 sw   Y  t| |  W d    S 1 sw   Y  S 1 sw   Y  W t| |  W d    n1 sw   Y  t| |  W d    d S 1 sw   Y  d S t| |  W d    n	1 s3w   Y  t| |  W d    w 1 sLw   Y  w N)r   )r   r   idr   r   r	   r   user   _creation_from_dataascontiguousarray_creation_basicemptyshapedtyper   r
   
groupStartsenddataptrrank_idrecvgroupEndr   )r.   r/   r0   r1   r2   r3   src_devprev_src_streamprev_dst_stream	src_arraydst_bufr<   countr   r   r   	_transfer9   sl   















$



 rJ   c                 C   s   dd | D S )Nc                 S   s   i | ]}|t  qS r   )r)   )r%   devr   r   r   r'   f   s    r(   r   )r#   r   r   r   r-   c   s   c           	   	   C   s   |j jj}||krt|j |jS t|/ t }z%|  ||j |j 	 }t||
 |j dW |  W  d    S |  w 1 sFw   Y  d S r4   )r   r   r5   r   r   r   r	   r6   r   r   r   )	r.   r/   r0   r1   r2   r3   rD   prev_stream	dst_arrayr   r   r   rJ   h   s    




)'r!   dataclassestypingr   r   r   cupy._core.corer   cupy._creation.from_data	_creation	from_datar7   cupy._creation.basicbasicr9   cupy.cuda.devicer   cupy.cuda.streamr   r   r	   	cupy.cudar
   cupyx.distributed._nccl_commr   	availablecupy.cuda.ncclr   r)   r   	dataclassr   tupleslice_PartialUpdateintdictr-   rJ   r   r   r   r   <module>   sx    

*

