U
    d                     @   s^   d dl Zd dlZd dlmZmZmZmZ eej	 dG dd dej
ZedkrZe  dS )    N)core	workspacemuji	test_utilzno gpuc                   @   sD   e Z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 )TestMujic           	   	   C   s   t d}|D ]6}|jg dt| ddddgt|d t|d q||dd	 |D d
| t| t	|t
| }t }|  |D ]}td|t| q|D ]8}tdt| d
 }tjj||d|t|f d qdS )z,A base function to test different scenarios.Zmujitesttestblob_gpu_            )shapevalueZdevice_optionc                 S   s   g | ]}d t | qS )r   )str).0i r   ;/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/muji_test.py
<listcomp>   s   z5TestMuji.RunningAllreduceWithGPUs.<locals>.<listcomp>Z_reducedz{} {}zgpu id %d of %s)err_msgN)r   ZNetZConstantFillr   floatr   ZOnGPUr   Z
RunNetOncesumlenZBlobssortprintformatZ	FetchBlobnpZtestingZassert_array_equal)	selfZgpu_idsZallreduce_functionnetidZtarget_valueZ	all_blobsZblobidxr   r   r   RunningAllreduceWithGPUs	   s<    



  
z!TestMuji.RunningAllreduceWithGPUsc                 C   s   |  ttt tj d S N)r    listranger   NumGpuDevicesr   ZAllreduceFallback)r   r   r   r   testAllreduceFallback'   s     zTestMuji.testAllreduceFallbackc                 C   s&   t t D ]}| |gtj qd S r!   )r#   r   r$   r    r   Z	Allreduce)r   r   r   r   r   testAllreduceSingleGPU,   s    zTestMuji.testAllreduceSingleGPUc                 C   sP   t  }|jd dkrDt|d dd df rD| ddgtj ntd d S )Nr   r	   r   z6Skipping allreduce with 2 gpus. Not peer access ready.)	r   GetGpuPeerAccessPatternr   r   allr    r   Z
Allreduce2r   r   patternr   r   r   testAllreduceWithTwoGPUs0   s    (z!TestMuji.testAllreduceWithTwoGPUsc                 C   sT   t  }|jd dkrHt|d dd df rH| ddddgtj ntd d S )Nr   r   r   r	   r
   z6Skipping allreduce with 4 gpus. Not peer access ready.)	r   r'   r   r   r(   r    r   Z
Allreduce4r   r)   r   r   r   testAllreduceWithFourGPUs7   s    (z"TestMuji.testAllreduceWithFourGPUsc                 C   sn   t  }|jd dkrbt|d dd df rbt|ddddf rb| ddddgtj ntd d S )Nr   r   r	   r   r
   zCSkipping allreduce with 4 gpus and 2 groups. Not peer access ready.)	r   r'   r   r   r(   r    r   ZAllreduce4Group2r   r)   r   r   r   %testAllreduceWithFourGPUsAndTwoGroups>   s    Bz.TestMuji.testAllreduceWithFourGPUsAndTwoGroupsc                 C   sn   t  }|jd dkrbt|d dd df rbt|dd dd f rb| ttdtj	 nt
d d S )Nr      r   z6Skipping allreduce with 8 gpus. Not peer access ready.)r   r'   r   r   r(   r    r"   r#   r   Z
Allreduce8r   r)   r   r   r   testAllreduceWithEightGPUsE   s    
 z#TestMuji.testAllreduceWithEightGPUsN)
__name__
__module____qualname__r    r%   r&   r+   r,   r-   r/   r   r   r   r   r      s   r   __main__)Znumpyr   ZunittestZcaffe2.pythonr   r   r   r   ZskipIfZhas_gpu_supportZTestCaser   r0   mainr   r   r   r   <module>   s   I