📄 ch3u_rma_sync.c
字号:
case (MPIDI_RMA_ACCUMULATE): win_ptr->pt_rma_puts_accs[curr_ptr->target_rank]++; mpi_errno = MPIDI_CH3I_Send_rma_msg(curr_ptr, win_ptr, source_win_handle, target_win_handle, &dtype_infos[i], &dataloops[i], &requests[i]); if (mpi_errno) { MPIU_ERR_POP(mpi_errno); } break; case (MPIDI_RMA_GET): mpi_errno = MPIDI_CH3I_Recv_rma_msg(curr_ptr, win_ptr, source_win_handle, target_win_handle, &dtype_infos[i], &dataloops[i], &requests[i]); if (mpi_errno) { MPIU_ERR_POP(mpi_errno); } break; default: /* --BEGIN ERROR HANDLING-- */ mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**fail", "**fail %s", "invalid RMA operation"); goto fn_exit; /* --END ERROR HANDLING-- */ } i++; curr_ptr = curr_ptr->next; } if (nops) { MPID_Progress_state progress_state; done = 1; MPID_Progress_start(&progress_state); while (nops) { for (i=0; i<nops; i++) { if (requests[i] != NULL) { if (*(requests[i]->cc_ptr) != 0) { done = 0; break; } else { mpi_errno = requests[i]->status.MPI_ERROR; /* --BEGIN ERROR HANDLING-- */ if (mpi_errno != MPI_SUCCESS) { MPID_Progress_end(&progress_state); mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**fail", "**fail %s", "rma message operation failed"); goto fn_exit; } /* --END ERROR HANDLING-- */ /* if origin datatype was a derived datatype, it will get freed when the request gets freed. */ MPID_Request_release(requests[i]); requests[i] = NULL; } } } if (done) { break; } mpi_errno = MPID_Progress_wait(&progress_state); /* --BEGIN ERROR HANDLING-- */ if (mpi_errno != MPI_SUCCESS) { MPID_Progress_end(&progress_state); mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**fail", "**fail %s", "making progress on the rma messages failed"); goto fn_exit; } /* --END ERROR HANDLING-- */ done = 1; } MPID_Progress_end(&progress_state); } for (i=0; i<nops; i++) { if (dataloops[i] != NULL) { MPIU_Free(dataloops[i]); } } /* free MPIDI_RMA_ops_list */ curr_ptr = win_ptr->rma_ops_list; while (curr_ptr != NULL) { next_ptr = curr_ptr->next; MPIU_Free(curr_ptr); curr_ptr = next_ptr; } win_ptr->rma_ops_list = NULL; fn_exit: MPIU_CHKLMEM_FREEALL(); MPIDI_RMA_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_DO_PASSIVE_TARGET_RMA); return mpi_errno; /* --BEGIN ERROR HANDLING-- */ fn_fail: goto fn_exit; /* --END ERROR HANDLING-- */}#undef FUNCNAME#define FUNCNAME MPIDI_CH3I_Send_lock_put_or_acc#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)static int MPIDI_CH3I_Send_lock_put_or_acc(MPID_Win *win_ptr){ int mpi_errno=MPI_SUCCESS, lock_type, origin_dt_derived, iov_n, iovcnt; MPIDI_RMA_ops *rma_op; MPID_Request *request=NULL; MPIDI_VC_t * vc; MPID_IOV iov[MPID_IOV_LIMIT]; MPID_Comm *comm_ptr; MPID_Datatype *origin_dtp=NULL; int origin_type_size, predefined; MPIDI_CH3_Pkt_t upkt; MPIDI_CH3_Pkt_lock_put_unlock_t *lock_put_unlock_pkt = &upkt.lock_put_unlock; MPIDI_CH3_Pkt_lock_accum_unlock_t *lock_accum_unlock_pkt = &upkt.lock_accum_unlock; MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3I_SEND_LOCK_PUT_OR_ACC); MPIDI_RMA_FUNC_ENTER(MPID_STATE_MPIDI_CH3I_SEND_LOCK_PUT_OR_ACC); lock_type = win_ptr->rma_ops_list->lock_type; rma_op = win_ptr->rma_ops_list->next; win_ptr->pt_rma_puts_accs[rma_op->target_rank]++; if (rma_op->type == MPIDI_RMA_PUT) { MPIDI_Pkt_init(lock_put_unlock_pkt, MPIDI_CH3_PKT_LOCK_PUT_UNLOCK); lock_put_unlock_pkt->target_win_handle = win_ptr->all_win_handles[rma_op->target_rank]; lock_put_unlock_pkt->source_win_handle = win_ptr->handle; lock_put_unlock_pkt->lock_type = lock_type; lock_put_unlock_pkt->addr = (char *) win_ptr->base_addrs[rma_op->target_rank] + win_ptr->disp_units[rma_op->target_rank] * rma_op->target_disp; lock_put_unlock_pkt->count = rma_op->target_count; lock_put_unlock_pkt->datatype = rma_op->target_datatype; iov[0].MPID_IOV_BUF = (MPID_IOV_BUF_CAST) lock_put_unlock_pkt; iov[0].MPID_IOV_LEN = sizeof(*lock_put_unlock_pkt); } else if (rma_op->type == MPIDI_RMA_ACCUMULATE) { MPIDI_Pkt_init(lock_accum_unlock_pkt, MPIDI_CH3_PKT_LOCK_ACCUM_UNLOCK); lock_accum_unlock_pkt->target_win_handle = win_ptr->all_win_handles[rma_op->target_rank]; lock_accum_unlock_pkt->source_win_handle = win_ptr->handle; lock_accum_unlock_pkt->lock_type = lock_type; lock_accum_unlock_pkt->addr = (char *) win_ptr->base_addrs[rma_op->target_rank] + win_ptr->disp_units[rma_op->target_rank] * rma_op->target_disp; lock_accum_unlock_pkt->count = rma_op->target_count; lock_accum_unlock_pkt->datatype = rma_op->target_datatype; lock_accum_unlock_pkt->op = rma_op->op; iov[0].MPID_IOV_BUF = (MPID_IOV_BUF_CAST) lock_accum_unlock_pkt; iov[0].MPID_IOV_LEN = sizeof(*lock_accum_unlock_pkt); } MPID_Comm_get_ptr(win_ptr->comm, comm_ptr); MPIDI_Comm_get_vc(comm_ptr, rma_op->target_rank, &vc); MPIDI_CH3I_DATATYPE_IS_PREDEFINED(rma_op->origin_datatype, predefined); if (!predefined) { origin_dt_derived = 1; MPID_Datatype_get_ptr(rma_op->origin_datatype, origin_dtp); } else { origin_dt_derived = 0; } MPID_Datatype_get_size_macro(rma_op->origin_datatype, origin_type_size); if (!origin_dt_derived) { /* basic datatype on origin */ iov[1].MPID_IOV_BUF = (MPID_IOV_BUF_CAST)rma_op->origin_addr; iov[1].MPID_IOV_LEN = rma_op->origin_count * origin_type_size; iovcnt = 2; mpi_errno = MPIU_CALL(MPIDI_CH3,iStartMsgv(vc, iov, iovcnt, &request)); /* --BEGIN ERROR HANDLING-- */ if (mpi_errno != MPI_SUCCESS) { mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**ch3|rmamsg", 0); goto fn_exit; } /* --END ERROR HANDLING-- */ } else { /* derived datatype on origin */ iovcnt = 1; request = MPID_Request_create(); if (request == NULL) { /* --BEGIN ERROR HANDLING-- */ mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER, "**nomem", 0); goto fn_exit; /* --END ERROR HANDLING-- */ } MPIU_Object_set_ref(request, 2); request->kind = MPID_REQUEST_SEND; request->dev.datatype_ptr = origin_dtp; /* this will cause the datatype to be freed when the request is freed. */ request->dev.segment_ptr = MPID_Segment_alloc( ); /* if (!request->dev.segment_ptr) { MPIU_ERR_POP(); } */ MPID_Segment_init(rma_op->origin_addr, rma_op->origin_count, rma_op->origin_datatype, request->dev.segment_ptr, 0); request->dev.segment_first = 0; request->dev.segment_size = rma_op->origin_count * origin_type_size; iov_n = MPID_IOV_LIMIT - iovcnt; /* On the initial load of a send iov req, set the OnFinal action (null for point-to-point) */ request->dev.OnFinal = 0; mpi_errno = MPIDI_CH3U_Request_load_send_iov(request, &iov[iovcnt], &iov_n); if (mpi_errno == MPI_SUCCESS) { iov_n += iovcnt; mpi_errno = MPIU_CALL(MPIDI_CH3,iSendv(vc, request, iov, iov_n)); /* --BEGIN ERROR HANDLING-- */ if (mpi_errno != MPI_SUCCESS) { MPID_Datatype_release(request->dev.datatype_ptr); MPIU_Object_set_ref(request, 0); MPIDI_CH3_Request_destroy(request); mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**ch3|rmamsg", 0); goto fn_exit; } /* --END ERROR HANDLING-- */ } /* --BEGIN ERROR HANDLING-- */ else { MPID_Datatype_release(request->dev.datatype_ptr); MPIU_Object_set_ref(request, 0); MPIDI_CH3_Request_destroy(request); mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER, "**ch3|loadsendiov", 0); goto fn_exit; } /* --END ERROR HANDLING-- */ } if (request != NULL) { if (*(request->cc_ptr) != 0) { MPID_Progress_state progress_state; MPID_Progress_start(&progress_state); while (*(request->cc_ptr) != 0) { mpi_errno = MPID_Progress_wait(&progress_state); /* --BEGIN ERROR HANDLING-- */ if (mpi_errno != MPI_SUCCESS) { MPID_Progress_end(&progress_state); mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**fail", "**fail %s", "rma message operation failed"); goto fn_exit; } /* --END ERROR HANDLING-- */ } MPID_Progress_end(&progress_state); } mpi_errno = request->status.MPI_ERROR; /* --BEGIN ERROR HANDLING-- */ if (mpi_errno != MPI_SUCCESS) { mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**fail", "**fail %s", "rma message operation failed"); goto fn_exit; } /* --END ERROR HANDLING-- */ MPID_Request_release(request); } /* free MPIDI_RMA_ops_list */ MPIU_Free(win_ptr->rma_ops_list->next); MPIU_Free(win_ptr->rma_ops_list); win_ptr->rma_ops_list = NULL; fn_exit: MPIDI_RMA_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SEND_LOCK_PUT_OR_ACC); return mpi_errno;}#undef FUNCNAME#define FUNCNAME MPIDI_CH3I_Send_lock_get#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)static int MPIDI_CH3I_Send_lock_get(MPID_Win *win_ptr){ int mpi_errno=MPI_SUCCESS, lock_type, predefined; MPIDI_RMA_ops *rma_op; MPID_Request *rreq=NULL, *sreq=NULL; MPIDI_VC_t * vc; MPID_IOV iov[MPID_IOV_LIMIT]; MPID_Comm *comm_ptr; MPID_Datatype *dtp; MPIDI_CH3_Pkt_t upkt; MPIDI_CH3_Pkt_lock_get_unlock_t *lock_get_unlock_pkt = &upkt.lock_get_unlock; MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3I_SEND_LOCK_GET); MPIDI_RMA_FUNC_ENTER(MPID_STATE_MPIDI_CH3I_SEND_LOCK_GET); lock_type = win_ptr->rma_ops_list->lock_type; rma_op = win_ptr->rma_ops_list->next; /* create a request, store the origin buf, cnt, datatype in it, and pass a handle to it in the get packet. When the get response comes from the target, it will contain the request handle. */ rreq = MPID_Request_create(); if (rreq == NULL) { /* --BEGIN ERROR HANDLING-- */ mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER, "**nomem", 0); goto fn_exit; /* --END ERROR HANDLING-- */ } MPIU_Object_set_ref(rreq, 2); rreq->dev.user_buf = rma_op->origin_addr; rreq->dev.user_count = rma_op->origin_count; rreq->dev.datatype = rma_op->origin_datatype; rreq->dev.target_win_handle = MPI_WIN_NULL; rreq->dev.source_win_handle = win_ptr->handle; MPIDI_CH3I_DATATYPE_IS_PREDEFINED(rreq->dev.datatype, predefined); if (!predefined) { MPID_Datatype_get_ptr(rreq->dev.datatype, dtp); rreq->dev.datatype_ptr = dtp; /* this will cause the datatype to be freed when the request is freed. */ } MPIDI_Pkt_init(lock_get_unlock_pkt, MPIDI_CH3_PKT_LOCK_GET_UNLOCK); lock_get_unlock_pkt->target_win_handle = win_ptr->all_win_handles[rma_op->target_rank]; lock_get_unlock_pkt->source_win_handle = win_ptr->handle; lock_get_unlock_pkt->lock_type = lock_type; lock_get_unlock_pkt->addr = (char *) win_ptr->base_addrs[rma_op->target_rank] + win_ptr->disp_units[rma_op->target_rank] * rma_op->target_disp; lock_get_unlock_pkt->count = rma_op->target_count; lock_get_unlock_pkt->datatype = rma_op->target_datatype; lock_get_unlock_pkt->request_handle = rreq->handle; iov[0].MPID_IOV_BUF = (MPID_IOV_BUF_CAST) lock_get_unlock_pkt; iov[0].MPID_IOV_LEN = sizeof(*lock_get_unlock_pkt); MPID_Comm_get_ptr(win_ptr->comm, comm_ptr); MPIDI_Comm_get_vc(comm_ptr, rma_op->target_rank, &vc); mpi_errno = MPIU_CALL(MPIDI_CH3,iStartMsg(vc, lock_get_unlock_pkt, sizeof(*lock_get_unlock_pkt), &sreq)); if (mpi_errno != MPI_SUCCESS) { /* --BEGIN ERROR HANDLING-- */ mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**ch3|rmamsg", 0); goto fn_exit; /* --END ERROR HAN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -