⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch3u_rma_sync.c

📁 fortran并行计算包
💻 C
📖 第 1 页 / 共 5 页
字号:
        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 + -