📄 mpidimpl.h
字号:
MPIU_Object_add_ref(pg_); \}#define MPIDI_PG_Release_ref(pg_, inuse_) \{ \ MPIU_Object_release_ref(pg_, inuse_); \}#define MPIDI_PG_Get_vc(pg_, rank_, vcp_) \{ \ *(vcp_) = &(pg_)->vct[rank_]; \ if ((*(vcp_))->state == MPIDI_VC_STATE_INACTIVE) \ { \ MPIU_DBG_PrintVCState2(*(vcp_), MPIDI_VC_STATE_ACTIVE); \ (*(vcp_))->state = MPIDI_VC_STATE_ACTIVE; \ } \}#define MPIDI_PG_Get_vcr(pg_, rank_, vcp_) \{ \ *(vcp_) = &(pg_)->vct[rank_]; \}#define MPIDI_PG_Get_size(pg_) ((pg_)->size)#ifdef MPIDI_DEV_IMPLEMENTS_KVSint MPIDI_PG_To_string(MPIDI_PG_t *pg_ptr, char **str_ptr);int MPIDI_PG_Create_from_string(char * str, MPIDI_PG_t ** pg_pptr, int *flag);#endif/*------------------------- END PROCESS GROUP SECTION -------------------------*//*-------------------------------- BEGIN VIRTUAL CONNECTION SECTION --------------------------------*/#if (USE_THREAD_IMPL != MPICH_THREAD_IMPL_NOT_IMPLEMENTED)# define MPIDI_VC_Get_next_lpid(lpid_ptr_) \ { \ *(lpid_ptr_) = MPIDI_Process.lpid_counter++; \ }#else# error thread safe MPIDI_CH3U_Get_next_lpid() not implemented#endif#if defined(MPID_USE_SEQUENCE_NUMBERS)# define MPIDI_VC_Init_seqnum_send(vc_) \ { \ (vc_)->seqnum_send = 0; \ }#else# define MPIDI_VC_Init_seqnum_send(vc_)#endif#if defined(MPIDI_CH3_MSGS_UNORDERED)# define MPIDI_VC_Init_seqnum_recv(vc_); \ { \ (vc_)->seqnum_recv = 0; \ (vc_)->msg_reorder_queue = NULL; \ }#else# define MPIDI_VC_Init_seqnum_recv(vc_);#endif/* FIXME: Should this fully initialize the vc_ entry? *//* FIXME: Make this into a routine (initializing/creating connections are rare and expensive; no need to use a macro. In addition, the lpid_counter can then be a static int in the file that implements this routine */#define MPIDI_VC_Init(vc_, pg_, rank_) \{ \ (vc_)->state = MPIDI_VC_STATE_INACTIVE; \ MPIU_Object_set_ref((vc_), 0); \ (vc_)->pg = (pg_); \ (vc_)->pg_rank = (rank_); \ MPIDI_VC_Get_next_lpid(&(vc_)->lpid); \ MPIDI_VC_Init_seqnum_send(vc_); \ MPIDI_VC_Init_seqnum_recv(vc_); \ MPIU_DBG_PrintVCState(vc_); \}#if defined(MPID_USE_SEQUENCE_NUMBERS)# if (USE_THREAD_IMPL != MPICH_THREAD_IMPL_NOT_IMPLEMENTED)# define MPIDI_VC_FAI_send_seqnum(vc_, seqnum_out_) \ { \ (seqnum_out_) = (vc_)->seqnum_send++; \ }# elif defined(USE_ATOMIC_UPDATES)# define MPIDI_VC_FAI_send_seqnum(vc_, seqnum_out_) \ { \ MPID_Atomic_fetch_and_incr(&(vc_)->seqnum_send, (seqnum_out_)); \ }# else /* FIXME: a VC specific mutex could be used if contention is a problem. */# define MPIDI_VC_FAI_send_seqnum(vc_, seqnum_out_) \ { \ MPID_Common_thread_lock(); \ { \ (seqnum_out_) = (vc_)->seqnum_send++; \ } \ MPID_Common_thread_unlock(); \ }# endif#else# define MPIDI_VC_FAI_send_seqnum(vc_, seqnum_out_)#endif/*------------------------------ END VIRTUAL CONNECTION SECTION ------------------------------*//*--------------------------------- BEGIN SEND/RECEIVE BUFFER SECTION ---------------------------------*/#if !defined(MPIDI_CH3U_SRBuf_size)# define MPIDI_CH3U_SRBuf_size (256 * 1024)#endif#if !defined(MPIDI_CH3U_SRBuf_alloc)# define MPIDI_CH3U_SRBuf_alloc(req_, size_) \ { \ (req_)->dev.tmpbuf = MPIU_Malloc(MPIDI_CH3U_SRBuf_size); \ if ((req_)->dev.tmpbuf != NULL) \ { \ (req_)->dev.tmpbuf_sz = MPIDI_CH3U_SRBuf_size; \ MPIDI_Request_set_srbuf_flag((req_), TRUE); \ } \ else \ { \ (req_)->dev.tmpbuf_sz = 0; \ } \ }#endif#if !defined(MPIDI_CH3U_SRBuf_free)# define MPIDI_CH3U_SRBuf_free(req_) \ { \ MPIU_Assert(MPIDI_Request_get_srbuf_flag(req_)); \ MPIDI_Request_set_srbuf_flag((req_), FALSE); \ MPIU_Free((req_)->dev.tmpbuf); \ }#endif/*------------------------------- END SEND/RECEIVE BUFFER SECTION -------------------------------*//*---------------------------- BEGIN DEBUGGING TOOL SECTION ----------------------------*//* FIXME: Switch this to use the common debug code */void MPIDI_dbg_printf(int, char *, char *, ...);void MPIDI_err_printf(char *, char *, ...);/* FIXME: This does not belong here */#ifdef USE_MPIU_DBG_PRINT_VCextern char *MPIU_DBG_parent_str;#endif#if defined(MPICH_DBG_OUTPUT)#define MPIDI_DBG_PRINTF(e_) \{ \ if (MPIUI_dbg_state != MPIU_DBG_STATE_NONE) \ { \ MPIDI_dbg_printf e_; \ } \}#else# define MPIDI_DBG_PRINTF(e)#endif#define MPIDI_ERR_PRINTF(e) MPIDI_err_printf e#if defined(HAVE_CPP_VARARGS)# define MPIDI_dbg_printf(level, func, fmt, args...) \ { \ MPIU_dbglog_printf("[%d] %s(): " fmt "\n", MPIR_Process.comm_world->rank, func, ## args); \ }# define MPIDI_err_printf(func, fmt, args...) \ { \ MPIU_Error_printf("[%d] ERROR - %s(): " fmt "\n", MPIR_Process.comm_world->rank, func, ## args); \ fflush(stdout); \ }#endif/* FIXME: What are these for? Why not just use #A? */#define MPIDI_QUOTE(A) MPIDI_QUOTE2(A)#define MPIDI_QUOTE2(A) #A#ifdef MPICH_DBG_OUTPUT void MPIDI_DBG_Print_packet(MPIDI_CH3_Pkt_t *pkt);#else# define MPIDI_DBG_Print_packet(a)#endifconst char * MPIDI_VC_Get_state_description(int state);/*-------------------------- END DEBUGGING TOOL SECTION --------------------------*//* Prototypes for internal device routines */int MPIDI_Isend_self(const void *, int, MPI_Datatype, int, int, MPID_Comm *, int, int, MPID_Request **);/*-------------------------- BEGIN MPI PORT SECTION --------------------------*//* These are the default functions */int MPIDI_Comm_connect(const char *, MPID_Info *, int, MPID_Comm *, MPID_Comm **);int MPIDI_Comm_accept(const char *, MPID_Info *, int, MPID_Comm *, MPID_Comm **);int MPIDI_Comm_spawn_multiple(int, char **, char ***, int *, MPID_Info **, int, MPID_Comm *, MPID_Comm **, int *);/* This structure defines a module that handles the routines that work with MPI port names */typedef struct MPIDI_Port_Ops { int (*OpenPort)( MPID_Info *, char * ); int (*ClosePort)( const char * ); int (*CommAccept)( const char *, MPID_Info *, int, MPID_Comm *, MPID_Comm ** ); int (*CommConnect)( const char *, MPID_Info *, int, MPID_Comm *, MPID_Comm ** );} MPIDI_PortFns;#define MPIDI_PORTFNS_VERSION 1int MPIDI_CH3_PortFnsInit( MPIDI_PortFns * );/* Utility routines provided in src/ch3u_port.c for working with connection queues */int MPIDI_CH3I_Acceptq_enqueue(MPIDI_VC_t * vc);int MPIDI_CH3I_Acceptq_dequeue(MPIDI_VC_t ** vc, int port_name_tag);int MPIDI_CH3I_Acceptq_init(void);/*-------------------------- END MPI PORT SECTION --------------------------*/#ifdef MPIDI_DEV_IMPLEMENTS_KVS#ifdef HAVE_TIME_H#include <time.h>#endif#ifdef HAVE_UUID_UUID_H#include <uuid/uuid.h>#endif#define MPIDI_MAX_KVS_NAME_LEN 256#define MPIDI_MAX_KVS_KEY_LEN 256#define MPIDI_MAX_KVS_VALUE_LEN 4096int MPIDI_KVS_Init(void);int MPIDI_KVS_Finalize(void);int MPIDI_KVS_Create(char *name);int MPIDI_KVS_Create_name_in(char *name);int MPIDI_KVS_Destroy(const char *name);int MPIDI_KVS_Get(const char *name, const char *key, char *value);int MPIDI_KVS_Put(const char *name, const char *key, const char *value);int MPIDI_KVS_Delete(const char *name, const char *key);int MPIDI_KVS_First(const char *name, char *key, char *value);int MPIDI_KVS_Next(const char *name, char *key, char *value);int MPIDI_KVS_Firstkvs(char *name);int MPIDI_KVS_Nextkvs(char *name);#endif /* MPIDI_DEV_IMPLEMENTS_KVS *//* ------------------------------------------------------------------------- *//* mpirma.h (in src/mpi/rma?) *//* ------------------------------------------------------------------------- *//* This structure defines a module that handles the routines that work with MPI-2 RMA ops */typedef struct MPIDI_RMA_Ops { int (*Win_create)(void *, MPI_Aint, int, MPID_Info *, MPID_Comm *, MPID_Win **, struct MPIDI_RMA_Ops *); int (*Win_free)(MPID_Win **); int (*Put)(void *, int, MPI_Datatype, int, MPI_Aint, int, MPI_Datatype, MPID_Win *); int (*Get)(void *, int, MPI_Datatype, int, MPI_Aint, int, MPI_Datatype, MPID_Win *); int (*Accumulate)(void *, int, MPI_Datatype, int, MPI_Aint, int, MPI_Datatype, MPI_Op, MPID_Win *); int (*Win_fence)(int, MPID_Win *); int (*Win_post)(MPID_Group *, int, MPID_Win *); int (*Win_start)(MPID_Group *, int, MPID_Win *); int (*Win_complete)(MPID_Win *); int (*Win_wait)(MPID_Win *); int (*Win_lock)(int, int, int, MPID_Win *); int (*Win_unlock)(int, MPID_Win *); void * (*Alloc_mem)(size_t, MPID_Info *); int (*Free_mem)(void *);} MPIDI_RMAFns;#define MPIDI_RMAFNS_VERSION 1int MPIDI_CH3_RMAFnsInit( MPIDI_RMAFns * );#define MPIDI_RMA_PUT 23#define MPIDI_RMA_GET 24#define MPIDI_RMA_ACCUMULATE 25#define MPIDI_RMA_LOCK 26#define MPIDI_RMA_DATATYPE_BASIC 50#define MPIDI_RMA_DATATYPE_DERIVED 51#define MPID_LOCK_NONE 0int MPIDI_Win_create(void *, MPI_Aint, int, MPID_Info *, MPID_Comm *, MPID_Win **, MPIDI_RMAFns *);int MPIDI_Win_fence(int, MPID_Win *);int MPIDI_Put(void *, int, MPI_Datatype, int, MPI_Aint, int, MPI_Datatype, MPID_Win *); int MPIDI_Get(void *, int, MPI_Datatype, int, MPI_Aint, int, MPI_Datatype, MPID_Win *);int MPIDI_Accumulate(void *, int, MPI_Datatype, int, MPI_Aint, int, MPI_Datatype, MPI_Op, MPID_Win *);int MPIDI_Win_free(MPID_Win **); int MPIDI_Win_wait(MPID_Win *win_ptr);int MPIDI_Win_complete(MPID_Win *win_ptr);int MPIDI_Win_post(MPID_Group *group_ptr, int assert, MPID_Win *win_ptr);int MPIDI_Win_start(MPID_Group *group_ptr, int assert, MPID_Win *win_ptr);int MPIDI_Win_lock(int lock_type, int dest, int assert, MPID_Win *win_ptr);int MPIDI_Win_unlock(int dest, MPID_Win *win_ptr);void *MPIDI_Alloc_mem(size_t size, MPID_Info *info_ptr);int MPIDI_Free_mem(void *ptr);/* optional channel-specific */void *MPIDI_CH3_Alloc_mem(size_t size, MPID_Info *info_ptr);int MPIDI_CH3_Win_create(void *base, MPI_Aint size, int disp_unit, MPID_Info *info, MPID_Comm *comm_ptr, MPID_Win **win_ptr, MPIDI_RMAFns *RMAFns);int MPIDI_CH3_Free_mem(void *ptr);void MPIDI_CH3_Cleanup_mem(void);int MPIDI_CH3_Win_free(MPID_Win **win_ptr);int MPIDI_CH3_Put(void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPID_Win *win_ptr);int MPIDI_CH3_Get(void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPID_Win *win_ptr);int MPIDI_CH3_Accumulate(void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Op op, MPID_Win *win_ptr);int MPIDI_CH3_Win_fence(int assert, MPID_Win *win_ptr);int MPIDI_CH3_Win_lock(int lock_type, int dest, int assert, MPID_Win *win_ptr);int MPIDI_CH3_Win_unlock(int dest, MPID_Win *win_ptr);int MPIDI_CH3_Win_wait(MPID_Win *win_ptr);int MPIDI_CH3_Win_complete(MPID_Win *win_ptr);int MPIDI_CH3_Win_post(MPID_Group *group_ptr, int assert, MPID_Win *win_ptr);int MPIDI_CH3_Win_start(MPID_Group *group_ptr, int assert, MPID_Win *win_ptr);/* internal */int MPIDI_CH3I_Release_lock(MPID_Win * win_ptr);int MPIDI_CH3I_Try_acquire_win_lock(MPID_Win * win_ptr, int requested_lock);int MPIDI_CH3I_Send_lock_granted_pkt(MPIDI_VC_t * vc, int source_win_ptr);int MPIDI_CH3I_Send_pt_rma_done_pkt(MPIDI_VC_t * vc, int source_win_ptr);int MPIDI_CH3I_Progress_finalize(void);/* Function that may be used to provide buisness card info */int MPIDI_CH3I_BCInit( int pg_rank, char **publish_bc_p, char **bc_key_p, char **bc_val_p, int *val_max_sz_p);/* NOTE: Channel function prototypes are in mpidi_ch3_post.h since some of the macros require their declarations. *//* Access the business card (used in mpid_port) */int MPIDI_CH3I_Get_business_card(char *value, int length);/* Perform channel-specific initialization of a virtural connection */int MPIDI_CH3_VC_Init( MPIDI_VC_t *);/* FIXME: These should be defined only when these particular utility packages are used. Best would be to keep these prototypes in the related util/xxx directories, and either copy them into an include directory used only for builds or add (yet another) include path *//* from util/sock */int MPIDI_VC_InitSock( MPIDI_VC_t *);int MPIDI_CH3I_Connect_to_root_sock(const char *, MPIDI_VC_t **);int MPIDI_CH3U_Get_business_card_sock(char **, int *);/* FIXME: Where should this go? *//*int MPIDI_CH3I_Connection_alloc(MPIDI_CH3I_Connection_t **); *//* Used internally to broadcast process groups belonging to peercomm to all processes in comm*/int MPID_PG_BCast( MPID_Comm *peercomm_p, MPID_Comm *comm_p, int root );/* from util/shm */int MPIDI_CH3I_Connect_to_root_sshm(const char *, MPIDI_VC_t **);int MPIDI_VC_InitShm( MPIDI_VC_t *vc );int MPIDU_Sock_get_conninfo_from_bc( const char *bc, char *host_description, int maxlen, int *port, void *ifaddr, int *hasIfaddr );#endif /* !defined(MPICH_MPIDIMPL_H_INCLUDED) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -