/* Fully initialize a VC. This invokes the channel-specific VC initialization routine MPIDI_CH3_VC_Init . */ int MPIDI_VC_Init( MPIDI_VC_t *vc, MPIDI_PG_t *pg, int rank ) { vc->state = MPIDI_VC_STATE_INACTIVE; vc->handle = HANDLE_SET_MPI_KIND(0, MPID_VCONN); MPIU_Object_set_ref(vc, 0); vc->pg = pg; vc->pg_rank = rank; vc->lpid = lpid_counter++; vc->node_id = -1; MPIDI_VC_Init_seqnum_send(vc); MPIDI_VC_Init_seqnum_recv(vc); vc->rndvSend_fn = MPIDI_CH3_RndvSend; vc->rndvRecv_fn = MPIDI_CH3_RecvRndv; vc->ready_eager_max_msg_sz = -1; /* no limit */; vc->eager_max_msg_sz = MPIR_CVAR_CH3_EAGER_MAX_MSG_SIZE; vc->sendNoncontig_fn = MPIDI_CH3_SendNoncontig_iov; #ifdef ENABLE_COMM_OVERRIDES vc->comm_ops = NULL; #endif /* FIXME: We need a better abstraction for initializing the thread state for an object */ #if MPICH_THREAD_GRANULARITY == MPICH_THREAD_GRANULARITY_PER_OBJECT { int err; MPID_Thread_mutex_create(&vc->pobj_mutex,&err); MPIU_Assert(err == 0); } #endif /* MPICH_THREAD_GRANULARITY */ MPIDI_CH3_VC_Init(vc); MPIDI_DBG_PrintVCState(vc); return MPI_SUCCESS; }
int MPIDI_CH3_Init(int has_parent, MPIDI_PG_t *pg_p, int pg_rank) { int mpi_errno = MPI_SUCCESS; int i; MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3_INIT); MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3_INIT); /* Override split_type */ MPID_Comm_fns = &comm_fns; mpi_errno = MPID_nem_init (pg_rank, pg_p, has_parent); if (mpi_errno) MPIR_ERR_POP (mpi_errno); nemesis_initialized = 1; MPIDI_CH3I_my_rank = pg_rank; MPIDI_CH3I_my_pg = pg_p; /* * Initialize Progress Engine */ mpi_errno = MPIDI_CH3I_Progress_init(); if (mpi_errno) MPIR_ERR_SETFATALANDJUMP (mpi_errno, MPI_ERR_OTHER, "**init_progress"); for (i = 0; i < pg_p->size; i++) { mpi_errno = MPIDI_CH3_VC_Init(&pg_p->vct[i]); if (mpi_errno) MPIR_ERR_POP(mpi_errno); } fn_exit: MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3_INIT); return mpi_errno; fn_fail: goto fn_exit; }
int MPIDI_PG_Create(int vct_sz, void * pg_id, MPIDI_PG_t ** pg_ptr) { MPIDI_PG_t * pg = NULL, *pgnext; int p; int mpi_errno = MPI_SUCCESS; MPIR_CHKPMEM_DECL(2); MPIR_FUNC_VERBOSE_STATE_DECL(MPID_STATE_MPIDI_PG_CREATE); MPIR_FUNC_VERBOSE_ENTER(MPID_STATE_MPIDI_PG_CREATE); MPIR_CHKPMEM_MALLOC(pg,MPIDI_PG_t*,sizeof(MPIDI_PG_t),mpi_errno,"pg"); MPIR_CHKPMEM_MALLOC(pg->vct,MPIDI_VC_t *,sizeof(MPIDI_VC_t)*vct_sz, mpi_errno,"pg->vct"); if (verbose) { fprintf( stdout, "Creating a process group of size %d\n", vct_sz ); fflush(stdout); } pg->handle = 0; /* The reference count indicates the number of vc's that are or have been in use and not disconnected. It starts at zero, except for MPI_COMM_WORLD. */ MPIR_Object_set_ref(pg, 0); pg->size = vct_sz; pg->id = pg_id; pg->finalize = 0; /* Initialize the connection information to null. Use the appropriate MPIDI_PG_InitConnXXX routine to set up these fields */ pg->connData = 0; pg->getConnInfo = 0; pg->connInfoToString = 0; pg->connInfoFromString = 0; pg->freeConnInfo = 0; for (p = 0; p < vct_sz; p++) { /* Initialize device fields in the VC object */ MPIDI_VC_Init(&pg->vct[p], pg, p); } /* We may first need to initialize the channel before calling the channel VC init functions. This routine may be a no-op; look in the ch3_init.c file in each channel */ MPIDI_CH3_PG_Init(pg); /* These are now done in MPIDI_VC_Init */ #if 0 for (p = 0; p < vct_sz; p++) { /* Initialize the channel fields in the VC object */ MPIDI_CH3_VC_Init( &pg->vct[p] ); } #endif /* The first process group is always the world group */ if (!pg_world) { pg_world = pg; } /* Add pg's at the tail so that comm world is always the first pg */ pg->next = 0; if (!MPIDI_PG_list) { MPIDI_PG_list = pg; } else { pgnext = MPIDI_PG_list; while (pgnext->next) { pgnext = pgnext->next; } pgnext->next = pg; } *pg_ptr = pg; fn_exit: MPIR_FUNC_VERBOSE_EXIT(MPID_STATE_MPIDI_PG_CREATE); return mpi_errno; fn_fail: MPIR_CHKPMEM_REAP(); goto fn_exit; }