1
1

Merge pull request #6889 from ggouaillardet/topic/v4.0.x/nbc_fixes

coll/base: only retain datatypes/op if the request has not yet completed
Этот коммит содержится в:
Howard Pritchard 2019-08-19 12:40:16 -06:00 коммит произвёл GitHub
родитель 8087147346 39ec580b76
Коммит fd13b27423
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
2 изменённых файлов: 24 добавлений и 7 удалений

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

@ -108,9 +108,11 @@ int ompi_rounddown(int num, int factor)
static void release_objs_callback(struct ompi_coll_base_nbc_request_t *request) {
if (NULL != request->data.objs.objs[0]) {
OBJ_RELEASE(request->data.objs.objs[0]);
request->data.objs.objs[0] = NULL;
}
if (NULL != request->data.objs.objs[1]) {
OBJ_RELEASE(request->data.objs.objs[1]);
request->data.objs.objs[1] = NULL;
}
}
@ -139,6 +141,9 @@ int ompi_coll_base_retain_op( ompi_request_t *req, ompi_op_t *op,
ompi_datatype_t *type) {
ompi_coll_base_nbc_request_t *request = (ompi_coll_base_nbc_request_t *)req;
bool retain = false;
if (REQUEST_COMPLETE(req)) {
return OMPI_SUCCESS;
}
if (!ompi_op_is_intrinsic(op)) {
OBJ_RETAIN(op);
request->data.op.op = op;
@ -175,6 +180,9 @@ int ompi_coll_base_retain_datatypes( ompi_request_t *req, ompi_datatype_t *stype
ompi_datatype_t *rtype) {
ompi_coll_base_nbc_request_t *request = (ompi_coll_base_nbc_request_t *)req;
bool retain = false;
if (REQUEST_COMPLETE(req)) {
return OMPI_SUCCESS;
}
if (NULL != stype && !ompi_datatype_is_predefined(stype)) {
OBJ_RETAIN(stype);
request->data.types.stype = stype;
@ -207,15 +215,21 @@ static void release_vecs_callback(ompi_coll_base_nbc_request_t *request) {
} else {
scount = rcount = OMPI_COMM_IS_INTER(comm)?ompi_comm_remote_size(comm):ompi_comm_size(comm);
}
for (int i=0; i<scount; i++) {
if (NULL != request->data.vecs.stypes && NULL != request->data.vecs.stypes[i]) {
OMPI_DATATYPE_RELEASE(request->data.vecs.stypes[i]);
if (NULL != request->data.vecs.stypes) {
for (int i=0; i<scount; i++) {
if (NULL != request->data.vecs.stypes[i]) {
OMPI_DATATYPE_RELEASE(request->data.vecs.stypes[i]);
}
}
request->data.vecs.stypes = NULL;
}
for (int i=0; i<rcount; i++) {
if (NULL != request->data.vecs.rtypes && NULL != request->data.vecs.rtypes[i]) {
OMPI_DATATYPE_RELEASE(request->data.vecs.rtypes[i]);
if (NULL != request->data.vecs.rtypes) {
for (int i=0; i<rcount; i++) {
if (NULL != request->data.vecs.rtypes[i]) {
OMPI_DATATYPE_RELEASE(request->data.vecs.rtypes[i]);
}
}
request->data.vecs.rtypes = NULL;
}
}
@ -246,6 +260,9 @@ int ompi_coll_base_retain_datatypes_w( ompi_request_t *req,
bool retain = false;
ompi_communicator_t *comm = request->super.req_mpi_object.comm;
int scount, rcount;
if (REQUEST_COMPLETE(req)) {
return OMPI_SUCCESS;
}
if (OMPI_COMM_IS_TOPO(comm)) {
(void)mca_topo_base_neighbor_count (comm, &rcount, &scount);
} else {

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

@ -460,6 +460,6 @@ request_construct(ompi_coll_libnbc_request_t *request)
OBJ_CLASS_INSTANCE(ompi_coll_libnbc_request_t,
ompi_request_t,
ompi_coll_base_nbc_request_t,
request_construct,
NULL);