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
us...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/users