o
    Ne  ã                   @   s>   d dl mZ G dd„ deƒZedkred dƒZe ¡  dS dS )é   )Ú	MPIHelperc                   @   s’   e Zd ZdZd%dd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$S )&ÚPaddlePSInstancea!  
        PaddlePSInstance class is used to generate A instance of server or worker 
        Args:
            server_worker_mode: is a value 0 or 1, default is 1
            proc_per_node: process per node, default is 2 
        Examples:
            instance = PaddlePSInstance(1, 2)
    r   é   c                 C   s„   t ƒ | _| j ¡ | _|| _|| _| j ¡ | _d| _| j| j d | _	| j| j d | _
| j	| j
 | _d | _|  ¡  d | _|  ¡  d S )Né    r   )r   ÚdhZget_rankÚ_rankidÚ_server_worker_modeÚ_proc_per_nodeÚget_sizeÚ_nodesÚ_ipÚ_worker_numÚ_server_numÚ_total_server_workerÚ
_node_typeÚ_set_nodetypeÚ_commÚ_split_comm)ÚselfZserver_worker_modeZproc_per_node© r   úTD:\Projects\ConvertPro\env\Lib\site-packages\paddle/fluid/distributed/ps_instance.pyÚ__init__   s   zPaddlePSInstance.__init__c                 C   s’   | j dkr | j| jk rd| _d S | j| jk rd| _d S d| _d S | j dkrD| j| jk r?d| j| j d kr:d| _d S d| _d S d| _d S d| _d S )Nr   r   éÿÿÿÿr   )r   r   r   r   r   r	   ©r   r   r   r   r   +   s   








zPaddlePSInstance._set_nodetypec                 C   s<   |   ¡ r| jj | j¡| _d S |  ¡ r| jj | j¡| _d S )N)Ú	is_serverr   ÚcommZSplitr   r   Ú	is_workerr   r   r   r   r   >   s   þzPaddlePSInstance._split_commc                 C   s"   | j dkr| j| jkS | j| j S )z&
        Return worker index 
        r   )r   r   Z
server_numr	   r   r   r   r   Úget_worker_idE   s   
zPaddlePSInstance.get_worker_idc                 C   s   | j dkr| jS | j| j S )z&
        Return server index 
        r   )r   Zrank_idr	   r   r   r   r   Úget_server_idN   s   
zPaddlePSInstance.get_server_idc                 C   ó
   | j dkS )z2
        Return instance is worker or not
        r   ©r   r   r   r   r   r   W   ó   
zPaddlePSInstance.is_workerc                 C   r   )z2
        Return instance is server or not
        r   r    r   r   r   r   r   ]   r!   zPaddlePSInstance.is_serverc                 C   s   |   ¡ o	d|  ¡ kS )z8
        Return instance is first worker or not
        r   )r   r   r   r   r   r   Úis_first_workerc   s   z PaddlePSInstance.is_first_workerc                 C   s
   || _ dS )z#
            set server ip
        N)r   )r   Úipr   r   r   Úset_ipi   r!   zPaddlePSInstance.set_ipc                 C   s   | j j | j¡| _| jS )zJ
        Return all servers and workers ip through mpi allgather 
        )r   r   Z	allgatherr   Z_ipsr   r   r   r   Ú
gather_ipso   s   zPaddlePSInstance.gather_ipsc                 C   ó   | j S )z!
        Return node cnt
        )r   r   r   r   r   Úget_node_cntv   ó   zPaddlePSInstance.get_node_cntc                 C   r&   )z#
        Return worker num
        )r   r   r   r   r   Úget_worker_num|   r(   zPaddlePSInstance.get_worker_numc                 C   r&   )z#
        Return server num
        )r   r   r   r   r   Úget_server_num‚   r(   zPaddlePSInstance.get_server_numc                 C   s   | j j ¡  dS )z-
        barrier workers and servers
        N)r   r   Úbarrierr   r   r   r   Úbarrier_allˆ   s   zPaddlePSInstance.barrier_allc                 C   s   |   ¡ r	| j ¡  dS )z!
        barrier workers
        N)r   r   r+   r   r   r   r   Úbarrier_workerŽ   s   
zPaddlePSInstance.barrier_workerc                 C   s   | j  ¡  dS )z
        MPI finalize
        N)r   Úfinalizer   r   r   r   r.   –   s   
zPaddlePSInstance.finalizeN)r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r"   r$   r%   r'   r)   r*   r,   r-   r.   r   r   r   r   r      s$    
			r   Ú__main__r   N)Úhelperr   Úobjectr   r/   Úinstancer,   r   r   r   r   Ú<module>   s    
þ