1
1

SSHMEM/COLL: added sshmem/mpi implementation for shmem_collect call

- added MPI based implementation of shmem_collect call

Signed-off-by: Sergey Oblomov <sergeyo@mellanox.com>
Этот коммит содержится в:
Sergey Oblomov 2019-05-21 11:42:10 +03:00
родитель 88b3b24101
Коммит 7d8cb75b2e

Просмотреть файл

@ -107,16 +107,18 @@ int mca_scoll_mpi_collect(struct oshmem_group_t *group,
bool nlong_type, bool nlong_type,
int alg) int alg)
{ {
ompi_datatype_t* stype = &ompi_mpi_char.dt;
ompi_datatype_t* rtype = &ompi_mpi_char.dt;
mca_scoll_mpi_module_t *mpi_module; mca_scoll_mpi_module_t *mpi_module;
ompi_datatype_t* stype;
ompi_datatype_t* rtype;
int rc; int rc;
int len;
int i;
void *sbuf, *rbuf; void *sbuf, *rbuf;
int *disps, *recvcounts;
MPI_COLL_VERBOSE(20,"RUNNING MPI ALLGATHER"); MPI_COLL_VERBOSE(20,"RUNNING MPI ALLGATHER");
mpi_module = (mca_scoll_mpi_module_t *) group->g_scoll.scoll_collect_module; mpi_module = (mca_scoll_mpi_module_t *) group->g_scoll.scoll_collect_module;
if (nlong_type == true) { if (nlong_type == true) {
/* Do nothing on zero-length request */ /* Do nothing on zero-length request */
if (OPAL_UNLIKELY(!nlong)) { if (OPAL_UNLIKELY(!nlong)) {
return OSHMEM_SUCCESS; return OSHMEM_SUCCESS;
@ -124,8 +126,6 @@ int mca_scoll_mpi_collect(struct oshmem_group_t *group,
sbuf = (void *) source; sbuf = (void *) source;
rbuf = target; rbuf = target;
stype = &ompi_mpi_char.dt;
rtype = &ompi_mpi_char.dt;
/* Open SHMEM specification has the following constrains (page 85): /* Open SHMEM specification has the following constrains (page 85):
* "If using C/C++, nelems must be of type integer. If you are using Fortran, it must be a * "If using C/C++, nelems must be of type integer. If you are using Fortran, it must be a
* default integer value". And also fortran signature says "INTEGER". * default integer value". And also fortran signature says "INTEGER".
@ -159,15 +159,52 @@ int mca_scoll_mpi_collect(struct oshmem_group_t *group,
SCOLL_DEFAULT_ALG); SCOLL_DEFAULT_ALG);
} }
} else { } else {
MPI_COLL_VERBOSE(20,"RUNNING FALLBACK COLLECT"); if (INT_MAX < nlong) {
PREVIOUS_SCOLL_FN(mpi_module, collect, group, MPI_COLL_VERBOSE(20,"RUNNING FALLBACK COLLECT");
target, PREVIOUS_SCOLL_FN(mpi_module, collect, group,
source, target,
nlong, source,
pSync, nlong,
nlong_type, pSync,
SCOLL_DEFAULT_ALG); nlong_type,
SCOLL_DEFAULT_ALG);
return rc;
}
len = nlong;
disps = malloc(group->proc_count * sizeof(*disps));
if (disps == NULL) {
rc = OSHMEM_ERR_OUT_OF_RESOURCE;
goto complete;
}
recvcounts = malloc(group->proc_count * sizeof(*recvcounts));
if (recvcounts == NULL) {
rc = OSHMEM_ERR_OUT_OF_RESOURCE;
goto failed_mem;
}
rc = mpi_module->comm->c_coll->coll_allgather(&len, sizeof(len), stype, recvcounts,
sizeof(len), rtype, mpi_module->comm,
mpi_module->comm->c_coll->coll_allgather_module);
if (rc != OSHMEM_SUCCESS) {
goto failed_allgather;
}
disps[0] = 0;
for (i = 1; i < group->proc_count; i++) {
disps[i] = disps[i - 1] + recvcounts[i - 1];
}
rc = mpi_module->comm->c_coll->coll_allgatherv(source, nlong, stype, target, recvcounts,
disps, rtype, mpi_module->comm,
mpi_module->comm->c_coll->coll_allgatherv_module);
failed_allgather:
free(recvcounts);
failed_mem:
free(disps);
} }
complete:
return rc; return rc;
} }