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

📄 helper_fns.c

📁 fortran并行计算包
💻 C
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* * *  (C) 2001 by Argonne National Laboratory. *      See COPYRIGHT in top-level directory. */#include "mpiimpl.h"#include "datatype.h"/* These functions are used in the implementation of collective   operations. They are wrappers around MPID send/recv functions. They do   sends/receives by setting the context offset to   MPID_CONTEXT_INTRA_COLL or MPID_CONTEXT_INTER_COLL. */#undef FUNCNAME#define FUNCNAME MPIC_Send#undef FCNAME#define FCNAME "MPIC_Send"int MPIC_Send(void *buf, int count, MPI_Datatype datatype, int dest, int tag,              MPI_Comm comm){    int mpi_errno, context_id;    MPID_Request *request_ptr=NULL;    MPID_Comm *comm_ptr=NULL;    MPIDI_STATE_DECL(MPID_STATE_MPIC_SEND);    MPIDI_PT2PT_FUNC_ENTER_FRONT(MPID_STATE_MPIC_SEND);    MPID_Comm_get_ptr( comm, comm_ptr );    context_id = (comm_ptr->comm_kind == MPID_INTRACOMM) ?        MPID_CONTEXT_INTRA_COLL : MPID_CONTEXT_INTER_COLL;    mpi_errno = MPID_Send(buf, count, datatype, dest, tag, comm_ptr,                          context_id, &request_ptr);     if (mpi_errno) { MPIU_ERR_POP(mpi_errno); }    if (request_ptr) {        mpi_errno = MPIC_Wait(request_ptr);	if (mpi_errno) { MPIU_ERR_POP(mpi_errno); }	MPID_Request_release(request_ptr);    } fn_exit:    MPIDI_PT2PT_FUNC_EXIT(MPID_STATE_MPIC_SEND);    return mpi_errno; fn_fail:    if (request_ptr) {        MPID_Request_release(request_ptr);    }    goto fn_exit;}#undef FUNCNAME#define FUNCNAME MPIC_Recv#undef FCNAME#define FCNAME "MPIC_Recv"int MPIC_Recv(void *buf, int count, MPI_Datatype datatype, int source, int tag,	     MPI_Comm comm, MPI_Status *status){    int mpi_errno, context_id;    MPID_Request *request_ptr=NULL;    MPID_Comm *comm_ptr = NULL;    MPIDI_STATE_DECL(MPID_STATE_MPIC_RECV);    MPIDI_PT2PT_FUNC_ENTER_BACK(MPID_STATE_MPIC_RECV);    MPID_Comm_get_ptr( comm, comm_ptr );    context_id = (comm_ptr->comm_kind == MPID_INTRACOMM) ?        MPID_CONTEXT_INTRA_COLL : MPID_CONTEXT_INTER_COLL;    mpi_errno = MPID_Recv(buf, count, datatype, source, tag, comm_ptr,                          context_id, status, &request_ptr);     if (mpi_errno) { MPIU_ERR_POP(mpi_errno); }    if (request_ptr) {        mpi_errno = MPIC_Wait(request_ptr);	if (mpi_errno == MPI_SUCCESS) {	    if (status != MPI_STATUS_IGNORE) {		*status = request_ptr->status;	    }	    mpi_errno = request_ptr->status.MPI_ERROR;	}	else { MPIU_ERR_POP(mpi_errno); }        MPID_Request_release(request_ptr);    } fn_exit:    MPIDI_PT2PT_FUNC_EXIT_BACK(MPID_STATE_MPIC_RECV);    return mpi_errno; fn_fail:    if (request_ptr) { 	MPID_Request_release(request_ptr);    }    goto fn_exit;}#undef FUNCNAME#define FUNCNAME MPIC_Sendrecv#undef FCNAME#define FCNAME "MPIC_Sendrecv"int MPIC_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype,                  int dest, int sendtag, void *recvbuf, int recvcount,                  MPI_Datatype recvtype, int source, int recvtag,                  MPI_Comm comm, MPI_Status *status) {    MPID_Request *recv_req_ptr=NULL, *send_req_ptr=NULL;    int mpi_errno, context_id;    MPID_Comm *comm_ptr = NULL;    MPIDI_STATE_DECL(MPID_STATE_MPIC_SENDRECV);    MPIDI_PT2PT_FUNC_ENTER_BOTH(MPID_STATE_MPIC_SENDRECV);    MPID_Comm_get_ptr( comm, comm_ptr );    context_id = (comm_ptr->comm_kind == MPID_INTRACOMM) ?        MPID_CONTEXT_INTRA_COLL : MPID_CONTEXT_INTER_COLL;    mpi_errno = MPID_Irecv(recvbuf, recvcount, recvtype, source, recvtag,                           comm_ptr, context_id, &recv_req_ptr);    if (mpi_errno) { MPIU_ERR_POP(mpi_errno); }    mpi_errno = MPID_Isend(sendbuf, sendcount, sendtype, dest, sendtag,                            comm_ptr, context_id, &send_req_ptr);     if (mpi_errno) { MPIU_ERR_POP(mpi_errno); }    mpi_errno = MPIC_Wait(send_req_ptr);     if (mpi_errno) { MPIU_ERR_POP(mpi_errno); }        mpi_errno = MPIC_Wait(recv_req_ptr);    if (mpi_errno) { MPIU_ERR_POPFATAL(mpi_errno); }    if (status != MPI_STATUS_IGNORE)        *status = recv_req_ptr->status;    mpi_errno = recv_req_ptr->status.MPI_ERROR;    MPID_Request_release(send_req_ptr);    MPID_Request_release(recv_req_ptr); fn_fail:    MPIDI_PT2PT_FUNC_EXIT_BOTH(MPID_STATE_MPIC_SENDRECV);    return mpi_errno;}#undef FUNCNAME#define FUNCNAME MPIR_Localcopy#undef FCNAME#define FCNAME "MPIR_Localcopy"int MPIR_Localcopy(void *sendbuf, int sendcount, MPI_Datatype sendtype,                   void *recvbuf, int recvcount, MPI_Datatype recvtype){    int sendtype_iscontig, recvtype_iscontig, sendsize;    int rank, mpi_errno = MPI_SUCCESS;    MPI_Aint true_extent, sendtype_true_lb, recvtype_true_lb;    MPIU_THREADPRIV_DECL;    MPIU_THREADPRIV_GET;    MPIR_Nest_incr();        MPIR_Datatype_iscontig(sendtype, &sendtype_iscontig);    MPIR_Datatype_iscontig(recvtype, &recvtype_iscontig);    if (sendtype_iscontig && recvtype_iscontig)    {        MPID_Datatype_get_size_macro(sendtype, sendsize);        mpi_errno = NMPI_Type_get_true_extent(sendtype, &sendtype_true_lb,                                              &true_extent);	if (mpi_errno) { MPIU_ERR_POP(mpi_errno); }                mpi_errno = NMPI_Type_get_true_extent(recvtype, &recvtype_true_lb,                                              &true_extent);	if (mpi_errno) { MPIU_ERR_POP(mpi_errno); }        memcpy(((char *) recvbuf + recvtype_true_lb),                ((char *) sendbuf + sendtype_true_lb),                sendcount*sendsize);    }    else {        NMPI_Comm_rank(MPI_COMM_WORLD, &rank);        mpi_errno = MPIC_Sendrecv ( sendbuf, sendcount, sendtype,                                    rank, MPIR_LOCALCOPY_TAG,                                     recvbuf, recvcount, recvtype,                                    rank, MPIR_LOCALCOPY_TAG,                                    MPI_COMM_WORLD, MPI_STATUS_IGNORE );	if (mpi_errno) { MPIU_ERR_POP(mpi_errno); }    }      fn_exit:    MPIR_Nest_decr();    return mpi_errno;  fn_fail:    goto fn_exit;}#undef FUNCNAME#define FUNCNAME MPIC_Isend#undef FCNAME#define FCNAME "MPIC_Isend"int MPIC_Isend(void *buf, int count, MPI_Datatype datatype, int dest, int tag,              MPI_Comm comm, MPI_Request *request){    int mpi_errno, context_id;    MPID_Request *request_ptr=NULL;    MPID_Comm *comm_ptr=NULL;    MPIDI_STATE_DECL(MPID_STATE_MPIC_ISEND);    MPIDI_PT2PT_FUNC_ENTER_FRONT(MPID_STATE_MPIC_ISEND);    MPID_Comm_get_ptr( comm, comm_ptr );    context_id = (comm_ptr->comm_kind == MPID_INTRACOMM) ?        MPID_CONTEXT_INTRA_COLL : MPID_CONTEXT_INTER_COLL;    mpi_errno = MPID_Isend(buf, count, datatype, dest, tag, comm_ptr,                          context_id, &request_ptr);     if (mpi_errno) { MPIU_ERR_POP(mpi_errno); }     *request = request_ptr->handle; fn_fail:    MPIDI_PT2PT_FUNC_EXIT(MPID_STATE_MPIC_ISEND);    return mpi_errno;}#undef FUNCNAME#define FUNCNAME MPIC_Irecv#undef FCNAME#define FCNAME "MPIC_Irecv"int MPIC_Irecv(void *buf, int count, MPI_Datatype datatype, int               source, int tag, MPI_Comm comm, MPI_Request *request){    int mpi_errno, context_id;    MPID_Request *request_ptr=NULL;    MPID_Comm *comm_ptr = NULL;    MPIDI_STATE_DECL(MPID_STATE_MPIC_IRECV);    MPIDI_PT2PT_FUNC_ENTER_BACK(MPID_STATE_MPIC_IRECV);    MPID_Comm_get_ptr( comm, comm_ptr );    context_id = (comm_ptr->comm_kind == MPID_INTRACOMM) ?        MPID_CONTEXT_INTRA_COLL : MPID_CONTEXT_INTER_COLL;    mpi_errno = MPID_Irecv(buf, count, datatype, source, tag, comm_ptr,                          context_id, &request_ptr);     if (mpi_errno) { MPIU_ERR_POP(mpi_errno); }    *request = request_ptr->handle; fn_fail:    MPIDI_PT2PT_FUNC_EXIT_BACK(MPID_STATE_MPIC_IRECV);    return mpi_errno;}#undef FUNCNAME#define FUNCNAME MPIC_Wait#undef FCNAME#define FCNAME "MPIC_Wait"int MPIC_Wait(MPID_Request * request_ptr){    MPIDI_STATE_DECL(MPID_STATE_MPIC_WAIT);    MPIDI_PT2PT_FUNC_ENTER(MPID_STATE_MPIC_WAIT);    if ((*(request_ptr)->cc_ptr) != 0)    {	MPID_Progress_state progress_state;		MPID_Progress_start(&progress_state);	while((*(request_ptr)->cc_ptr) != 0)	{	    int mpi_errno;    	    mpi_errno = MPID_Progress_wait(&progress_state);	    if (mpi_errno) { MPIU_ERR_POP(mpi_errno); }	}	MPID_Progress_end(&progress_state);    } fn_fail:    MPIDI_PT2PT_FUNC_EXIT(MPID_STATE_MPIC_WAIT);    return MPI_SUCCESS;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -