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

📄 mpidimpl.h

📁 mpi并行计算的c++代码 可用vc或gcc编译通过 可以用来搭建并行计算试验环境
💻 H
📖 第 1 页 / 共 2 页
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* *  (C) 2001 by Argonne National Laboratory. *      See COPYRIGHT in top-level directory. *//* * WARNING: Functions and macros in this file are for internal use only.   * As such, they are only visible to the device and * channel.  Do not include them in the MPID macros. *//*  * Note: Never define the feature set in a header file, since this changes * the language accepted by the C compiler and the contents of the headers * seen by the C preprocessor.  Defining any of these renders the work of * configure irrelevant. */#if 0#if !defined(_XOPEN_SOURCE)#define _XOPEN_SOURCE#endif#if !defined(_BSD_SOURCE)#define _BSD_SOURCE#endif#endif#if !defined(MPICH_MPIDIMPL_H_INCLUDED)#define MPICH_MPIDIMPL_H_INCLUDED#if defined(HAVE_ASSERT_H)#include <assert.h>#endif#include "mpiimpl.h"#if !defined(MPIDI_IOV_DENSITY_MIN)#   define MPIDI_IOV_DENSITY_MIN (16 * 1024)#endif#if defined(HAVE_GETHOSTNAME) && defined(NEEDS_GETHOSTNAME_DECL) && !defined(gethostname)int gethostname(char *name, size_t len);# endiftypedef struct MPIDI_Process{    MPIDI_PG_t * my_pg;    int my_pg_rank;    int lpid_counter;}MPIDI_Process_t;extern MPIDI_Process_t MPIDI_Process;extern volatile int MPIDI_Outstanding_close_ops;/*----------------------  BEGIN DATATYPE SECTION  ----------------------*/#define MPIDI_Datatype_get_info(count_, datatype_, dt_contig_out_, data_sz_out_, dt_ptr_, dt_true_lb_)\{									\    if (HANDLE_GET_KIND(datatype_) == HANDLE_KIND_BUILTIN)		\    {									\	(dt_ptr_) = NULL;						\	(dt_contig_out_) = TRUE;					\        (dt_true_lb_)    = 0;                                           \	(data_sz_out_) = (count_) * MPID_Datatype_get_basic_size(datatype_);\	MPIDI_DBG_PRINTF((15, FCNAME, "basic datatype: dt_contig=%d, dt_sz=%d, data_sz=" MPIDI_MSG_SZ_FMT,\			  (dt_contig_out_), MPID_Datatype_get_basic_size(datatype_), (data_sz_out_)));\    }									\    else								\    {									\	MPID_Datatype_get_ptr((datatype_), (dt_ptr_));			\	(dt_contig_out_) = (dt_ptr_)->is_contig;			\	(data_sz_out_) = (count_) * (dt_ptr_)->size;			\        (dt_true_lb_)    = (dt_ptr_)->true_lb;                          \	MPIDI_DBG_PRINTF((15, FCNAME, "user defined datatype: dt_contig=%d, dt_sz=%d, data_sz=" MPIDI_MSG_SZ_FMT,\			  (dt_contig_out_), (dt_ptr_)->size, (data_sz_out_)));\    }									\}/*--------------------  END DATATYPE SECTION  --------------------*//*---------------------  BEGIN REQUEST SECTION  ---------------------*/#define MPIDI_CH3U_Request_create(req_)				\{								\    MPID_Request_construct(req_);				\    MPIU_Object_set_ref((req_), 1);				\    (req_)->kind = MPID_REQUEST_UNDEFINED;			\    (req_)->cc = 1;						\    (req_)->cc_ptr = &(req_)->cc;				\    (req_)->status.MPI_SOURCE = MPI_UNDEFINED;			\    (req_)->status.MPI_TAG = MPI_UNDEFINED;			\    (req_)->status.MPI_ERROR = MPI_SUCCESS;			\    (req_)->status.count = 0;					\    (req_)->status.cancelled = FALSE;				\    (req_)->comm = NULL;					\    (req_)->dev.datatype_ptr = NULL;				\    MPIDI_Request_state_init((req_));				\    (req_)->dev.cancel_pending = FALSE;				\    (req_)->dev.target_win_handle = MPI_WIN_NULL;               \    (req_)->dev.source_win_handle = MPI_WIN_NULL;               \    (req_)->dev.single_op_opt = 0;                              \    (req_)->dev.lock_queue_entry = NULL;                        \    (req_)->dev.dtype_info = NULL;				\    (req_)->dev.dataloop = NULL;				\    (req_)->dev.rdma_iov_count = 0;				\    (req_)->dev.rdma_iov_offset = 0;				\}#define MPIDI_CH3U_Request_complete(req_)			\{								\    int incomplete__;						\								\    MPIDI_CH3U_Request_decrement_cc((req_), &incomplete__);	\    if (!incomplete__)						\    {								\	MPID_Request_release(req_);				\	MPIDI_CH3_Progress_signal_completion();			\    }								\}#define MPIDI_Request_create_sreq(sreq_, mpi_errno_, FAIL_)			\{										\    (sreq_) = MPIDI_CH3_Request_create();					\    if ((sreq_) == NULL)							\    {										\	MPIDI_DBG_PRINTF((15, FCNAME, "send request allocation failed"));	\	(mpi_errno_) = MPIR_ERR_MEMALLOCFAILED;					\	FAIL_;									\    }										\    										\    MPIU_Object_set_ref((sreq_), 2);						\    (sreq_)->kind = MPID_REQUEST_SEND;						\    (sreq_)->comm = comm;							\    MPIR_Comm_add_ref(comm);							\    (sreq_)->dev.match.rank = rank;						\    (sreq_)->dev.match.tag = tag;						\    (sreq_)->dev.match.context_id = comm->context_id + context_offset;		\    (sreq_)->dev.user_buf = (void *) buf;					\    (sreq_)->dev.user_count = count;						\    (sreq_)->dev.datatype = datatype;						\}#define MPIDI_Request_create_psreq(sreq_, mpi_errno_, FAIL_)			\{										\    (sreq_) = MPIDI_CH3_Request_create();					\    if ((sreq_) == NULL)							\    {										\	MPIDI_DBG_PRINTF((15, FCNAME, "send request allocation failed"));	\	(mpi_errno_) = MPIR_ERR_MEMALLOCFAILED;					\	FAIL_;									\    }										\										\    MPIU_Object_set_ref((sreq_), 1);						\    (sreq_)->kind = MPID_PREQUEST_SEND;						\    (sreq_)->comm = comm;							\    MPIR_Comm_add_ref(comm);							\    (sreq_)->dev.match.rank = rank;						\    (sreq_)->dev.match.tag = tag;						\    (sreq_)->dev.match.context_id = comm->context_id + context_offset;		\    (sreq_)->dev.user_buf = (void *) buf;					\    (sreq_)->dev.user_count = count;						\    (sreq_)->dev.datatype = datatype;						\    (sreq_)->partner_request = NULL;						\}/* Masks and flags for channel device state in an MPID_Request */#define MPIDI_Request_state_init(req_)		\{						\    (req_)->dev.state = 0;			\}#define MPIDI_REQUEST_MSG_MASK (0x3 << MPIDI_REQUEST_MSG_SHIFT)#define MPIDI_REQUEST_MSG_SHIFT 0#define MPIDI_REQUEST_NO_MSG 0#define MPIDI_REQUEST_EAGER_MSG 1#define MPIDI_REQUEST_RNDV_MSG 2#define MPIDI_REQUEST_SELF_MSG 3#define MPIDI_Request_get_msg_type(req_)				\(((req_)->dev.state & MPIDI_REQUEST_MSG_MASK) >> MPIDI_REQUEST_MSG_SHIFT)#define MPIDI_Request_set_msg_type(req_, msgtype_)			\{									\    (req_)->dev.state &= ~MPIDI_REQUEST_MSG_MASK;			\    (req_)->dev.state |= ((msgtype_) << MPIDI_REQUEST_MSG_SHIFT) & MPIDI_REQUEST_MSG_MASK;\}#define MPIDI_REQUEST_SRBUF_MASK (0x1 << MPIDI_REQUEST_SRBUF_SHIFT)#define MPIDI_REQUEST_SRBUF_SHIFT 2#define MPIDI_Request_get_srbuf_flag(req_)					\(((req_)->dev.state & MPIDI_REQUEST_SRBUF_MASK) >> MPIDI_REQUEST_SRBUF_SHIFT)#define MPIDI_Request_set_srbuf_flag(req_, flag_)			\{									\    (req_)->dev.state &= ~MPIDI_REQUEST_SRBUF_MASK;			\    (req_)->dev.state |= ((flag_) << MPIDI_REQUEST_SRBUF_SHIFT) & MPIDI_REQUEST_SRBUF_MASK;	\}#define MPIDI_REQUEST_SYNC_SEND_MASK (0x1 << MPIDI_REQUEST_SYNC_SEND_SHIFT)#define MPIDI_REQUEST_SYNC_SEND_SHIFT 3#define MPIDI_Request_get_sync_send_flag(req_)						\(((req_)->dev.state & MPIDI_REQUEST_SYNC_SEND_MASK) >> MPIDI_REQUEST_SYNC_SEND_SHIFT)#define MPIDI_Request_set_sync_send_flag(req_, flag_)			\{									\    (req_)->dev.state &= ~MPIDI_REQUEST_SYNC_SEND_MASK;			\    (req_)->dev.state |= ((flag_) << MPIDI_REQUEST_SYNC_SEND_SHIFT) & MPIDI_REQUEST_SYNC_SEND_MASK;\}#define MPIDI_REQUEST_TYPE_MASK (0xF << MPIDI_REQUEST_TYPE_SHIFT)#define MPIDI_REQUEST_TYPE_SHIFT 4#define MPIDI_REQUEST_TYPE_RECV 0#define MPIDI_REQUEST_TYPE_SEND 1#define MPIDI_REQUEST_TYPE_RSEND 2#define MPIDI_REQUEST_TYPE_SSEND 3/* We need a BSEND type for persistent bsends (see mpid_startall.c) */#define MPIDI_REQUEST_TYPE_BSEND 4#define MPIDI_REQUEST_TYPE_PUT_RESP 5#define MPIDI_REQUEST_TYPE_GET_RESP 6#define MPIDI_REQUEST_TYPE_ACCUM_RESP 7#define MPIDI_REQUEST_TYPE_PUT_RESP_DERIVED_DT 8#define MPIDI_REQUEST_TYPE_GET_RESP_DERIVED_DT 9#define MPIDI_REQUEST_TYPE_ACCUM_RESP_DERIVED_DT 10#define MPIDI_REQUEST_TYPE_PT_SINGLE_PUT 11#define MPIDI_REQUEST_TYPE_PT_SINGLE_ACCUM 12#define MPIDI_Request_get_type(req_)						\(((req_)->dev.state & MPIDI_REQUEST_TYPE_MASK) >> MPIDI_REQUEST_TYPE_SHIFT)#define MPIDI_Request_set_type(req_, type_)				\{									\    (req_)->dev.state &= ~MPIDI_REQUEST_TYPE_MASK;			\    (req_)->dev.state |= ((type_) << MPIDI_REQUEST_TYPE_SHIFT) & MPIDI_REQUEST_TYPE_MASK;\}#if (USE_THREAD_IMPL != MPICH_THREAD_IMPL_NOT_IMPLEMENTED)#define MPIDI_Request_cancel_pending(req_, flag_)	\{							\    *(flag_) = (req_)->dev.cancel_pending;		\    (req_)->dev.cancel_pending = TRUE;			\}#else/* MT: to make this code lock free, an atomic exchange can be used. */ #define MPIDI_Request_cancel_pending(req_, flag_)	\{							\    MPID_Request_thread_lock(req_);			\    {							\	*(flag_) = (req_)->dev.cancel_pending;		\	(req_)->dev.cancel_pending = TRUE;		\    }							\    MPID_Request_thread_unlock(req_);			\}#endif#if (USE_THREAD_IMPL != MPICH_THREAD_IMPL_NOT_IMPLEMENTED)#   define MPIDI_Request_recv_pending(req_, recv_pending_)	\    {								\ 	*(recv_pending_) = --(req_)->dev.recv_pending_count;	\    }#elif defined(USE_ATOMIC_UPDATES)#   define MPIDI_Request_recv_pending(req_, recv_pending_)		\    {									\    	int recv_pending__;						\									\    	MPID_Atomic_decr_flag(&(req_)->dev.recv_pending_count, recv_pending__);\    	*(recv_pending_) = recv_pending__;				\    }#else#   define MPIDI_Request_recv_pending(req_, recv_pending_)		\    {									\    	MPID_Request_thread_lock(req_);					\    	{								\    	    *(recv_pending_) = --(req_)->dev.recv_pending_count;	\    	}								\    	MPID_Request_thread_unlock(req_);				\    }#endif/* MPIDI_Request_fetch_and_clear_rts_sreq() - atomically fetch current    partner RTS sreq and nullify partner request */#if (USE_THREAD_IMPL != MPICH_THREAD_IMPL_NOT_IMPLEMENTED)#   define MPIDI_Request_fetch_and_clear_rts_sreq(sreq_, rts_sreq_)	\    {									\    	*(rts_sreq_) = (sreq_)->partner_request;			\    	(sreq_)->partner_request = NULL;				\    }#else    /* MT: to make this code lock free, an atomic exchange can be used. */#   define MPIDI_Request_fetch_and_clear_rts_sreq(sreq_, rts_sreq_)	\    {									\    	MPID_Request_thread_lock(sreq_);				\    	{								\    	    *(rts_sreq_) = (sreq_)->partner_request;			\    	    (sreq_)->partner_request = NULL;				\    	}								\    	MPID_Request_thread_unlock(sreq_);				\    }#endif#if defined(MPID_USE_SEQUENCE_NUMBERS)#   define MPIDI_Request_set_seqnum(req_, seqnum_)	\    {							\    	(req_)->dev.seqnum = (seqnum_);			\    }#else#   define MPIDI_Request_set_seqnum(req_, seqnum_)#endif/*-------------------  END REQUEST SECTION  -------------------*//*------------------  BEGIN COMM SECTION  ------------------*/#define MPIDI_Comm_get_vc(comm_, rank_, vcp_)		\{							\    *(vcp_) = (comm_)->vcr[(rank_)];			\    if ((*(vcp_))->state == MPIDI_VC_STATE_INACTIVE)	\    {							\	MPIU_DBG_PrintVCState2(*(vcp_), MPIDI_VC_STATE_ACTIVE);  \	(*(vcp_))->state = MPIDI_VC_STATE_ACTIVE;	\    }							\}/*----------------  END COMM SECTION  ----------------*//*--------------------  BEGIN PACKET SECTION  --------------------*/#if !defined(MPICH_DEBUG_MEMINIT)#   define MPIDI_Pkt_init(pkt_, type_)		\    {						\	(pkt_)->type = (type_);			\    }#else#   define MPIDI_Pkt_init(pkt_, type_)				\    {								\	memset((void *) (pkt_), 0xfc, sizeof(MPIDI_CH3_Pkt_t));	\	(pkt_)->type = (type_);					\    }#endif#if defined(MPID_USE_SEQUENCE_NUMBERS)#   define MPIDI_Pkt_set_seqnum(pkt_, seqnum_)	\    {						\    	(pkt_)->seqnum = (seqnum_);		\    }#else#   define MPIDI_Pkt_set_seqnum(pkt_, seqnum_)#endif/*------------------  END PACKET SECTION  ------------------*//*---------------------------  BEGIN PROCESS GROUP SECTION  ---------------------------*/typedef int (*MPIDI_PG_Compare_ids_fn_t)(void * id1, void * id2);typedef int (*MPIDI_PG_Destroy_fn_t)(MPIDI_PG_t * pg);int MPIDI_PG_Init(MPIDI_PG_Compare_ids_fn_t, MPIDI_PG_Destroy_fn_t);int MPIDI_PG_Finalize(void);int MPIDI_PG_Create(int vct_sz, void * pg_id, MPIDI_PG_t ** ppg);int MPIDI_PG_Destroy(MPIDI_PG_t * pg);void MPIDI_PG_Add_ref(MPIDI_PG_t * pg);void MPIDI_PG_Release_ref(MPIDI_PG_t * pg, int * inuse);int MPIDI_PG_Find(void * id, MPIDI_PG_t ** pgp);int MPIDI_PG_Id_compare(void *id1, void *id2);int MPIDI_PG_Get_next(MPIDI_PG_t ** pgp);int MPIDI_PG_Iterate_reset(void);int MPIDI_PG_Get_vc(MPIDI_PG_t * pg, int rank, MPIDI_VC_t ** vc);int MPIDI_PG_Get_size(MPIDI_PG_t * pg);void MPIDI_PG_IdToNum( MPIDI_PG_t *, int * );/* FIXME: It would be simpler if we used MPIU_Object_add_ref etc. uniformly,   rather than defining separate routines */#define MPIDI_PG_Add_ref(pg_)			\{						\

⌨️ 快捷键说明

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