Dear all, Dear George,

now it seems getting  better:

* CALL MPI_GROUP_INCL(GROUP_WORLD, nPSObranch, MRANKS, MASTER_GROUP,ierr)*
* !!Create a new communicator based on the group*
* CALL
MPI_COMM_CREATE_GROUP(MPI_COMM_WORLD,MASTER_GROUP,0,MASTER_COMM,iErr)*
* IF(MPI_COMM_NULL .NE. MASTER_COMM)THEN*
*    CALL MPI_COMM_RANK(MASTER_COMM, MPImaster%rank,MPIlocal%iErr)*
*    CALL MPI_COMM_SIZE(MASTER_COMM, MPImaster%nCPU,MPIlocal%iErr)*
* ELSE*
*    MPImaster%rank = MPI_PROC_NULL*
* ENDIF*

I have a further question.
How Can I automatically choose a communicator. I mean, now I have three
group and a three communicator: WORLD, LOCAL and MASTER

If I do this:

CALL MPI_SCATTER(PP, npart, MPI_DOUBLE, PPL, 10,MPI_DOUBLE, 0, *MASTER_COMM*,
iErr)

I get an error. This because some CPU does not belong to MATER_COMM. The
alternative should be:

IF(rank.LT.0)THEN
    CALL MPI_SCATTER(PP, npart, MPI_DOUBLE, PPL, 10,MPI_DOUBLE, 0,
*MASTER_COMM*, iErr)
ENDIF

Is there any smarter way do to this?

Thanks again



Diego


On 28 July 2017 at 20:07, Diego Avesani <diego.aves...@gmail.com> wrote:

