Open MPI logo

Open MPI User's Mailing List Archives

  |   Home   |   Support   |   FAQ   |  

This web mail archive is frozen.

This page is part of a frozen web archive of this mailing list.

You can still navigate around this archive, but know that no new mails have been added to it since July of 2016.

Click here to be taken to the new web archives of this list; it includes all the mails that are in this frozen archive plus all new mails that have been sent to the list since it was migrated to the new archives.

Subject: Re: [OMPI users] Does MPI_Finalize() behaves like MPI_Barrier() ?
From: Jeff Squyres (jsquyres_at_[hidden])
Date: 2011-08-31 20:52:33


When you MPI_COMM_SPAWN, the parent and children processes are said to be "connected". And MPI_FINALIZE is collective across all connected processes (see the definition of MPI_FINALIZE in MPI-2.2).

If you want to disconnect the spawned children from the parents, use MPI_COMM_DISCONNECT. Then the two sets of processes will be able to MPI_FINALIZE separately.

http://www.open-mpi.org/doc/v1.5/man3/MPI_Comm_spawn.3.php
http://www.open-mpi.org/doc/v1.5/man3/MPI_Finalize.3.php
http://www.open-mpi.org/doc/v1.5/man3/MPI_Comm_disconnect.3.php

On Aug 31, 2011, at 8:35 PM, Mateus Augusto wrote:

> Hello,
>
> I have three processes that communicate with each other. The first process creates the other two processes (using MPI_Comm_spaw (...)).
> When one of the processes performs MPI_Finalize (), it continues in execution, stopped in MPI_Finalize function () (in busy waiting, ie, using CPU) and just executes the next instruction only when the other two processes run MPI_Finalize (). It seems that MPI_Finalize () behaves like MPI_Barrier (). This behavior only occurs when processes communicate with each other (when, for example, use MPI_Send, MPI_Isend, MPI_Bsend. or MPI_Ssend).
> I would like to know if we can avoid this behavior of MPI_Finalize when processes communicate with each other.
>
> Here there are the codes:
>
> Process Master:
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> #include <mpi.h>
>
> int main(int argc, char** argv) {
> int i;
> char other[200];
> getcwd(other, 199);
> strcat(other, "/otherProcess");
> MPI_Init(&argc, &argv);
> MPI_Comm com;
> MPI_Status s;
> MPI_Comm_spawn(other, MPI_ARGV_NULL, 2, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &com, MPI_ERRCODES_IGNORE);
> MPI_Recv(&i, 1, MPI_INT, 0, 0, com, &s);
> sleep(15); // Make the otherProcess wait the Master process in MPI_Finalize().
> MPI_Finalize();
> return 0;
> }
>
> Other Process (process Master calls otherProcess):
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <mpi.h>
>
> int main(int argc, char * argv[]) {
> int dest;
> MPI_Comm parent;
> MPI_Init(&argc, &argv);
> MPI_Comm_get_parent(&parent);
> MPI_Send(&dest, 1, MPI_INT, 0, 0, parent); // If this line is removed, the process doesn't stop in MPI_Finalize.
> printf("Before MPI_Finalize\n");
> MPI_Finalize(); // The process stay here waiting all process execute MPI_Finalize.
> printf("After MPI_Finalize\n");
> return 0;
> }
>
> I've tried several things but nothing worked. I don't want that otherProcess stay waiting in MPI_Finalize().
> Could someone help-me?
>
> Thanks.
>
>
>
>
>
> _______________________________________________
> users mailing list
> users_at_[hidden]
> http://www.open-mpi.org/mailman/listinfo.cgi/users

-- 
Jeff Squyres
jsquyres_at_[hidden]
For corporate legal information go to:
http://www.cisco.com/web/about/doing_business/legal/cri/