static pami_result_t MPIDI_Fetch_and_op_using_pami_rmw(pami_context_t context, void * _req) { MPIDI_Win_request *req = (MPIDI_Win_request*)_req; pami_result_t rc; int target_rank; MPID_assert(req != NULL); target_rank = req->target.rank; pami_rmw_t params; params=zero_rmw_parms; params.dest=req->dest; params.cookie=(void *)req; params.done_fn=MPIDI_Win_DoneCB; params.type = req->pami_datatype; params.operation = req->pami_op; params.local=req->user_buffer; /*result*/ params.remote=req->win->mpid.info[target_rank].base_addr + req->offset + (size_t)req->origin.dt.map[0].DLOOP_VECTOR_BUF; params.value=req->buffer; /* replaced value with origin */ rc = PAMI_Rmw(context, ¶ms); MPID_assert(rc == PAMI_SUCCESS); return rc; }
void _rmw ( pami_context_t context, void * src_ptr_in, void * src_ptr_out, void * target_ptr, pami_atomic_t op, pami_type_t type, pami_endpoint_t target ) { pami_rmw_t rmw; memset(&rmw, 0, sizeof(pami_rmw_t)); rmw.cookie = (void *)&_send_active; rmw.done_fn = cb_done; int test = 0; rmw.local = src_ptr_out; rmw.remote = target_ptr; rmw.value = src_ptr_in; rmw.test = &test; rmw.type = type; rmw.operation = op; rmw.dest = target; #if ENABLE_PROGRESS pami_work_t work; PAMI_Context_post (context, &work, (pami_work_function)PAMI_Rmw, (void*)&rmw); while (_send_active == 1); #else RC( PAMI_Rmw (context, &rmw) ); while (_send_active) PAMI_Context_advance (context, POLL_CNT); #endif _send_active = 1; }