File: hwloc_base_open.c

package info (click to toggle)
openmpi 1.6.5-9.1%2Bdeb8u1
  • links: PTS, VCS
  • area: main
  • in suites: jessie
  • size: 91,628 kB
  • ctags: 44,305
  • sloc: ansic: 408,966; cpp: 44,454; sh: 27,828; makefile: 10,486; asm: 3,882; python: 1,239; lex: 805; perl: 549; csh: 253; fortran: 232; f90: 126; tcl: 12
file content (151 lines) | stat: -rw-r--r-- 6,356 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/*
 * Copyright (c) 2011      Cisco Systems, Inc.  All rights reserved.
 * $COPYRIGHT$
 * 
 * Additional copyrights may follow
 * 
 * $HEADER$
 */


#include "opal_config.h"

#include "opal/constants.h"
#include "opal/dss/dss.h"
#include "opal/util/output.h"
#include "opal/util/show_help.h"
#include "opal/mca/mca.h"
#include "opal/mca/base/base.h"
#include "opal/mca/base/mca_base_param.h"

#include "opal/mca/hwloc/hwloc.h"
#include "opal/mca/hwloc/base/base.h"


/*
 * The following file was created by configure.  It contains extern
 * statements and the definition of an array of pointers to each
 * component's public mca_base_component_t struct.
 */
#include "opal/mca/hwloc/base/static-components.h"


/*
 * Globals
 */
int opal_hwloc_base_output = -1;
opal_list_t opal_hwloc_base_components;
bool opal_hwloc_base_inited = false;
#if OPAL_HAVE_HWLOC
hwloc_topology_t opal_hwloc_topology=NULL;
#endif
opal_hwloc_base_map_t opal_hwloc_base_map = OPAL_HWLOC_BASE_MAP_NONE;
opal_hwloc_base_mbfa_t opal_hwloc_base_mbfa = OPAL_HWLOC_BASE_MBFA_ERROR;


int opal_hwloc_base_open(void)
{
    if (opal_hwloc_base_inited) {
        return OPAL_SUCCESS;
    }
    opal_hwloc_base_inited = true;

#if OPAL_HAVE_HWLOC
    {
        int value;
        opal_data_type_t tmp;
        char *str_value;
        
        /* Debugging / verbose output */
        mca_base_param_reg_int_name("hwloc", "base_verbose", 
                                    "Verbosity level of the hwloc framework",
                                    false, false,
                                    0, &value);
        if (0 != value) {
            opal_hwloc_base_output = opal_output_open(NULL);
        } else {
            opal_hwloc_base_output = -1;
        }

        /* hwloc_base_mbind_policy */
        switch (opal_hwloc_base_map) {
        case OPAL_HWLOC_BASE_MAP_NONE:
            str_value = "none";
            break;
        case OPAL_HWLOC_BASE_MAP_LOCAL_ONLY:
            str_value = "local_only";
            break;
        }
        mca_base_param_reg_string_name("hwloc", "base_mem_alloc_policy",
                                       "General memory allocations placement policy (this is not memory binding). "
                                       "\"none\" means that no memory policy is applied. \"local_only\" means that a process' memory allocations will be restricted to its local NUMA node. "
                                       "If using direct launch, this policy will not be in effect until after MPI_INIT. "
                                       "Note that operating system paging policies are unaffected by this setting. For example, if \"local_only\" is used and local NUMA node memory is exhausted, a new memory allocation may cause paging.",
                                       false, false, str_value, &str_value);
        if (strcasecmp(str_value, "none") == 0) {
            opal_hwloc_base_map = OPAL_HWLOC_BASE_MAP_NONE;
        } else if (strcasecmp(str_value, "local_only") == 0 ||
                   strcasecmp(str_value, "local-only") == 0) {
            opal_hwloc_base_map = OPAL_HWLOC_BASE_MAP_LOCAL_ONLY;
        } else {
            char hostname[32];
            gethostname(hostname, sizeof(hostname));
            opal_show_help("help-opal-hwloc-base.txt", "invalid mem_alloc_policy",
                           true, hostname, getpid(), str_value);
            return OPAL_ERR_BAD_PARAM;
        }
        
        /* hwloc_base_bind_failure_action */
        switch (opal_hwloc_base_mbfa) {
        case OPAL_HWLOC_BASE_MBFA_WARN:
            str_value = "warn";
            break;
        case OPAL_HWLOC_BASE_MBFA_ERROR:
            str_value = "error";
            break;
        }
        mca_base_param_reg_string_name("hwloc", "base_mem_bind_failure_action",
                                       "What Open MPI will do if it explicitly tries to bind memory to a specific NUMA location, and fails.  Note that this is a different case than the general allocation policy described by hwloc_base_alloc_policy.  A value of \"warn\" means that Open MPI will warn the first time this happens, but allow the job to continue (possibly with degraded performance).  A value of \"error\" means that Open MPI will abort the job if this happens.",
                                       false, false, str_value, &str_value);
        if (strcasecmp(str_value, "warn") == 0) {
            opal_hwloc_base_mbfa = OPAL_HWLOC_BASE_MBFA_WARN;
        } else if (strcasecmp(str_value, "error") == 0) {
            opal_hwloc_base_mbfa = OPAL_HWLOC_BASE_MBFA_ERROR;
        } else {
            char hostname[32];
            gethostname(hostname, sizeof(hostname));
            opal_show_help("help-opal-hwloc-base.txt", 
                           "invalid mem_bind_failure_action",
                           true, hostname, getpid(), str_value);
            return OPAL_ERR_BAD_PARAM;
        }
        
        /* to support tools such as ompi_info, add the components
         * to a list
         */
        OBJ_CONSTRUCT(&opal_hwloc_base_components, opal_list_t);
        if (OPAL_SUCCESS !=
            mca_base_components_open("hwloc", opal_hwloc_base_output,
                                     mca_hwloc_base_static_components,
                                     &opal_hwloc_base_components, true)) {
            return OPAL_ERROR;
        }

        /* declare the hwloc data types */
        tmp = OPAL_HWLOC_TOPO;
        if (OPAL_SUCCESS != (value = opal_dss.register_type(opal_hwloc_pack,
                                                            opal_hwloc_unpack,
                                                            (opal_dss_copy_fn_t)opal_hwloc_copy,
                                                            (opal_dss_compare_fn_t)opal_hwloc_compare,
                                                            (opal_dss_size_fn_t)opal_hwloc_size,
                                                            (opal_dss_print_fn_t)opal_hwloc_print,
                                                            (opal_dss_release_fn_t)opal_hwloc_release,
                                                            OPAL_DSS_STRUCTURED,
                                                            "OPAL_HWLOC_TOPO", &tmp))) {
            return value;
        }
    }
#endif

    return OPAL_SUCCESS;
}