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

📄 ch3u_handle_recv_req.c

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