Weiqun Zhang
2018-07-07 23:55:03 UTC
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
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