[Re-]Fix #1463 with a little thing that I like to call "the right
way". Don't modify coords in the top-level API function because coords is an IN variable. Instead, as Nysal noted, the real cause of the problem was a missing ! down in topo_base_cart_rank.c. Put a comment down in topo_base_cart_rank.c explaining what's going on so that the code is not so cryptic. Refs trac:1363. This commit was SVN r19487. The following Trac tickets were found above: Ticket 1363 --> https://svn.open-mpi.org/trac/ompi/ticket/1363
Этот коммит содержится в:
родитель
78c35f6d93
Коммит
9a98423bbc
@ -63,14 +63,18 @@ int mca_topo_base_cart_rank (MPI_Comm comm,
|
|||||||
for (; i >= 0; --i, --c, --d, --p) {
|
for (; i >= 0; --i, --c, --d, --p) {
|
||||||
dim = *d;
|
dim = *d;
|
||||||
ord = *c;
|
ord = *c;
|
||||||
if ((ord < 0) || (ord >= dim)) {
|
/* Per MPI-2.1 7.5.4 (description of MPI_CART_RANK), if the
|
||||||
if (*p) {
|
dimension is periodic and the coordinate is outside of 0 <=
|
||||||
return MPI_ERR_ARG;
|
coord(i) < dim, then normalize it. If the dimension is not
|
||||||
}
|
periodic, it's an error. */
|
||||||
ord %= dim;
|
if ((ord < 0) || (ord >= dim)) {
|
||||||
if (ord < 0) {
|
if (!*p) {
|
||||||
ord += dim;
|
return MPI_ERR_ARG;
|
||||||
}
|
}
|
||||||
|
ord %= dim;
|
||||||
|
if (ord < 0) {
|
||||||
|
ord += dim;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
prank += factor * ord;
|
prank += factor * ord;
|
||||||
factor *= dim;
|
factor *= dim;
|
||||||
|
@ -79,22 +79,6 @@ int MPI_Cart_rank(MPI_Comm comm, int *coords, int *rank)
|
|||||||
|
|
||||||
OPAL_CR_ENTER_LIBRARY();
|
OPAL_CR_ENTER_LIBRARY();
|
||||||
|
|
||||||
/* Normalize any coords[i] that is outside the appropriate range
|
|
||||||
for dimensions that are periodic */
|
|
||||||
for (i = 0; i < comm->c_topo_comm->mtc_ndims_or_nnodes; ++i) {
|
|
||||||
if (comm->c_topo_comm->mtc_periods_or_edges[i] &&
|
|
||||||
(coords[i] < 0 ||
|
|
||||||
coords[i] >= comm->c_topo_comm->mtc_dims_or_index[i])) {
|
|
||||||
if (coords[i] < 0) {
|
|
||||||
coords[i] = (-coords[i]) %
|
|
||||||
comm->c_topo_comm->mtc_dims_or_index[i];
|
|
||||||
coords[i] = comm->c_topo_comm->mtc_dims_or_index[i] - coords[i];
|
|
||||||
} else {
|
|
||||||
coords[i] = coords[i] % comm->c_topo_comm->mtc_dims_or_index[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get the function pointer on this communicator */
|
/* get the function pointer on this communicator */
|
||||||
func = comm->c_topo->topo_cart_rank;
|
func = comm->c_topo->topo_cart_rank;
|
||||||
|
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user