> Dear George, Dear all,
>
> I have just rewritten the code to make it more clear:
>
> * INTEGER :: colorl,colorglobal*
> * INTEGER :: LOCAL_COMM,MASTER_COMM*
>
> * !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
> * !-----------------------------------------------*
> * ! create WORLD communicator*
> * !-----------------------------------------------*
> * CALL MPI_INIT(MPIworld%iErr)*
> * CALL MPI_COMM_SIZE(MPI_COMM_WORLD, MPIworld%nCPU, MPIworld%iErr)  !get
> the nCPU*
> * CALL MPI_COMM_RANK(MPI_COMM_WORLD, MPIworld%rank, MPIworld%iErr)  !get
> the rank*
> * !*
> * colorl = MPIworld%rank/4*
> * !*
> * !-----------------------------------------------*
> * ! create LOCAL communicator*
> * !-----------------------------------------------*
> * CALL
> MPI_COMM_SPLIT(MPI_COMM_WORLD,colorl,MPIworld%rank,LOCAL_COMM,MPIworld%iErr)*
> * CALL MPI_COMM_RANK(LOCAL_COMM, MPIlocal%rank,MPIlocal%iErr)*
> * CALL MPI_COMM_SIZE(LOCAL_COMM, MPIlocal%nCPU,MPIlocal%iErr)*
> * !*
> * !*
> * !WRITE(*,'(A15,I3,A15,I3)') 'WORLD RANK  ',MPIworld%rank,'LOCAL RANK
>  ',MPIlocal%rank*
> * !*
> * !-----------------------------------------------*
> * ! create MASTER communicator*
> * !-----------------------------------------------*
> * IF(MOD(MPIworld%rank,4).EQ.0)THEN*
> *    colorglobal = MOD(MPIworld%rank,4)*
> * ELSE*
> *    colorglobal = MPI_COMM_NULL*
> * ENDIF*
> * !*
> * CALL
> MPI_COMM_SPLIT(MPI_COMM_WORLD,colorglobal,MPIworld%rank,MASTER_COMM,MPIworld%iErr)*
> * CALL MPI_COMM_RANK(MASTER_COMM, MPImaster%rank,MPImaster%iErr)*
> * CALL MPI_COMM_SIZE(MASTER_COMM, MPImaster%nCPU,MPImaster%iErr)*
> * !*
> * !*
> * WRITE(*,'(A15,I3,A15,I3,A15,I3)') 'WORLD RANK  ',MPIworld%rank,'LOCAL
> RANK  ',MPIlocal%rank,'MASTER  ',MPImaster%nCPU *
>
> This is the result:
>
> WORLD RANK    2   LOCAL RANK    2       MASTER   12
> WORLD RANK    3   LOCAL RANK    3       MASTER   12
> WORLD RANK   10   LOCAL RANK    2       MASTER   12
> *WORLD RANK   12   LOCAL RANK    0       MASTER    4*
> WORLD RANK    1   LOCAL RANK    1       MASTER   12
> WORLD RANK    5   LOCAL RANK    1       MASTER   12
> *WORLD RANK    4   LOCAL RANK    0       MASTER    4*
> WORLD RANK    6   LOCAL RANK    2       MASTER   12
> WORLD RANK   13   LOCAL RANK    1       MASTER   12
> WORLD RANK   14   LOCAL RANK    2       MASTER   12
> WORLD RANK    7   LOCAL RANK    3       MASTER   12
> WORLD RANK   11   LOCAL RANK    3       MASTER   12
> *WORLD RANK    0   LOCAL RANK    0       MASTER    4*
> *WORLD RANK    8   LOCAL RANK    0       MASTER    4*
> WORLD RANK    9   LOCAL RANK    1       MASTER   12
> WORLD RANK   15   LOCAL RANK    3       MASTER   12
>
> I am expecting only a new communicator only for the master but it seems
> that I get two new groups despite I set "*colorglobal = MPI_COMM_NULL*"
>
> What do think? Is there something that I haven't understood properly?
>
> Thanks again, I am trying to learn better MPI_Comm_create_group.
>
> Thanks
>
>
> Diego
>
>
> On 28 July 2017 at 16:59, Diego Avesani <diego.aves...@gmail.com> wrote:
>
>> Dear George, Dear all,
>>
>> here the code:
>>
>> PROGRAM TEST
>> USE MPI
>> IMPLICIT NONE
>> ! mpif90 -r8 *.f90
>> !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>> +++++++++++++++++
>> INTEGER   :: rank
>> INTEGER   :: subrank,leader_rank
>> INTEGER   :: nCPU
>> INTEGER   :: subnCPU
>> INTEGER   :: ierror
>> INTEGER   :: tag
>> INTEGER   :: status(MPI_STATUS_SIZE)
>> INTEGER   :: colorloc,colorglobal
>> INTEGER   :: NEW_COMM,LEADER_COMM
>> !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>> +++++++++++++++++
>>  CALL MPI_INIT(ierror)
>>  CALL MPI_COMM_SIZE(MPI_COMM_WORLD, nCPU, ierror)
>>  CALL MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierror)
>>  !
>>  colorloc = rank/4
>>  !
>>  !
>>  CALL MPI_COMM_SPLIT(MPI_COMM_WORLD,colorloc,rank,NEW_COMM,ierror)
>>  CALL MPI_COMM_RANK(NEW_COMM, subrank,ierror);
>>  CALL MPI_COMM_SIZE(NEW_COMM, subnCPU,ierror);
>>  !
>>  IF(MOD(rank,4).EQ.0)THEN
>>     colorglobal = MOD(rank,4)
>>  ELSE
>>     colorglobal = *MPI_COMM_NULL*
>>  ENDIF
>>  !
>>  CALL MPI_COMM_SPLIT(MPI_COMM_WORLD,colorglobal,rank,LEADER_COMM,ierror)
>>  CALL MPI_COMM_RANK(LEADER_COMM, leader_rank,ierror);
>>  !
>>  CALL MPI_FINALIZE(ierror)
>> ENDPROGRAM
>>
>> Now, it works.
>>
>> Could you please explain me "*MPI_Comm_create_group*". I am trying buy
>> my self, but it seems quite different from MPI_SPLIT_COMM.
>>
>> Again, really, really thanks
>>
>> Diego
>>
>>
>> On 28 July 2017 at 16:02, George Bosilca <bosi...@icl.utk.edu> wrote:
>>
>>> I guess the second comm_rank call is invalid on all non-leader
>>> processes, as their LEADER_COMM communicator is MPI_COMM_NULL.
>>>
>>> george
>>>
>>> On Fri, Jul 28, 2017 at 05:06 Diego Avesani <diego.aves...@gmail.com>
>>> wrote:
>>>
>>>> Dear George, Dear all,
>>>>
>>>> thanks, thanks a lot. I will tell you everything.
>>>> I will try also to implement your suggestion.
>>>>
>>>> Unfortunately,  the program that I have show to you is not working. I
>>>> get the following error:
>>>>
>>>> [] *** An error occurred in MPI_Comm_rank
>>>> [] *** reported by process [643497985,7]
>>>> [] *** on communicator MPI_COMM_WORLD
>>>> [] *** MPI_ERR_COMM: invalid communicator
>>>> [] *** MPI_ERRORS_ARE_FATAL (processes in this communicator will now
>>>> abort,
>>>> [] ***    and potentially your MPI job)
>>>> [warn] Epoll ADD(4) on fd 47 failed.  Old events were 0; read change
>>>> was 0 (none); write change was 1 (add): Bad file descriptor
>>>> [warn] Epoll ADD(4) on fd 65 failed.  Old events were 0; read change
>>>> was 0 (none); write change was 1 (add): Bad file descriptor
>>>> [] 8 more processes have sent help message help-mpi-errors.txt /
>>>> mpi_errors_are_fatal
>>>> [] Set MCA parameter "orte_base_help_aggregate" to 0 to see all help /
>>>> error messages
>>>>
>>>> What do you think could be the error?
>>>>
>>>> Really, Really thanks again
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> Diego
>>>>
>>>>
>>>> On 27 July 2017 at 15:57, George Bosilca <bosi...@icl.utk.edu> wrote:
>>>>
>>>>> This looks good. If performance is critical you can speed up the
>>>>> entire process by using MPI_Comm_create_group instead of the second
>>>>> MPI_COMM_SPLIT. The MPI_Comm_create_group is collective only over the
>>>>> resulting communicator and not over the source communicator, so its cost 
>>>>> is
>>>>> only dependent of the number of groups and not on the total number of
>>>>> processes.
>>>>>
>>>>> You can also try to replace the first MPI_COMM_SPLIT by the same
>>>>> approach. I would be curious to see the outcome.
>>>>>
>>>>>   George.
>>>>>
>>>>>
>>>>> On Thu, Jul 27, 2017 at 9:44 AM, Diego Avesani <
>>>>> diego.aves...@gmail.com> wrote:
>>>>>
>>>>>> Dear George, Dear all,
>>>>>>
>>>>>> I have tried to create a simple example. In particular, I would like
>>>>>> to use 16 CPUs and to create four groups according to rank is and then a
>>>>>> communicator between masters of each group.I have tried to follow the 
>>>>>> first
>>>>>> part of this example
>>>>>> <http://mpitutorial.com/tutorials/introduction-to-groups-and-communicators/>.
>>>>>> In the last part I have tried to create a communicator be masters as
>>>>>> suggested by George.
>>>>>>
>>>>>> Here my example:
>>>>>>
>>>>>>  CALL MPI_INIT(ierror)
>>>>>>  CALL MPI_COMM_SIZE(MPI_COMM_WORLD, nCPU, ierror)
>>>>>>  CALL MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierror)
>>>>>>  !
>>>>>>  colorloc = rank/4
>>>>>>  !
>>>>>>  CALL MPI_COMM_SPLIT(MPI_COMM_WORLD,colorloc,rank,*NEW_COMM*,ierror)
>>>>>>  CALL MPI_COMM_RANK(*NEW_COMM*, subrank,ierror);
>>>>>>  CALL MPI_COMM_SIZE(*NEW_COMM*, subnCPU,ierror);
>>>>>>  !
>>>>>>  IF(MOD(rank,4).EQ.0)THEN
>>>>>>     *! where I set color for the masters*
>>>>>>     colorglobal = MOD(rank,4)
>>>>>>  ELSE
>>>>>>     colorglobal = MPI_UNDEFINED
>>>>>>  ENDIF
>>>>>>  !
>>>>>>  CALL MPI_COMM_SPLIT(MPI_COMM_WORLD,colorglobal,rank,LEADER_COMM,i
>>>>>> error)
>>>>>>  CALL MPI_COMM_RANK(*LEADER_COMM*, leader_rank,ierror);
>>>>>>  CALL MPI_FINALIZE(ierror)
>>>>>>
>>>>>> I would like to know if this could be correct. I mean if I have
>>>>>> understood correctly what George told me about the code design. Now, this
>>>>>> example does not work, but probably there is some coding error.
>>>>>>
>>>>>> Really, Really thanks
>>>>>> Diego
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> Diego
>>>>>>
>>>>>>
>>>>>> On 27 July 2017 at 10:42, Diego Avesani <diego.aves...@gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>>> Dear George, Dear all,
>>>>>>>
>>>>>>> A question regarding program design:
>>>>>>> The draft that I have sent to you has to be done many and many
>>>>>>> times. Does the splitting procedure ensure efficiency?
>>>>>>>
>>>>>>> I will try, at a lest to create groups and split them. I am a
>>>>>>> beginner in the MPI groups environment.
>>>>>>> really, really thanks.
>>>>>>>
>>>>>>> You are my lifesaver.
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Diego
>>>>>>>
>>>>>>>
>>>>>>> On 26 July 2017 at 15:09, George Bosilca <bosi...@icl.utk.edu>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Diego,
>>>>>>>>
>>>>>>>> As all your processes are started under the umbrella of a single
>>>>>>>> mpirun, they have a communicator in common, the MPI_COMM_WORLD.
>>>>>>>>
>>>>>>>> One possible implementation, using MPI_Comm_split, will be the
>>>>>>>> following:
>>>>>>>>
>>>>>>>> MPI_Comm small_comm, leader_comm;
>>>>>>>>
>>>>>>>> /* Create small_comm on all processes */
>>>>>>>>
>>>>>>>> /* Now use MPI_Comm_split on MPI_COMM_WORLD to select the leaders */
>>>>>>>> MPI_Comm_split( MPI_COMM_WORLD,
>>>>>>>>                              i_am_leader(small_comm) ? 1 :
>>>>>>>> MPI_UNDEFINED,
>>>>>>>>                          rank_in_comm_world,
>>>>>>>>                          &leader_Comm);
>>>>>>>>
>>>>>>>> The leader_comm will be a valid communicator on all leaders
>>>>>>>> processes, and MPI_COMM_NULL on all others.
>>>>>>>>
>>>>>>>>   George.
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On Wed, Jul 26, 2017 at 4:29 AM, Diego Avesani <
>>>>>>>> diego.aves...@gmail.com> wrote:
>>>>>>>>
>>>>>>>>> Dear George, Dear all,
>>>>>>>>>
>>>>>>>>> I use "mpirun -np xx ./a.out"
>>>>>>>>>
>>>>>>>>> I do not know if I have some common  grounds. I mean, I have to
>>>>>>>>> design everything from the begging. You can find what I would like to 
>>>>>>>>> do in
>>>>>>>>> the attachment. Basically, an MPI cast in another MPI. Consequently, 
>>>>>>>>> I am
>>>>>>>>> thinking to MPI groups or MPI virtual topology with a 2D cart, using 
>>>>>>>>> the
>>>>>>>>> columns as "groups" and the first rows as the external groups to 
>>>>>>>>> handle the
>>>>>>>>> columns.
>>>>>>>>>
>>>>>>>>> What do think? What do you suggest?
>>>>>>>>> Really Really thanks
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Diego
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On 25 July 2017 at 19:26, George Bosilca <bosi...@icl.utk.edu>
>>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>>> Diego,
>>>>>>>>>>
>>>>>>>>>> Assuming you have some common  grounds between the 4 initial
>>>>>>>>>> groups (otherwise you will have to connect them via
>>>>>>>>>> MPI_Comm_connect/MPI_Comm_accept) you can merge the 4 groups
>>>>>>>>>> together and then use any MPI mechanism to create a partial group of
>>>>>>>>>> leaders (such as MPI_Comm_split).
>>>>>>>>>>
>>>>>>>>>> If you spawn the groups via MPI_Comm_spawn then the answer is
>>>>>>>>>> slightly more complicated, you need to use MPI_Intercomm_create, 
>>>>>>>>>> with the
>>>>>>>>>> spawner as the bridge between the different communicators (and then
>>>>>>>>>> MPI_Intercomm_merge to create your intracomm). You can find a good 
>>>>>>>>>> answer
>>>>>>>>>> on stackoverflow on this at https://stackoverflow.com/ques
>>>>>>>>>> tions/24806782/mpi-merge-multiple-intercoms-into-a-single-in
>>>>>>>>>> tracomm
>>>>>>>>>>
>>>>>>>>>> How is your MPI environment started (single mpirun or
>>>>>>>>>> mpi_comm_spawn) ?
>>>>>>>>>>
>>>>>>>>>>   George.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Tue, Jul 25, 2017 at 10:44 AM, Diego Avesani <
>>>>>>>>>> diego.aves...@gmail.com> wrote:
>>>>>>>>>>
>>>>>>>>>>> Dear All,
>>>>>>>>>>>
>>>>>>>>>>> I am studying Groups and Communicators, but before start going
>>>>>>>>>>> in detail, I have a question about groups.
>>>>>>>>>>>
>>>>>>>>>>> I would like to know if is it possible to create a group of
>>>>>>>>>>> masters of the other groups and then a intra-communication in the 
>>>>>>>>>>> new
>>>>>>>>>>> group. I have spent sometime reading different tutorial and 
>>>>>>>>>>> presentation,
>>>>>>>>>>> but it is difficult, at least for me, to understand if is it 
>>>>>>>>>>> possible to
>>>>>>>>>>> create this sort of MPI cast in another MPI.
>>>>>>>>>>>
>>>>>>>>>>> In the attachment you can find a pictures that summarize what I
>>>>>>>>>>> would like to do.
>>>>>>>>>>>
>>>>>>>>>>> Another strategies could be use virtual topology.
>>>>>>>>>>>
>>>>>>>>>>> What do you think?
>>>>>>>>>>>
>>>>>>>>>>> I really, really, appreciate any kind of help, suggestions or
>>>>>>>>>>> link where I can study this topics.
>>>>>>>>>>>
>>>>>>>>>>> Again, thanks
>>>>>>>>>>>
>>>>>>>>>>> Best Regards,
>>>>>>>>>>>
>>>>>>>>>>> Diego
>>>>>>>>>>>
>>>>>>>>>>> _______________________________________________
>>>>>>>>>>> users mailing list
>>>>>>>>>>> users@lists.open-mpi.org
>>>>>>>>>>> https://rfd.newmexicoconsortium.org/mailman/listinfo/users
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> _______________________________________________
>>>>>>>>>> users mailing list
>>>>>>>>>> users@lists.open-mpi.org
>>>>>>>>>> https://rfd.newmexicoconsortium.org/mailman/listinfo/users
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> users mailing list
>>>>>>>>> users@lists.open-mpi.org
>>>>>>>>> https://rfd.newmexicoconsortium.org/mailman/listinfo/users
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> users mailing list
>>>>>>>> users@lists.open-mpi.org
>>>>>>>> https://rfd.newmexicoconsortium.org/mailman/listinfo/users
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> users mailing list
>>>>>> users@lists.open-mpi.org
>>>>>> https://rfd.newmexicoconsortium.org/mailman/listinfo/users
>>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> users mailing list
>>>>> users@lists.open-mpi.org
>>>>> https://rfd.newmexicoconsortium.org/mailman/listinfo/users
>>>>>
>>>>
>>>> _______________________________________________
>>>> users mailing list
>>>> users@lists.open-mpi.org
>>>> https://rfd.newmexicoconsortium.org/mailman/listinfo/users
>>>
>>>
>>> _______________________________________________
>>> users mailing list
>>> users@lists.open-mpi.org
>>> https://rfd.newmexicoconsortium.org/mailman/listinfo/users
>>>
>>
>>
>
_______________________________________________
users mailing list
users@lists.open-mpi.org
https://lists.open-mpi.org/mailman/listinfo/users

Reply via email to