This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "MPICH primary repository". The branch, master has been updated via 28c721724cacd8c07f27a5aee536829c987eba09 (commit) from 4b07ac8ab4ba5203f228348b05a9a2da71f13396 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- http://git.mpich.org/mpich.git/commitdiff/28c721724cacd8c07f27a5aee536829c98... commit 28c721724cacd8c07f27a5aee536829c987eba09 Author: Su Huang <[email protected]> Date: Thu Jan 9 11:59:11 2014 -0500 PAMID:fix memory leak and BGQ problems Signed-off-by: Michael Blocksome <[email protected]> diff --git a/src/mpid/pamid/src/onesided/mpid_win_accumulate.c b/src/mpid/pamid/src/onesided/mpid_win_accumulate.c index 7792d8f..2d04091 100644 --- a/src/mpid/pamid/src/onesided/mpid_win_accumulate.c +++ b/src/mpid/pamid/src/onesided/mpid_win_accumulate.c @@ -193,6 +193,13 @@ MPID_Accumulate(void *origin_addr, } req->offset = target_disp * win->mpid.info[target_rank].disp_unit; +#ifdef __BGQ__ + /* PAMI limitation as it doesnt permit VA of 0 to be passed into + * memregion create, so we must pass base_va of heap computed from + * an SPI call instead. So the target offset must be adjusted */ + if (req->win->create_flavor == MPI_WIN_FLAVOR_DYNAMIC) + req->offset -= (size_t)req->win->mpid.info[target_rank].base_addr; +#endif if (origin_datatype == MPI_DOUBLE_INT) { diff --git a/src/mpid/pamid/src/onesided/mpid_win_compare_and_swap.c b/src/mpid/pamid/src/onesided/mpid_win_compare_and_swap.c index 3f7d925..4c52993 100644 --- a/src/mpid/pamid/src/onesided/mpid_win_compare_and_swap.c +++ b/src/mpid/pamid/src/onesided/mpid_win_compare_and_swap.c @@ -95,6 +95,13 @@ int MPID_Compare_and_swap(const void *origin_addr, const void *compare_addr, req->type = MPIDI_WIN_REQUEST_COMPARE_AND_SWAP; req->offset = target_disp * win->mpid.info[target_rank].disp_unit; +#ifdef __BGQ__ + /* PAMI limitation as it doesnt permit VA of 0 to be passed into + * memregion create, so we must pass base_va of heap computed from + * an SPI call instead. So the target offset must be adjusted */ + if (req->win->create_flavor == MPI_WIN_FLAVOR_DYNAMIC) + req->offset -= (size_t)req->win->mpid.info[target_rank].base_addr; +#endif MPIDI_Win_datatype_basic(1, datatype, &req->origin.dt); @@ -119,6 +126,10 @@ int MPID_Compare_and_swap(const void *origin_addr, const void *compare_addr, base = win->mpid.info[target_rank].base_addr; disp_unit = win->disp_unit; } + else if (win->create_flavor == MPI_WIN_FLAVOR_DYNAMIC) { + base = NULL; + disp_unit = win->disp_unit; + } else { base = win->base; disp_unit = win->disp_unit; @@ -178,10 +189,13 @@ int MPID_Compare_and_swap(const void *origin_addr, const void *compare_addr, MPI_Op null_op=0; pami_data_function pami_op; +#ifndef __BGQ__ if(MPIDI_Datatype_is_pami_rmw_supported(basic_type, &pami_type, null_op, &pami_op) ) { req->pami_datatype = pami_type; PAMI_Context_post(MPIDI_Context[0], &req->post_request, MPIDI_Compare_and_swap_using_pami_rmw, req); - } else { + } else +#endif + { PAMI_Context_post(MPIDI_Context[0], &req->post_request, MPIDI_Atomic, req); } } diff --git a/src/mpid/pamid/src/onesided/mpid_win_create_dynamic.c b/src/mpid/pamid/src/onesided/mpid_win_create_dynamic.c index 74e10ca..4b37f26 100644 --- a/src/mpid/pamid/src/onesided/mpid_win_create_dynamic.c +++ b/src/mpid/pamid/src/onesided/mpid_win_create_dynamic.c @@ -52,11 +52,34 @@ MPID_Win_create_dynamic( MPID_Info * info, rc=MPIDI_Win_init(0,1,win_ptr, info, comm_ptr, MPI_WIN_FLAVOR_DYNAMIC, MPI_WIN_UNIFIED); win = *win_ptr; - win->base = MPI_BOTTOM; rank = comm_ptr->rank; + win->base = MPI_BOTTOM; winfo = &win->mpid.info[rank]; winfo->win = win; +#ifdef __BGQ__ + void *base = NULL; + size_t length = 0; + Kernel_MemoryRegion_t memregion; + void *tmpbuf = malloc(sizeof(int)); + Kernel_CreateMemoryRegion(&memregion, tmpbuf, sizeof(int)); + //Reset base to base VA of local heap + base = memregion.BaseVa; + length = memregion.Bytes; + free(tmpbuf); + + if (length != 0) + { + size_t length_out = 0; + pami_result_t rc; + rc = PAMI_Memregion_create(MPIDI_Context[0], base, length, &length_out, &winfo->memregion); + MPID_assert(rc == PAMI_SUCCESS); + MPID_assert(length == length_out); + } + win->base = base; + winfo->base_addr = base; +#endif + rc= MPIDI_Win_allgather(0,win_ptr); if (rc != MPI_SUCCESS) return rc; diff --git a/src/mpid/pamid/src/onesided/mpid_win_fetch_and_op.c b/src/mpid/pamid/src/onesided/mpid_win_fetch_and_op.c index 9f47b9b..a99a19e 100644 --- a/src/mpid/pamid/src/onesided/mpid_win_fetch_and_op.c +++ b/src/mpid/pamid/src/onesided/mpid_win_fetch_and_op.c @@ -229,7 +229,9 @@ int MPID_Fetch_and_op(const void *origin_addr, void *result_addr, MPID_assert(basic_type != MPI_DATATYPE_NULL); if(MPIDI_Datatype_is_pami_rmw_supported(basic_type, &pami_type, op, &pami_op) ) { +#ifndef __BGQ__ good_for_rmw = 1; +#endif } else { if((op == MPI_NO_OP) && (origin_addr == NULL) && (win->create_flavor != MPI_WIN_FLAVOR_SHARED) ) { /* essentially a MPI_Get to result buffer */ @@ -244,6 +246,13 @@ int MPID_Fetch_and_op(const void *origin_addr, void *result_addr, req->type = MPIDI_WIN_REQUEST_FETCH_AND_OP; req->offset = target_disp * win->mpid.info[target_rank].disp_unit; +#ifdef __BGQ__ + /* PAMI limitation as it doesnt permit VA of 0 to be passed into + * memregion create, so we must pass base_va of heap computed from + * an SPI call instead. So the target offset must be adjusted */ + if (req->win->create_flavor == MPI_WIN_FLAVOR_DYNAMIC) + req->offset -= (size_t)req->win->mpid.info[target_rank].base_addr; +#endif if (datatype == MPI_DOUBLE_INT) { @@ -300,6 +309,10 @@ int MPID_Fetch_and_op(const void *origin_addr, void *result_addr, disp_unit = win->disp_unit; } + else if (win->create_flavor == MPI_WIN_FLAVOR_DYNAMIC) { + base = NULL; + disp_unit = win->disp_unit; + } else { base = win->base; disp_unit = win->disp_unit; diff --git a/src/mpid/pamid/src/onesided/mpid_win_get.c b/src/mpid/pamid/src/onesided/mpid_win_get.c index b56e2b2..ab341f7 100644 --- a/src/mpid/pamid/src/onesided/mpid_win_get.c +++ b/src/mpid/pamid/src/onesided/mpid_win_get.c @@ -236,6 +236,13 @@ MPID_Get(void *origin_addr, } req->offset = target_disp * win->mpid.info[target_rank].disp_unit; +#ifdef __BGQ__ + /* PAMI limitation as it doesnt permit VA of 0 to be passed into + * memregion create, so we must pass base_va of heap computed from + * an SPI call instead. So the target offset must be adjusted */ + if (req->win->create_flavor == MPI_WIN_FLAVOR_DYNAMIC) + req->offset -= (size_t)req->win->mpid.info[target_rank].base_addr; +#endif MPIDI_Win_datatype_basic(origin_count, origin_datatype, diff --git a/src/mpid/pamid/src/onesided/mpid_win_get_accumulate.c b/src/mpid/pamid/src/onesided/mpid_win_get_accumulate.c index 8f8d07c..ca93a13 100644 --- a/src/mpid/pamid/src/onesided/mpid_win_get_accumulate.c +++ b/src/mpid/pamid/src/onesided/mpid_win_get_accumulate.c @@ -23,10 +23,12 @@ static void MPIDI_Win_GetAccSendAckDoneCB(pami_context_t context, - void * _buf, + void * _info, pami_result_t result) { - MPIU_Free (_buf); + MPIDI_Win_GetAccMsgInfo *msginfo = (MPIDI_Win_GetAccMsgInfo *) _info; + MPIU_Free(msginfo->tptr); + MPIU_Free(msginfo); } static void @@ -69,19 +71,18 @@ MPIDI_Win_GetAccumSendAck(pami_context_t context, .dest = msginfo->src_endpoint, }, .events = { - .cookie = buffer, + .cookie = msginfo, .local_fn = MPIDI_Win_GetAccSendAckDoneCB, //cleanup buffer }, }; + msginfo->tptr = buffer; + params.send.data.iov_len = msginfo->size; params.send.data.iov_base = buffer; rc = PAMI_Send(context, ¶ms); MPID_assert(rc == PAMI_SUCCESS); - - //free msginfo - //MPIU_Free(msginfo); } void @@ -148,6 +149,9 @@ MPIDI_Win_GetAccDoneCB(pami_context_t context, if (req->accum_headers) MPIU_Free(req->accum_headers); + MPIDI_Win_datatype_unmap(&req->target.dt); + MPIDI_Win_datatype_unmap(&req->result.dt); + if( req->type != MPIDI_WIN_REQUEST_RGET_ACCUMULATE ) MPIU_Free(req); } @@ -166,10 +170,10 @@ MPIDI_Win_GetAccAckDoneCB(pami_context_t context, MPIR_Localcopy(req->result.addr, req->result.count, req->result.datatype, - msginfo->result_addr, + msginfo->tptr, msginfo->size, MPI_CHAR); - MPIU_Free(msginfo->result_addr); + MPIU_Free(msginfo->tptr); } MPIU_Free(msginfo); @@ -194,10 +198,10 @@ MPIDI_WinGetAccumAckCB(pami_context_t context, *msginfo = *(const MPIDI_Win_GetAccMsgInfo *)_msginfo; MPIDI_Win_request *req = (MPIDI_Win_request *) msginfo->request; - msginfo->result_addr = NULL; + msginfo->tptr = NULL; recv->addr = req->result.addr; if (req->result_num_contig > 1) - recv->addr = msginfo->result_addr = MPIU_Malloc(msginfo->size); + recv->addr = msginfo->tptr = MPIU_Malloc(msginfo->size); recv->type = PAMI_TYPE_BYTE; recv->offset = 0; @@ -213,7 +217,6 @@ MPIDI_Get_accumulate(pami_context_t context, { MPIDI_Win_request *req = (MPIDI_Win_request*)_req; pami_result_t rc; - void *map; pami_send_t params = { .send = { @@ -248,15 +251,8 @@ MPIDI_Get_accumulate(pami_context_t context, params.send.data.iov_base = req->buffer + req->state.local_offset; if (req->target.dt.num_contig - req->state.index == 1) { - map=NULL; - if (req->target.dt.map != &req->target.dt.__map) { - map=(void *) req->target.dt.map; - } - rc = PAMI_Send(context, ¶ms); MPID_assert(rc == PAMI_SUCCESS); - if (map) - MPIU_Free(map); return PAMI_SUCCESS; } else { rc = PAMI_Send(context, ¶ms); @@ -265,9 +261,6 @@ MPIDI_Get_accumulate(pami_context_t context, ++req->state.index; } } - - MPIDI_Win_datatype_unmap(&req->target.dt); - return PAMI_SUCCESS; } diff --git a/src/mpid/pamid/src/onesided/mpid_win_put.c b/src/mpid/pamid/src/onesided/mpid_win_put.c index 67f9d84..110f294 100644 --- a/src/mpid/pamid/src/onesided/mpid_win_put.c +++ b/src/mpid/pamid/src/onesided/mpid_win_put.c @@ -249,6 +249,13 @@ MPID_Put(void *origin_addr, } req->offset = target_disp * win->mpid.info[target_rank].disp_unit; +#ifdef __BGQ__ + /* PAMI limitation as it doesnt permit VA of 0 to be passed into + * memregion create, so we must pass base_va of heap computed from + * an SPI call instead. So the target offset must be adjusted */ + if (req->win->create_flavor == MPI_WIN_FLAVOR_DYNAMIC) + req->offset -= (size_t)req->win->mpid.info[target_rank].base_addr; +#endif MPIDI_Win_datatype_basic(origin_count, origin_datatype, diff --git a/src/mpid/pamid/src/onesided/mpidi_onesided.h b/src/mpid/pamid/src/onesided/mpidi_onesided.h index 180aaad..8604bb5 100644 --- a/src/mpid/pamid/src/onesided/mpidi_onesided.h +++ b/src/mpid/pamid/src/onesided/mpidi_onesided.h @@ -201,7 +201,7 @@ typedef struct int num_contig; int size; void * request; - void * result_addr; + void * tptr; pami_endpoint_t src_endpoint; } MPIDI_Win_GetAccMsgInfo; ----------------------------------------------------------------------- Summary of changes: src/mpid/pamid/src/onesided/mpid_win_accumulate.c | 7 ++++ .../pamid/src/onesided/mpid_win_compare_and_swap.c | 16 ++++++++- .../pamid/src/onesided/mpid_win_create_dynamic.c | 25 +++++++++++++- .../pamid/src/onesided/mpid_win_fetch_and_op.c | 13 +++++++ src/mpid/pamid/src/onesided/mpid_win_get.c | 7 ++++ .../pamid/src/onesided/mpid_win_get_accumulate.c | 35 ++++++++------------ src/mpid/pamid/src/onesided/mpid_win_put.c | 7 ++++ src/mpid/pamid/src/onesided/mpidi_onesided.h | 2 +- 8 files changed, 88 insertions(+), 24 deletions(-) hooks/post-receive -- MPICH primary repository