Open MPI logo

Open MPI User's Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all Open MPI User's mailing list

From: Edgar Gabriel (gabriel_at_[hidden])
Date: 2006-05-04 10:46:11


I'm having a look into that ...

Thanks
Edgar

Bert Wesarg wrote:
> Hello list,
>
> i get some erroneous results from calls to MPI_Comm_split with an
> intercommunicator as communicator.
>
> this is a brokendown testcase, the source is attached:
>
> test_split.c:
>
> mpi_comm_spwan(world, "test_split_client", 1, &inter)
> for i=1:np
> if rank < i
> mpi_comm_split(inter, 0, 0, &inter2)
> /* print new rank and size */
> mpi_comm_free(&inter2)
> else
> mpi_comm_split(inter, MPI_UNDEFINED, 0, &inter2)
>
> test_split_client.c:
>
> mpi_comm_get_parent(&inter)
> while true
> mpi_comm_split(inter, 0, 0, &inter2)
> /* print new remote size */
> mpi_comm_free(&inter2)
> mpi_comm_free(&inter)
>
>
> first, my expected results:
> np = 2:
>
> test_split:0 test_split:1 test_split_client:0
> i = 1:
> new rank = 0 new remote size = 1
> new size = 1
>
> i = 2:
> new rank = 0 new rank = 1 new remote size = 2
> new size = 2 new size = 2
> ...
>
> now some actually results:
> a)
> test_split:0 test_split:1 test_split_client:0
> i = 1:
> new rank = 0 new remote size = 1
> new size = 2
>
> i = 2:
> new rank = 0 new rank = 1 new remote size = 2
> new size = 2 new size = 2
>
> b)
> test_split:0 test_split:1 test_split_client:0
> i = 1:
> new rank = 0 new remote size = 1
> new size = 1
>
> i = 2:
> new rank = 0 new rank = 1 new remote size = 2
> new size = 1 new size = 2
>
> c)
> test_split:0 test_split:1 test_split_client:0
> i = 1:
> new rank = 0 new remote size = 1
> new size = 2
>
> i = 2:
> new rank = 0 new rank = 1 new remote size = 2
> new size = 1 new size = 2
>
> something with the new size in rank 0 is wrong or the remote size
>
> can someone please pointout if my code is wrong, or something with open-mpi?
>
> greatings
> bert wesarg
>
> ps: these test were run on an dual smp machine and open-mpi 1.0.2
> pps: i attached also an split test with intracommunicators, these results
> are all expected
>
>
>
>
> ------------------------------------------------------------------------
>
> #define _GNU_SOURCE
> #include <unistd.h>
> #include <stdlib.h>
> #include <stdio.h>
> #include <string.h>
> #include <stdint.h>
> #include <stdbool.h>
> #include <math.h>
> #include <getopt.h>
>
> #include <mpi.h>
>
> int
> main(int ac, char *av[])
> {
> MPI_Comm inter, inter2;
> int r, s, err, i, r2, s2, rs, isinter;
>
> MPI_Init(&ac, &av);
> MPI_Comm_size(MPI_COMM_WORLD, &s);
> MPI_Comm_rank(MPI_COMM_WORLD, &r);
>
> MPI_Comm_spawn(
> "./test_split_client", MPI_ARGV_NULL, 1, MPI_INFO_NULL, 0,
> MPI_COMM_WORLD, &inter, &err
> );
>
> for (i = 1; i <= s; i++) {
>
> MPI_Barrier(inter);
>
> MPI_Comm_split(
> inter, (r < i) ? 0 : MPI_UNDEFINED, 0, &inter2
> );
> printf(
> "%d:%d: split color %d, key %d\n",
> i, r, (r < i) ? 0 : MPI_UNDEFINED, 0
> );
> MPI_Barrier(inter);
>
> if (r < i) {
> err = MPI_Comm_test_inter(inter2, &isinter);
> printf(
> "%d:%d: is inter %s\n",
> i, r, isinter ? "true" : "false"
> );
>
> err = MPI_Comm_size(inter2, &s2);
>
> err = MPI_Comm_remote_size(inter2, &rs);
>
> err = MPI_Comm_rank(inter2, &r2);
>
> printf(
> "%d:%d: new rank %d, new size %d, remote size %d\n",
> i, r, r2, s2, rs
> );
>
> MPI_Barrier(inter2);
>
> err = MPI_Comm_free(&inter2);
> }
> MPI_Barrier(inter);
> }
>
> MPI_Barrier(inter);
>
> MPI_Comm_free(&inter);
>
> MPI_Finalize();
> return 0;
> }
>
>
> ------------------------------------------------------------------------
>
> #define _GNU_SOURCE
> #include <unistd.h>
> #include <stdlib.h>
> #include <stdio.h>
> #include <string.h>
> #include <stdint.h>
> #include <stdbool.h>
> #include <math.h>
> #include <getopt.h>
>
> #include <mpi.h>
>
> int
> main(int ac, char *av[])
> {
> MPI_Comm inter, inter2;
> int r, s, rs;
>
> MPI_Init(&ac, &av);
> MPI_Comm_size(MPI_COMM_WORLD, &s);
> MPI_Comm_rank(MPI_COMM_WORLD, &r);
>
> MPI_Comm_get_parent(&inter);
>
> while (true) {
> MPI_Barrier(inter);
>
> MPI_Comm_split(inter, 0, 0, &inter2);
>
> MPI_Barrier(inter);
>
> MPI_Comm_remote_size(inter2, &rs);
> printf("c:%d: remote size %d\n", r, rs);
> MPI_Barrier(inter2);
> MPI_Comm_free(&inter2);
>
> MPI_Barrier(inter);
> }
> MPI_Barrier(inter);
>
> MPI_Comm_free(&inter);
> MPI_Finalize();
> return 0;
> }
>
>
> ------------------------------------------------------------------------
>
> #define _GNU_SOURCE
> #include <unistd.h>
> #include <stdlib.h>
> #include <stdio.h>
> #include <string.h>
> #include <stdint.h>
> #include <stdbool.h>
> #include <math.h>
> #include <getopt.h>
>
> #include <mpi.h>
>
> int
> main(int ac, char *av[])
> {
> MPI_Comm split;
> int r, s, i, r2, s2;
> int send;
>
> MPI_Init(&ac, &av);
> MPI_Comm_size(MPI_COMM_WORLD, &s);
> MPI_Comm_rank(MPI_COMM_WORLD, &r);
>
> send = 1;
> for (i = 1; i <= s; i++) {
> MPI_Barrier(MPI_COMM_WORLD);
>
> printf(
> "%d:%d: split color %d, key %d\n",
> i, r, (r < i) ? 0 : MPI_UNDEFINED, 0
> );
> MPI_Comm_split(
> MPI_COMM_WORLD, (r < i) ? 0 : MPI_UNDEFINED, 0, &split
> );
> if (r < i) {
> MPI_Comm_size(split, &s2);
> MPI_Comm_rank(split, &r2);
> printf(
> "%d:%d: new rank %d, new size %d\n", i, r, r2, s2
> );
> MPI_Barrier(split);
> MPI_Comm_free(&split);
> }
> MPI_Barrier(MPI_COMM_WORLD);
> }
>
> MPI_Finalize();
> return 0;
> }
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> users mailing list
> users_at_[hidden]
> http://www.open-mpi.org/mailman/listinfo.cgi/users