common_portals_utcp.c
来自「MPI stands for the Message Passing Inter」· C语言 代码 · 共 339 行
C
339 行
/* * Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana * University Research and Technology * Corporation. All rights reserved. * Copyright (c) 2004-2005 The University of Tennessee and The University * of Tennessee Research Foundation. All rights * reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2006 The Regents of the University of California. * All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow * * $HEADER$ */#include <unistd.h>#include <stdio.h>#include <p3api/debug.h>#include "opal/mca/mca.h"#include "opal/util/output.h"#include "opal/mca/base/mca_base_param.h"#include "ompi/proc/proc.h"#include "ompi/constants.h"#include "ompi/mca/pml/base/pml_base_module_exchange.h"#ifdef __APPLE__static char *ptl_ifname = "en0";FILE *p3_out = stderr;#elsestatic char *ptl_ifname = "eth0";#endif/* how's this for source code diving? - find private method for getting interface */extern int p3tcp_my_nid(const char *if_str, unsigned int *nid);static volatile int32_t usage_count = 0;static volatile int32_t ni_usage_count = 0;static bool setup_utcp_params = true;static bool init_called = false;static ptl_handle_ni_t active_ni_h = PTL_INVALID_HANDLE;static mca_base_component_t portals_component = { MCA_BASE_VERSION_1_0_0, "common", MCA_BASE_VERSION_1_0_0, "portals", MCA_BASE_VERSION_1_0_0, NULL, NULL};char *ompi_common_portals_nodeid(void){ char *ret; asprintf(&ret, "%5d", getpid()); return ret;}intompi_common_portals_register_mca(void){ mca_base_param_reg_string(&portals_component, "ifname", "Interface name to use for communication", false, false, ptl_ifname, &ptl_ifname); return OMPI_SUCCESS;}intompi_common_portals_initialize(void){ int ret; ptl_process_id_t info; if (OPAL_THREAD_ADD32(&usage_count, 1) > 1) return OMPI_SUCCESS; /* if the environment variables for the utcp implementation are already set, assume the user is running without the full Open RTE and is doing RTE testing for a more tightly-coupled platform (like, say, Red Storm). Otherwise, be nice and use the modex to setup everything for the user */ if (NULL == getenv("PTL_MY_RID")) { setup_utcp_params = true; } else { setup_utcp_params = false; } if (setup_utcp_params) { /* Find our contact information and post to registry. Don't initialize Portals until we have everyone's contact information. */ unsigned int nid; p3tcp_my_nid(ptl_ifname, &nid); info.nid = htonl(nid); info.pid = htonl((ptl_pid_t) getpid()); } else { /* Initialize Portals and publish our assigned contact information */ int max_interfaces; unsigned int nptl_procs, rank; ret = PtlInit(&max_interfaces); if (PTL_OK != ret) { opal_output(0, "%5d: PtlInit failed, returning %d\n", getpid(), ret); return OMPI_ERR_NOT_AVAILABLE; } init_called = true; /* tell the UTCP runtime code to read the env variables */ PtlSetRank(PTL_INVALID_HANDLE, -1, -1); /* Initialize a network device */ ret = PtlNIInit(PTL_IFACE_DEFAULT, /* interface to initialize */ PTL_PID_ANY, /* let library assign our pid */ NULL, /* no desired limits */ NULL, /* no need to have limits around */ &active_ni_h /* our interface handle */ ); if (PTL_OK != ret) { opal_output(0, "%5d: PtlNIInit failed, returning %d\n", getpid(), ret); return OMPI_ERR_FATAL; } ret = PtlGetRank(active_ni_h, &rank, &nptl_procs); if (ret != PTL_OK) { opal_output(0, "%5d, PtlGetRank() returned %d", getpid(), ret); return OMPI_ERR_FATAL; } ret = PtlGetRankId(active_ni_h, rank, &info); if (ret != PTL_OK) { opal_output(0, "%5d, PtlGetRank(rank=%d) returned %d", getpid(), rank, ret); return OMPI_ERR_FATAL; } } ret = mca_pml_base_modex_send(&portals_component, &info, sizeof(ptl_process_id_t)); if (OMPI_SUCCESS != ret) { return ret; } return OMPI_SUCCESS;}intompi_common_portals_ni_initialize(ptl_handle_ni_t *ni_handle){ int ret; OPAL_THREAD_ADD32(&ni_usage_count, 1); if (PTL_INVALID_HANDLE != active_ni_h) { *ni_handle = active_ni_h; return OMPI_SUCCESS; } if (setup_utcp_params) { ompi_proc_t **procs; int my_rid = 0; ptl_process_id_t *info; char *nidmap = NULL, *pidmap = NULL; char *nid_str, *pid_str; size_t map_size = 0; size_t nprocs, size, i; char *tmp; ompi_proc_t* proc_self = ompi_proc_local(); int max_interfaces; /* get our world */ procs = ompi_proc_world(&nprocs); map_size = nprocs * 12 + 1; /* 12 is max length of long in decimal */ nidmap = malloc(map_size); pidmap = malloc(map_size); nid_str = malloc(12 + 1); pid_str = malloc(12 + 1); if (NULL == nidmap || NULL == pidmap || NULL == nid_str || NULL == pid_str) return OMPI_ERROR; for (i = 0 ; i < nprocs ; ++i) { if (proc_self == procs[i]) my_rid = i; ret = mca_pml_base_modex_recv(&portals_component, procs[i], (void**) &info, &size); if (OMPI_SUCCESS != ret) { opal_output(0, "%5d: mca_pml_base_modex_recv failed: %d", getpid(), ret); return ret; } else if (sizeof(ptl_process_id_t) != size) { opal_output(0, "%5d: mca_pml_base_modex_recv returned size %d, expected %d", getpid(), size, sizeof(ptl_process_id_t)); return OMPI_ERROR; } if (i == 0) { snprintf(nidmap, map_size, "%u", ntohl(info->nid)); snprintf(pidmap, map_size, "%u", ntohl(info->pid)); } else { snprintf(nid_str, 12 + 1, ":%u", ntohl(info->nid)); snprintf(pid_str, 12 + 1, ":%u", ntohl(info->pid)); strncat(nidmap, nid_str, 12); strncat(pidmap, pid_str, 12); } free(info); } asprintf(&tmp, "PTL_MY_RID=%u", my_rid); putenv(tmp); asprintf(&tmp, "PTL_NIDMAP=%s", nidmap); putenv(tmp); asprintf(&tmp, "PTL_PIDMAP=%s", pidmap); putenv(tmp); asprintf(&tmp, "PTL_IFACE=%s", ptl_ifname); putenv(tmp); free(pidmap); free(nidmap); free(pid_str); free(nid_str); /* * Initialize Portals */ ret = PtlInit(&max_interfaces); if (PTL_OK != ret) { opal_output(0, "%5d: PtlInit failed, returning %d\n", getpid(), ret); return OMPI_ERR_NOT_AVAILABLE; } init_called = true; /* tell the UTCP runtime code to read the env variables */ PtlSetRank(PTL_INVALID_HANDLE, -1, -1); /* Initialize a network device */ ret = PtlNIInit(PTL_IFACE_DEFAULT, /* interface to initialize */ PTL_PID_ANY, /* let library assign our pid */ NULL, /* no desired limits */ NULL, /* no need to have limits around */ &active_ni_h /* our interface handle */ ); if (PTL_OK != ret) { opal_output(0, "%5d: PtlNIInit failed, returning %d\n", getpid(), ret); return OMPI_ERR_FATAL; } *ni_handle = active_ni_h; return OMPI_SUCCESS; } /* shouldn't ever be able to get here */ return OMPI_ERROR;}intompi_common_portals_get_procs(size_t nprocs, struct ompi_proc_t **procs, ptl_process_id_t *portals_procs){ size_t i, size; int ret; ptl_process_id_t *info; for (i = 0 ; i < nprocs ; ++i) { ret = mca_pml_base_modex_recv(&portals_component, procs[i], (void**) &info, &size); if (OMPI_SUCCESS != ret) { opal_output(0, "%5d: mca_pml_base_modex_recv failed: %d", getpid(), ret); return ret; } else if (sizeof(ptl_process_id_t) != size) { opal_output(0, "%5d: mca_pml_base_modex_recv returned size %d, expected %d", getpid(), size, sizeof(ptl_process_id_t)); return OMPI_ERROR; } portals_procs[i].nid = ntohl(info->nid); portals_procs[i].pid = ntohl(info->pid); } return OMPI_SUCCESS;}intompi_common_portals_ni_finalize(void){ if (OPAL_THREAD_ADD32(&ni_usage_count, -1) <= 0) { if (PTL_INVALID_HANDLE != active_ni_h) { if (PTL_OK != PtlNIFini(active_ni_h)) { active_ni_h = PTL_INVALID_HANDLE; return OMPI_ERROR; } active_ni_h = PTL_INVALID_HANDLE; } } return OMPI_SUCCESS;}intompi_common_portals_finalize(void){ if (OPAL_THREAD_ADD32(&usage_count, -1) <= 0) { if (init_called) { PtlFini(); } } return OMPI_SUCCESS;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?