📄 ch3u_handle_recv_req.c
字号:
int *complete ){ int mpi_errno = MPI_SUCCESS; MPID_Win *win_ptr; MPIDI_Win_lock_queue *lock_queue_entry, *curr_ptr, **curr_ptr_ptr; MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3_REQHANDLER_SINGLEPUTACCUMCOMPLETE); MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3_REQHANDLER_SINGLEPUTACCUMCOMPLETE); /* received all the data for single lock-put(accum)-unlock optimization where the lock was not acquired in ch3u_handle_recv_pkt. Try to acquire the lock and do the operation. */ MPID_Win_get_ptr(rreq->dev.target_win_handle, win_ptr); lock_queue_entry = rreq->dev.lock_queue_entry; if (MPIDI_CH3I_Try_acquire_win_lock(win_ptr, lock_queue_entry->lock_type) == 1) { if (MPIDI_Request_get_type(rreq) == MPIDI_REQUEST_TYPE_PT_SINGLE_PUT) { /* copy the data over */ mpi_errno = MPIR_Localcopy(rreq->dev.user_buf, rreq->dev.user_count, rreq->dev.datatype, lock_queue_entry->pt_single_op->addr, lock_queue_entry->pt_single_op->count, lock_queue_entry->pt_single_op->datatype); } else { mpi_errno = do_simple_accumulate(lock_queue_entry->pt_single_op); } if (mpi_errno) { MPIU_ERR_POP(mpi_errno); } /* increment counter */ win_ptr->my_pt_rma_puts_accs++; /* send done packet */ mpi_errno = MPIDI_CH3I_Send_pt_rma_done_pkt(vc, lock_queue_entry->source_win_handle); if (mpi_errno) { MPIU_ERR_POP(mpi_errno); } /* free lock_queue_entry including data buffer and remove it from the queue. */ curr_ptr = (MPIDI_Win_lock_queue *) win_ptr->lock_queue; curr_ptr_ptr = (MPIDI_Win_lock_queue **) &(win_ptr->lock_queue); while (curr_ptr != lock_queue_entry) { curr_ptr_ptr = &(curr_ptr->next); curr_ptr = curr_ptr->next; } *curr_ptr_ptr = curr_ptr->next; MPIU_Free(lock_queue_entry->pt_single_op->data); MPIU_Free(lock_queue_entry->pt_single_op); MPIU_Free(lock_queue_entry); /* Release lock and grant next lock if there is one. */ mpi_errno = MPIDI_CH3I_Release_lock(win_ptr); } else { /* could not acquire lock. mark data recd as 1 */ lock_queue_entry->pt_single_op->data_recd = 1; } /* mark data transfer as complete and decrement CC */ MPIDI_CH3U_Request_complete(rreq); *complete = TRUE; fn_fail: MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3_REQHANDLER_SINGLEPUTACCUMCOMPLETE); return mpi_errno;}#undef FUNCNAME#define FUNCNAME MPIDI_CH3_ReqHandler_UnpackUEBufComplete#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDI_CH3_ReqHandler_UnpackUEBufComplete( MPIDI_VC_t *vc, MPID_Request *rreq, int *complete ){ int recv_pending; MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3_REQHANDLER_UNPACKUEBUFCOMPLETE); MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3_REQHANDLER_UNPACKUEBUFCOMPLETE); MPIDI_Request_recv_pending(rreq, &recv_pending); if (!recv_pending) { if (rreq->dev.recv_data_sz > 0) { MPIDI_CH3U_Request_unpack_uebuf(rreq); MPIU_Free(rreq->dev.tmpbuf); } } else { /* The receive has not been posted yet. MPID_{Recv/Irecv}() is responsible for unpacking the buffer. */ } /* mark data transfer as complete and decrement CC */ MPIDI_CH3U_Request_complete(rreq); *complete = TRUE; MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3_REQHANDLER_UNPACKUEBUFCOMPLETE); return MPI_SUCCESS;}#undef FUNCNAME#define FUNCNAME MPIDI_CH3_ReqHandler_UnpackSRBufComplete#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDI_CH3_ReqHandler_UnpackSRBufComplete( MPIDI_VC_t *vc, MPID_Request *rreq, int *complete ){ int mpi_errno = MPI_SUCCESS; MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3_REQHANDLER_UNPACKSRBUFCOMPLETE); MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3_REQHANDLER_UNPACKSRBUFCOMPLETE); MPIDI_CH3U_Request_unpack_srbuf(rreq); if ((MPIDI_Request_get_type(rreq) == MPIDI_REQUEST_TYPE_PUT_RESP) || (MPIDI_Request_get_type(rreq) == MPIDI_REQUEST_TYPE_ACCUM_RESP)) { mpi_errno = MPIDI_CH3_ReqHandler_PutAccumRespComplete( vc, rreq, complete ); } else { /* mark data transfer as complete and decrement CC */ MPIDI_CH3U_Request_complete(rreq); *complete = TRUE; } MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3_REQHANDLER_UNPACKSRBUFCOMPLETE); return mpi_errno;}#undef FUNCNAME#define FUNCNAME MPIDI_CH3_ReqHandler_UnpackSRBufReloadIOV#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDI_CH3_ReqHandler_UnpackSRBufReloadIOV( MPIDI_VC_t *vc, MPID_Request *rreq, int *complete ){ int mpi_errno = MPI_SUCCESS; MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3_REQHANDLER_UNPACKSRBUFRELOADIOV); MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3_REQHANDLER_UNPACKSRBUFRELOADIOV); MPIDI_CH3U_Request_unpack_srbuf(rreq); mpi_errno = MPIDI_CH3U_Request_load_recv_iov(rreq); if (mpi_errno != MPI_SUCCESS) { MPIU_ERR_SETFATALANDJUMP(mpi_errno,MPI_ERR_OTHER,"**ch3|loadrecviov" ); } *complete = FALSE; fn_fail: MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3_REQHANDLER_UNPACKSRBUFRELOADIOV); return mpi_errno;}#undef FUNCNAME#define FUNCNAME MPIDI_CH3_ReqHandler_ReloadIOV#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDI_CH3_ReqHandler_ReloadIOV( MPIDI_VC_t *vc, MPID_Request *rreq, int *complete ){ int mpi_errno = MPI_SUCCESS; MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3_REQHANDLER_RELOADIOV); MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3_REQHANDLER_RELOADIOV); mpi_errno = MPIDI_CH3U_Request_load_recv_iov(rreq); if (mpi_errno != MPI_SUCCESS) { MPIU_ERR_SETFATALANDJUMP(mpi_errno,MPI_ERR_OTHER,"**ch3|loadrecviov"); } *complete = FALSE; fn_fail: MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3_REQHANDLER_RELOADIOV); return mpi_errno;}/* ----------------------------------------------------------------------- *//* ----------------------------------------------------------------------- */#undef FUNCNAME#define FUNCNAME create_derived_datatype#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)static int create_derived_datatype(MPID_Request *req, MPID_Datatype **dtp){ MPIDI_RMA_dtype_info *dtype_info; void *dataloop; MPID_Datatype *new_dtp; int mpi_errno=MPI_SUCCESS; MPI_Aint ptrdiff; MPIDI_STATE_DECL(MPID_STATE_CREATE_DERIVED_DATATYPE); MPIDI_FUNC_ENTER(MPID_STATE_CREATE_DERIVED_DATATYPE); dtype_info = req->dev.dtype_info; dataloop = req->dev.dataloop; /* allocate new datatype object and handle */ new_dtp = (MPID_Datatype *) MPIU_Handle_obj_alloc(&MPID_Datatype_mem); if (!new_dtp) { MPIU_ERR_SETANDJUMP(mpi_errno,MPI_ERR_OTHER,"**nomem"); } *dtp = new_dtp; /* Note: handle is filled in by MPIU_Handle_obj_alloc() */ MPIU_Object_set_ref(new_dtp, 1); new_dtp->is_permanent = 0; new_dtp->is_committed = 1; new_dtp->attributes = 0; new_dtp->cache_id = 0; new_dtp->name[0] = 0; new_dtp->is_contig = dtype_info->is_contig; new_dtp->n_contig_blocks = dtype_info->n_contig_blocks; new_dtp->size = dtype_info->size; new_dtp->extent = dtype_info->extent; new_dtp->dataloop_size = dtype_info->dataloop_size; new_dtp->dataloop_depth = dtype_info->dataloop_depth; new_dtp->eltype = dtype_info->eltype; /* set dataloop pointer */ new_dtp->dataloop = req->dev.dataloop; new_dtp->ub = dtype_info->ub; new_dtp->lb = dtype_info->lb; new_dtp->true_ub = dtype_info->true_ub; new_dtp->true_lb = dtype_info->true_lb; new_dtp->has_sticky_ub = dtype_info->has_sticky_ub; new_dtp->has_sticky_lb = dtype_info->has_sticky_lb; /* update pointers in dataloop */ ptrdiff = (MPI_Aint)((char *) (new_dtp->dataloop) - (char *) (dtype_info->dataloop)); /* FIXME: Temp to avoid SEGV when memory tracing */ new_dtp->hetero_dloop = 0; MPID_Dataloop_update(new_dtp->dataloop, ptrdiff); new_dtp->contents = NULL; fn_fail: MPIDI_FUNC_EXIT(MPID_STATE_CREATE_DERIVED_DATATYPE); return mpi_errno;}#undef FUNCNAME#define FUNCNAME do_accumulate_op#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)static int do_accumulate_op(MPID_Request *rreq){ int mpi_errno = MPI_SUCCESS, predefined; MPI_Aint true_lb, true_extent; MPI_User_function *uop; MPIU_THREADPRIV_DECL; MPIDI_STATE_DECL(MPID_STATE_DO_ACCUMULATE_OP); MPIDI_FUNC_ENTER(MPID_STATE_DO_ACCUMULATE_OP); MPIU_THREADPRIV_GET; if (rreq->dev.op == MPI_REPLACE) { /* simply copy the data */ mpi_errno = MPIR_Localcopy(rreq->dev.user_buf, rreq->dev.user_count, rreq->dev.datatype, rreq->dev.real_user_buf, rreq->dev.user_count, rreq->dev.datatype); if (mpi_errno) { MPIU_ERR_POP(mpi_errno); } goto fn_exit; } if (HANDLE_GET_KIND(rreq->dev.op) == HANDLE_KIND_BUILTIN) { /* get the function by indexing into the op table */ uop = MPIR_Op_table[(rreq->dev.op)%16 - 1]; } else { /* --BEGIN ERROR HANDLING-- */ mpi_errno = MPIR_Err_create_code( MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OP, "**opnotpredefined", "**opnotpredefined %d", rreq->dev.op ); return mpi_errno; /* --END ERROR HANDLING-- */ } MPIDI_CH3I_DATATYPE_IS_PREDEFINED(rreq->dev.datatype, predefined); if (predefined) { (*uop)(rreq->dev.user_buf, rreq->dev.real_user_buf, &(rreq->dev.user_count), &(rreq->dev.datatype)); } else { /* derived datatype */ MPID_Segment *segp; DLOOP_VECTOR *dloop_vec; MPI_Aint first, last; int vec_len, i, type_size, count; MPI_Datatype type; MPID_Datatype *dtp; segp = MPID_Segment_alloc(); /* --BEGIN ERROR HANDLING-- */ if (!segp) { mpi_errno = MPIR_Err_create_code( MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER, "**nomem", 0 ); MPIDI_FUNC_EXIT(MPID_STATE_DO_ACCUMULATE_OP); return mpi_errno; } /* --END ERROR HANDLING-- */ MPID_Segment_init(NULL, rreq->dev.user_count, rreq->dev.datatype, segp, 0); first = 0; last = SEGMENT_IGNORE_LAST; MPID_Datatype_get_ptr(rreq->dev.datatype, dtp); vec_len = dtp->n_contig_blocks * rreq->dev.user_count + 1; /* +1 needed because Rob says so */ dloop_vec = (DLOOP_VECTOR *) MPIU_Malloc(vec_len * sizeof(DLOOP_VECTOR)); /* --BEGIN ERROR HANDLING-- */ if (!dloop_vec) { mpi_errno = MPIR_Err_create_code( MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER, "**nomem", 0 ); MPIDI_FUNC_EXIT(MPID_STATE_DO_ACCUMULATE_OP); return mpi_errno; } /* --END ERROR HANDLING-- */ MPID_Segment_pack_vector(segp, first, &last, dloop_vec, &vec_len); type = dtp->eltype; MPID_Datatype_get_size_macro(type, type_size);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -