[MPICH] Changing the comm size at runtime
Patrick Gräbel
pgraebel at stud.fh-dortmund.de
Tue Apr 10 11:14:34 CDT 2007
I tried to "fold" the accepted intercomm objects to a large single
intracomm object as you suggested, but MPI_Intercomm_create aborts with
"Invalid buffer pointer". The code for a master "A" awaiting two slaves
"B" and "C" to connect looks like this:
------------------
MASTER (process A)
// accept all slaves
MPI::Intercomm inter[num_slaves];
for(int i = 0; i < num_slaves; i++)
inter[i] = MPI::COMM_WORLD.Accept(port,MPI::INFO_NULL,0);
// collective merging over A and B
MPI::Intracomm AB_intra = inter[0].Merge(false);
// collective intercomm creation over A, B and C
MPI::Intercomm AB_C_inter = AB_intra.Create_intercomm(0,inter[1],0,0);
-------------------
SLAVE 1 (process B)
// connect to master
MPI::Intercomm AB_inter = MPI::COMM_WORLD.Connect(port,MPI::INFO_NULL,0);
// collective merge over A and B
MPI::Intracomm AB_intra = AB_inter.Merge(true);
// collective intercomm creation over A, B and C
MPI::Intercomm AB_C_inter = AB_intra.Create_intercomm(0,AB_inter,0,0);
-------------------
SLAVE 2 (process C)
// connect to master
MPI::Intercomm AC_inter = MPI::COMM_WORLD.Connect(port,MPI::INFO_NULL,0);
// collective intercomm creation over A, B and C
MPI::Intercomm AB_C_inter =
MPI::COMM_WORLD.Create_intercomm(0,AC_inter,0,0);
------------------
The MPI-Forum's guide says:
"The function MPI_INTERCOMM_CREATE can be used to create an
inter-communicator from two existing intra-communicators"
I don't know if this excludes inter-communicators like those I am
passing. Maybe the leader rank args are wrong but I could not find a
solution.
Thanks
Patrick
Rajeev Thakur wrote:
> If the slaves can connect to the master with a single collective
> MPI_Comm_connect (i.e. the communicator includes all slaves), then it is
> easy: A single MPI_Intercomm_merge will create the giant intracommunicator.
> If the slaves are connecting one by one, it is much more difficult. Here is
> an example of how to do it:
>
> Let's say Process A is the master and processes B, C, and D are slaves. B,
> C, D individually connect to A, resulting in 3 intercommunicators: AB_inter,
> AC_inter, and AD_inter. To merge them all into a single intracommunicator:
>
> * begin by doing an MPI_Intercomm_merge on AB_inter, resulting in an
> intracommunicator AB_intra.
>
> * then create an intercommunicator between AB on one side and C on the other
> by using MPI_Intercomm_create. Pass AB_intra as the local_comm on A and B,
> MPI_COMM_WORLD as the intracomm on C, and AC_inter as the peer_comm. This
> results in the intercommunicator AB_C_inter.
>
> * then call MPI_Intercomm_merge on it to create the intracommunicator
> ABC_intra.
>
> * then call MPI_Intercomm_create to create an intercommunicator between ABC
> and D just as you did with AB and C above.
>
> * then call MPI_Intercomm_merge to get a single intracommunicator containing
> all.
>
> Rajeev
>
>
>> -----Original Message-----
>> From: owner-mpich-discuss at mcs.anl.gov
>> [mailto:owner-mpich-discuss at mcs.anl.gov] On Behalf Of Patrick Gräbel
>> Sent: Sunday, March 18, 2007 2:02 PM
>> To: mpich-discuss at mcs.anl.gov
>> Subject: Re: [MPICH] Changing the comm size at runtime
>>
>> At the moment the master iterates over a set of Intracomm objects that
>> are created by calling MPI_Intercomm_Merge on the accepted Intercomm
>> objects in order to communicate. This works but...
>>
>> ...is there a way to form a larger Intracomm (or Intercomm)
>> object that
>> contains all slaves at once? This would make the programm more elegant
>> and smaller.
>>
>> Greetings
>> Patrick
>>
>> Rajeev Thakur wrote:
>>> I should point out that you can also create an
>> intracommunicator from an
>>> intercommunicator by using MPI_Intercomm_merge and then use
>> the regular
>>> intracommunicator collectives if that's what you need.
>>>
>>> Rajeev
>>
>
>
More information about the mpich-discuss
mailing list