1
1

handle non existant recv buf in reduce for non root processes

(basic allreduce does this for mpi_in_place case)

This commit was SVN r7759.
Этот коммит содержится в:
Graham Fagg 2005-10-14 00:00:37 +00:00
родитель 61b8218d76
Коммит 636b42afff

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

@ -79,6 +79,7 @@ int mca_coll_tuned_reduce_intra_chain( void *sendbuf, void *recvbuf, int count,
char *sendtmpbuf = NULL;
long ext, lb;
int typelng;
int allocedaccumbuf;
ompi_request_t* reqs[2];
ompi_coll_chain_t* chain;
@ -135,7 +136,6 @@ int mca_coll_tuned_reduce_intra_chain( void *sendbuf, void *recvbuf, int count,
else {
sendtmpbuf = (char *) recvbuf;
}
accumbuf = (char *) recvbuf;
/* handle special case when size == 1 */
if (1 == size ) {
@ -145,6 +145,17 @@ int mca_coll_tuned_reduce_intra_chain( void *sendbuf, void *recvbuf, int count,
return MPI_SUCCESS;
}
/* handle non existant recv buffer (i.e. its NULL.. like basic allreduce uses!) */
if (recvbuf) {
accumbuf = (char *) recvbuf;
allocedaccumbuf = 0;
}
else {
accumbuf = (char*) malloc(realsegsize);
if (accumbuf == NULL) { line = __LINE__; ret = -1; goto error_hndl; }
allocedaccumbuf = 1;
}
/* ----------------------------------------------------------------- */
/* non-leaf nodes -
@ -275,6 +286,7 @@ int mca_coll_tuned_reduce_intra_chain( void *sendbuf, void *recvbuf, int count,
if (inbuf!=NULL) {
if (inbuf[0] != NULL) free(inbuf[0]);
if (inbuf[1] != NULL) free(inbuf[1]);
if (allocedaccumbuf) free(accumbuf);
}
}
@ -299,6 +311,7 @@ int mca_coll_tuned_reduce_intra_chain( void *sendbuf, void *recvbuf, int count,
if( inbuf != NULL ) {
if( inbuf[0] != NULL ) free(inbuf[0]);
if( inbuf[1] != NULL ) free(inbuf[1]);
if (allocedaccumbuf) free(accumbuf);
}
return ret;
}