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

📄 mpid_init.c

📁 刚才是说明 现在是安装程序在 LINUX环境下进行编程的MPICH安装文件
💻 C
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//*  $Id: mpid_init.c * *  (C) 2001 by Argonne National Laboratory. *      See COPYRIGHT in top-level directory. */#include "mpidimpl.h"#include "pmi.h"#ifdef HAVE_STDIO_H#include <stdio.h> /* snprintf */#endif#ifdef HAVE_STRING_H#include <string.h> /* strdup */#endif#ifdef HAVE_CTYPE_H#include <ctype.h> /* toupper */#endif/* prototypes */static void order_methods_from_environment(void);static void order_methods(void);/* global variables */MPID_PerProcess MPID_Process;static void order_methods_from_environment(void){    char *pEnv, *order, *orig;    unsigned int i;        pEnv = getenv("MPICH_MM_ORDER");    if (!pEnv)	return;    orig = order = strdup(pEnv);    if (order == NULL)	return;    for (i=0; i<strlen(order); i++)	order[i] = toupper(order[i]);    order = strtok(order, ":,");    MPID_Process.num_ordered_methods = 0;    while (order)    {	if (MPID_Process.num_ordered_methods == MM_END_MARKER_METHOD)	{	    free(orig);	    return;	}#ifdef WITH_METHOD_SHM	if (strcmp(order, "SHM") == 0)	{	    MPID_Process.method_order[MPID_Process.num_ordered_methods] = MM_SHM_METHOD;	    MPID_Process.num_ordered_methods++;	}#endif#ifdef WITH_METHOD_VIA_RDMA	if (strcmp(order, "VIA_RDMA") == 0)	{	    MPID_Process.method_order[MPID_Process.num_ordered_methods] = MM_VIA_RDMA_METHOD;	    MPID_Process.num_ordered_methods++;	}#endif#ifdef WITH_METHOD_VIA	if (strcmp(order, "VIA") == 0)	{	    MPID_Process.method_order[MPID_Process.num_ordered_methods] = MM_VIA_METHOD;	    MPID_Process.num_ordered_methods++;	}#endif#ifdef WITH_METHOD_TCP	if (strcmp(order, "TCP") == 0)	{	    MPID_Process.method_order[MPID_Process.num_ordered_methods] = MM_TCP_METHOD;	    MPID_Process.num_ordered_methods++;	}#endif#ifdef WITH_METHOD_SOCKET	if ((strcmp(order, "SOCKET") == 0) || (strcmp(order, "SOCK") == 0))	{	    MPID_Process.method_order[MPID_Process.num_ordered_methods] = MM_SOCKET_METHOD;	    MPID_Process.num_ordered_methods++;	}#endif#ifdef WITH_METHOD_IB	if (strcmp(order, "IB") == 0)	{	    MPID_Process.method_order[MPID_Process.num_ordered_methods] = MM_IB_METHOD;	    MPID_Process.num_ordered_methods++;	}#endif#ifdef WITH_METHOD_NEW	if (strcmp(order, "NEW") == 0)	{	    MPID_Process.method_order[MPID_Process.num_ordered_methods] = MM_NEW_METHOD;	    MPID_Process.num_ordered_methods++;	}#endif	order =  strtok(NULL, ":,");    }    free(orig);}static void order_methods(void){    int i, found;    MPID_Process.num_ordered_methods = 0;    order_methods_from_environment();#ifdef WITH_METHOD_SHM    for (i=0, found = FALSE; i<MPID_Process.num_ordered_methods; i++)    {	if (MPID_Process.method_order[i] == MM_SHM_METHOD)	    found = TRUE;    }    if (!found)    {	MPID_Process.method_order[MPID_Process.num_ordered_methods] = MM_SHM_METHOD;	MPID_Process.num_ordered_methods++;    }#endif#ifdef WITH_METHOD_VIA_RDMA    for (i=0, found = FALSE; i<MPID_Process.num_ordered_methods; i++)    {	if (MPID_Process.method_order[i] == MM_VIA_RDMA_METHOD)	    found = TRUE;    }    if (!found)    {	MPID_Process.method_order[MPID_Process.num_ordered_methods] = MM_VIA_RDMA_METHOD;	MPID_Process.num_ordered_methods++;    }#endif#ifdef WITH_METHOD_VIA    for (i=0, found = FALSE; i<MPID_Process.num_ordered_methods; i++)    {	if (MPID_Process.method_order[i] == MM_VIA_METHOD)	    found = TRUE;    }    if (!found)    {	MPID_Process.method_order[MPID_Process.num_ordered_methods] = MM_VIA_METHOD;	MPID_Process.num_ordered_methods++;    }#endif#ifdef WITH_METHOD_TCP    for (i=0, found = FALSE; i<MPID_Process.num_ordered_methods; i++)    {	if (MPID_Process.method_order[i] == MM_TCP_METHOD)	    found = TRUE;    }    if (!found)    {	MPID_Process.method_order[MPID_Process.num_ordered_methods] = MM_TCP_METHOD;	MPID_Process.num_ordered_methods++;    }#endif#ifdef WITH_METHOD_SOCKET    for (i=0, found = FALSE; i<MPID_Process.num_ordered_methods; i++)    {	if (MPID_Process.method_order[i] == MM_SOCKET_METHOD)	    found = TRUE;    }    if (!found)    {	MPID_Process.method_order[MPID_Process.num_ordered_methods] = MM_SOCKET_METHOD;	MPID_Process.num_ordered_methods++;    }#endif#ifdef WITH_METHOD_IB    for (i=0, found = FALSE; i<MPID_Process.num_ordered_methods; i++)    {	if (MPID_Process.method_order[i] == MM_IB_METHOD)	    found = TRUE;    }    if (!found)    {	MPID_Process.method_order[MPID_Process.num_ordered_methods] = MM_IB_METHOD;	MPID_Process.num_ordered_methods++;    }#endif#ifdef WITH_METHOD_NEW    for (i=0, found = FALSE; i<MPID_Process.num_ordered_methods; i++)    {	if (MPID_Process.method_order[i] == MM_NEW_METHOD)	    found = TRUE;    }    if (!found)    {	MPID_Process.method_order[MPID_Process.num_ordered_methods] = MM_NEW_METHOD;	MPID_Process.num_ordered_methods++;    }#endif}/*@   MPID_Init - Initialize the mm device   Parameters:+  int *argcp.  char ***argvp.  int requested.  int *provided.  int *flag_args-  int *flag_env   Notes:@*/int MPID_Init(int *argcp, char ***argvp, int requested, int *provided, int *flag_args, int *flag_env){    char pszPortName[MPI_MAX_PORT_NAME];    int spawned;    char *value = NULL;    int value_len;    char *key = NULL;    int key_len;    char sCapabilities[256] = "";    bsocket_init();    /* Initialize per process structure */    memset(&MPID_Process, 0, sizeof(MPID_PerProcess));    MPID_Thread_lock_init(MPID_Process.qlock);    MPID_Thread_lock_init(MPID_Process.lock);    MPIR_Process.attrs.tag_ub = 2*1024*1024;    /*dbg_printf("+PMI_Init");*/    PMI_Init(&spawned);    /*dbg_printf("-\n+PMI_Get_rank:");*/    PMI_Get_rank(&MPIR_Process.comm_world->rank);    /*dbg_printf("%d-\n+PMI_Get_size:", MPIR_Process.comm_world->rank);*/    PMI_Get_size(&MPIR_Process.comm_world->local_size);    /*dbg_printf("%d-\n", MPIR_Process.comm_world->local_size);*/    MPIR_Process.comm_world->remote_size = MPIR_Process.comm_world->local_size;    /*dbg_printf("+PMI_KVS_Get_my_name:");*/    /*PMI_KVS_Get_my_name(MPID_Process.pmi_kvsname);*/    value_len = PMI_KVS_Get_name_length_max();    value = (char*)malloc(value_len * sizeof(char));    PMI_KVS_Get_my_name(value);    /*strncpy(MPID_Process.pmi_kvsname, value, MM_KVS_NAME_LENGTH);    MPID_Process.pmi_kvsname[MM_KVS_NAME_LENGTH-1] = '\0';    free(value);    */    MPID_Process.pmi_kvsname = value;    /*dbg_printf("%s-\n", MPID_Process.pmi_kvsname);*/    MPIR_Process.comm_world->mm.pmi_kvsname = MPID_Process.pmi_kvsname;    /*dbg_printf("+PMI_Barrier");*/    PMI_Barrier();    /*dbg_printf("-\n");*/    MPIU_Timer_init(MPIR_Process.comm_world->rank, MPIR_Process.comm_world->local_size); /* Should this be called in MPIR_Init_thread */    if (spawned)    {	/*dbg_printf("+PMI_KVS_Get");*/	PMI_KVS_Get(MPID_Process.pmi_kvsname, MPICH_PARENT_PORT_KEY, pszPortName);	/*dbg_printf("-\n");*/	/*PMPI_Comm_connect(pszPortName, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &MPID_Process.comm_parent); */    }    else    {	MPID_Process.comm_parent = (MPID_Comm *)0;    }    /* single threaded for now? */    if (provided != NULL)    {	*provided = MPI_THREAD_SINGLE;    }    mm_car_init();    mm_vc_init();    /* initialize the methods */    packer_init();    unpacker_init();#ifdef WITH_METHOD_SHM    shm_init();#endif#ifdef WITH_METHOD_TCP    tcp_init();#endif#ifdef WITH_METHOD_SOCKET    socket_init();#endif#ifdef WITH_METHOD_VIA    via_init();#endif#ifdef WITH_METHOD_VIA_RDMA    via_rdma_init();#endif#ifdef WITH_METHOD_IB    ib_init();#endif#ifdef WITH_METHOD_NEW    new_method_init();#endif    /*dbg_printf("+PMI_KVS_Get_value_length_max");*/    value_len = PMI_KVS_Get_value_length_max();    /*dbg_printf("-\n");*/    if (value_len < 1)    {	err_printf("PMI_KVS_Get_value_length_max returned %d\n", value_len);	return -1;    }    value = (char*)MPIU_Malloc(value_len);    if (value == NULL)    {	err_printf("MPIU_Malloc(%d) failed\n", value_len);	return -1;    }    /*dbg_printf("+PMI_KVS_Get_key_length_max");*/    key_len = PMI_KVS_Get_key_length_max();    /*dbg_printf("-\n");*/    if (key_len < 1)    {	err_printf("PMI_KVS_Get_key_length_max returned %d\n", key_len);	return -1;    }    key = MPIU_Malloc(key_len);    if (key == NULL)    {	err_printf("MPIU_Malloc(%d) failed\n", key_len);	return -1;    }#ifdef WITH_METHOD_SHM    strncat(sCapabilities, "shm,", 5);    shm_get_business_card(value, value_len);    snprintf(key, key_len, "business_card_shm:%d", MPIR_Process.comm_world->rank);    /*dbg_printf("+PMI_KVS_Put([%s],[%s])", key, value);*/    PMI_KVS_Put(MPID_Process.pmi_kvsname, key, value);    /*dbg_printf("-\n");*/#endif#ifdef WITH_METHOD_TCP    strncat(sCapabilities, "tcp,", 5);    tcp_get_business_card(value, value_len);    snprintf(key, key_len, "business_card_tcp:%d", MPIR_Process.comm_world->rank);    /*dbg_printf("+PMI_KVS_Put([%s],[%s])", key, value);*/    PMI_KVS_Put(MPID_Process.pmi_kvsname, key, value);    /*dbg_printf("-\n");*/#endif#ifdef WITH_METHOD_SOCKET    strncat(sCapabilities, "socket,", 7);    socket_get_business_card(value, value_len);    snprintf(key, key_len, "business_card_socket:%d", MPIR_Process.comm_world->rank);    /*dbg_printf("+PMI_KVS_Put([%s],[%s])", key, value);*/    PMI_KVS_Put(MPID_Process.pmi_kvsname, key, value);    /*dbg_printf("-\n");*/#endif#ifdef WITH_METHOD_VIA    strncat(sCapabilities, "via,", 5);    via_get_business_card(value, value_len);    snprintf(key, key_len, "business_card_via:%d", MPIR_Process.comm_world->rank);    PMI_KVS_Put(MPID_Process.pmi_kvsname, key, value);#endif#ifdef WITH_METHOD_VIA_RDMA    strncat(sCapabilities, "via_rdma,", 9);    via_rdma_get_business_card(value, value_len);    snprintf(key, key_len, "business_card_via_rdma:%d", MPIR_Process.comm_world->rank);    PMI_KVS_Put(MPID_Process.pmi_kvsname, key, value);#endif#ifdef WITH_METHOD_IB    strncat(sCapabilities, "ib,", 3);    ib_get_business_card(value, value_len);    snprintf(key, key_len, "business_card_ib:%d", MPIR_Process.comm_world->rank);    PMI_KVS_Put(MPID_Process.pmi_kvsname, key, value);#endif#ifdef WITH_METHOD_NEW    strncat(sCapabilities, "new,", 5);    new_get_business_card(value, value_len);    snprintf(key, key_len, "business_card_new:%d", MPIR_Process.comm_world->rank);    PMI_KVS_Put(MPID_Process.pmi_kvsname, key, value);#endif    if (sCapabilities[strlen(sCapabilities)-1] == ',')	sCapabilities[strlen(sCapabilities)-1] = '\0';    snprintf(key, key_len, "businesscard:%d", MPIR_Process.comm_world->rank);    /*dbg_printf("+PMI_KVS_Put([%s],[%s])", key, sCapabilities);*/    PMI_KVS_Put(MPID_Process.pmi_kvsname, key, sCapabilities);    /*dbg_printf("-\n+PMI_KVS_Commit");*/    PMI_KVS_Commit(MPID_Process.pmi_kvsname);    /* order the methods in the way inter-process connections should be attempted */    order_methods();        /*dbg_printf("-\n+PMI_Barrier");*/    PMI_Barrier();    /*dbg_printf("-\n");*/    MPIU_Free(value);    MPIU_Free(key);    return MPI_SUCCESS;}

⌨️ 快捷键说明

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