Discussion:
[OMPI users] MPI_Comm_get_attr fails for sub-communicators created by MPI_Comm_split
Weiqun Zhang
2018-07-07 23:55:03 UTC
Permalink
Hi,

It appears that MPI_Comm_get_attr fails to get MPI_TAG_UB for
sub-communicators created by MPI_Comm_split. I have tested the following
programs with openmpi 3.1.1 and openmpi 1.10.2. MPI_Comm_get_attr works on
MPI_COMM_WORLD, but not on sub-communicators. Is this expected?

#include <stdio.h>
#include <mpi.h>

int main(int argc, char** argv)
{
MPI_Init(&argc, &argv);

int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
void* p; int flag;
MPI_Comm_get_attr(MPI_COMM_WORLD, MPI_TAG_UB, &p, &flag);
if (!flag) {
printf("MPI_COMM_WORLD: rank %d failed to get MPI_TAG_UB\n", rank);
} else {
printf("MPI_COMM_WORLD: rank %d succeeded to get MPI_TAG_UB\n",
rank);
}

int color = rank%2;
MPI_Comm comm;
MPI_Comm_split(MPI_COMM_WORLD, color, rank, &comm);
int rank2;
MPI_Comm_rank(comm, &rank2);
MPI_Comm_get_attr(comm, MPI_TAG_UB, &p, &flag);
if (!flag) {
printf("Subcommunicator %d rank %d failed to get MPI_TAG_UB\n",
color, rank2);
} else {
printf("Subcommunicator %d rank %d succeeded to get MPI_TAG_UB\n",
color, rank2);
}

MPI_Finalize();
}

program main

use mpi
implicit none

integer :: ierr, rank, color, comm, rank2
integer(kind=MPI_ADDRESS_KIND) :: attrval
logical :: flag

call MPI_Init(ierr)

call MPI_Comm_rank(MPI_COMM_WORLD, rank, ierr)
call MPI_Comm_get_attr(MPI_COMM_WORLD, MPI_TAG_UB, attrval, flag, ierr)
if (.not.flag) then
print *, "MPI_COMM_WORLD: rank ", rank, " failed to get MPI_TAG_UB."
else
print *, "MPI_COMM_WORLD: rank ", rank, " succeeded to get MPI_TAG_UB."
end if

color = modulo(rank,2)
call MPI_Comm_split(MPI_COMM_WORLD, color, rank, comm, ierr)
call MPI_Comm_rank(comm, rank2, ierr)
call MPI_Comm_get_attr(comm, MPI_TAG_UB, attrval, flag, ierr)
if (.not.flag) then
print *, "Subcommunicator ", color, " rank ", rank2, " failed to get
MPI_TAG_UB."
else
print *, "Subcommunicator ", color, " rank ", rank2, " succeeded to
get MPI_TAG_UB."
end if

call MPI_Finalize(ierr)

end program main

Thanks,

Weiqun
George Bosilca
2018-07-08 10:44:09 UTC
Permalink
Yes, this is the behavior defined by the MPI standard. More precisely,
section 8.1.2 of the MPI 3.1 standard clearly states that the predefined
attributes only exists for MPI_COMM_WORLD.

George.
Post by Weiqun Zhang
Hi,
It appears that MPI_Comm_get_attr fails to get MPI_TAG_UB for
sub-communicators created by MPI_Comm_split. I have tested the following
programs with openmpi 3.1.1 and openmpi 1.10.2. MPI_Comm_get_attr works on
MPI_COMM_WORLD, but not on sub-communicators. Is this expected?
#include <stdio.h>
#include <mpi.h>
int main(int argc, char** argv)
{
MPI_Init(&argc, &argv);
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
void* p; int flag;
MPI_Comm_get_attr(MPI_COMM_WORLD, MPI_TAG_UB, &p, &flag);
if (!flag) {
printf("MPI_COMM_WORLD: rank %d failed to get MPI_TAG_UB\n", rank);
} else {
printf("MPI_COMM_WORLD: rank %d succeeded to get MPI_TAG_UB\n",
rank);
}
int color = rank%2;
MPI_Comm comm;
MPI_Comm_split(MPI_COMM_WORLD, color, rank, &comm);
int rank2;
MPI_Comm_rank(comm, &rank2);
MPI_Comm_get_attr(comm, MPI_TAG_UB, &p, &flag);
if (!flag) {
printf("Subcommunicator %d rank %d failed to get MPI_TAG_UB\n",
color, rank2);
} else {
printf("Subcommunicator %d rank %d succeeded to get MPI_TAG_UB\n",
color, rank2);
}
MPI_Finalize();
}
program main
use mpi
implicit none
integer :: ierr, rank, color, comm, rank2
integer(kind=MPI_ADDRESS_KIND) :: attrval
logical :: flag
call MPI_Init(ierr)
call MPI_Comm_rank(MPI_COMM_WORLD, rank, ierr)
call MPI_Comm_get_attr(MPI_COMM_WORLD, MPI_TAG_UB, attrval, flag, ierr)
if (.not.flag) then
print *, "MPI_COMM_WORLD: rank ", rank, " failed to get MPI_TAG_UB."
else
print *, "MPI_COMM_WORLD: rank ", rank, " succeeded to get MPI_TAG_UB."
end if
color = modulo(rank,2)
call MPI_Comm_split(MPI_COMM_WORLD, color, rank, comm, ierr)
call MPI_Comm_rank(comm, rank2, ierr)
call MPI_Comm_get_attr(comm, MPI_TAG_UB, attrval, flag, ierr)
if (.not.flag) then
print *, "Subcommunicator ", color, " rank ", rank2, " failed to get
MPI_TAG_UB."
else
print *, "Subcommunicator ", color, " rank ", rank2, " succeeded to
get MPI_TAG_UB."
end if
call MPI_Finalize(ierr)
end program main
Thanks,
Weiqun
_______________________________________________
users mailing list
https://lists.open-mpi.org/mailman/listinfo/users
Loading...