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, &params);
    MPID_assert(rc == PAMI_SUCCESS);
    return rc;
}
Esempio n. 2
0
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;
}