a
    h                  
   @   sT  d dl Z d dlZd dlmZ d dlmZmZ d dlZg dZ	d Z
dd Zdd Zd	d
 Zdd Zeejeej f ddddZde
ddfddZdd e
ddfddeej eeejeej f  eeeeejj  eeej  ddddZdeej eddddZd eej eej ddddZe
ddfeej eej eddddZdS )!    N)Sequence)OptionalUnion)
all_reducereduce	broadcast
all_gatherreduce_scatterc                 C   st   t tjdstd dS t }| D ]J}|jr4 dS | sB dS |jsN dS |	 }||v rd dS |
| q$dS )N_nccl_all_reducez)PyTorch is not compiled with NCCL supportFT)hasattrtorch_CwarningswarnsetZ	is_sparseZis_contiguousZis_cudaZ
get_deviceadd)ZtensorsZdevicesZtensorZdevice r   =/var/www/auris/lib/python3.9/site-packages/torch/cuda/nccl.pyis_available   s     
r   c                  C   sX   t j } | d? }| d? d@ }| d@ }t j d}|dkrH|||fS ||||fS dS )a  
    Returns the version of the NCCL.


    This function returns a tuple containing the major, minor, and patch version numbers of the NCCL.
    The suffix is also included in the tuple if a version suffix exists.
    Returns:
        tuple: The version information of the NCCL.
           i  zutf-8 N)r   r   Z_nccl_versionZ_nccl_version_suffixdecode)vermajorminorpatchsuffixr   r   r   version$   s    


r   c                   C   s
   t j S N)r   r   Z_nccl_unique_idr   r   r   r   	unique_id9   s    r    c                 C   s   t j| ||S r   )r   r   Z_nccl_init_rank)Z	num_ranksuidZrankr   r   r   	init_rank=   s    r"   )inputsreturnc                 C   s&   t | tjjrt | tjr"tdd S )Nz(Inputs should be a collection of tensors)
isinstancecollectionsabc	Containerr   Tensor	TypeError)r#   r   r   r   _check_sequence_typeA   s    r+   c                 C   s4   t |  |d u r| }t | tj| |||| d S r   )r+   r   r   r
   r#   outputsopstreamscommsr   r   r   r   H   s
    r   )r-   )r#   outputrootr.   r/   r-   r$   c                C   s   t |  |d ur<|d ur"tdqtjdtdd || }nHt|tjspt|tj	j
rptjdtdd || }n|d u r| | n|}tj| ||||| d S )Nz'output' and 'outputs' can not be both specified. 'outputs' is deprecated in favor of 'output', taking in a single output tensor. The signature of reduce is: reduce(inputs, output=None, root=0, op=SUM, streams=None, comms=None).z`nccl.reduce` with an output tensor list is deprecated. Please specify a single output tensor with argument 'output' instead instead.   )
stacklevelz\nccl.reduce with an output tensor list is deprecated. Please specify a single output tensor.)r+   
ValueErrorr   r   FutureWarningr%   r   r)   r&   r'   r   r   Z_nccl_reduce)r#   r1   r2   r.   r/   r0   r-   _outputr   r   r   r   R   s.    


r   )r#   r2   r$   c                 C   s   t |  tj| ||| d S r   )r+   r   r   Z_nccl_broadcast)r#   r2   r/   r0   r   r   r   r   }   s    r   )r#   r-   r$   c                 C   s&   t |  t | tj| ||| d S r   )r+   r   r   Z_nccl_all_gather)r#   r-   r/   r0   r   r   r   r      s    r   )r#   r-   r.   r$   c                 C   s(   t |  t | tj| |||| d S r   )r+   r   r   Z_nccl_reduce_scatterr,   r   r   r   r	      s    r	   )r   NN)NN)r&   r   collections.abcr   typingr   r   Z
torch.cudar   __all__ZSUMr   r   r    r"   r)   r+   r   intZcudaZStreamr   r   r   r	   r   r   r   r   <module>   sb    , 

  