File: topo_base_graph_create.c

package info (click to toggle)
openmpi 1.2.7~rc2-2
  • links: PTS, VCS
  • area: main
  • in suites: lenny
  • size: 41,300 kB
  • ctags: 24,303
  • sloc: ansic: 224,835; sh: 22,627; makefile: 7,037; cpp: 6,353; asm: 3,547; lex: 528; objc: 383; perl: 348; csh: 89; f90: 49; fortran: 47; tcl: 12
file content (86 lines) | stat: -rw-r--r-- 2,783 bytes parent folder | download | duplicates (4)
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
/*
 * Copyright (c) 2004-2005 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-2005 The Regents of the University of California.
 *                         All rights reserved.
 * $COPYRIGHT$
 * 
 * Additional copyrights may follow
 * 
 * $HEADER$
 */

#include "ompi_config.h"
#include "ompi/mca/topo/base/base.h"
#include "ompi/communicator/communicator.h"
#include "ompi/mca/topo/topo.h"

/*
 *
 * function - makes a new communicator to which topology information
 *            has been attached
 *
 * @param comm_old input communicator without topology (handle)
 * @param nnodes number of nodes in graph (integer)
 * @param index array of integers describing node degrees (see below)
 * @param edges array of integers describing graph edges (see below)
 * @param reorder ranking may be reordered (true) or not (false) (logical)
 * @param comm_graph communicator with graph topology added (handle)
 *
 * @retval MPI_SUCCESS
 * @retval MPI_ERR_OUT_OF_RESOURCE
 */

int mca_topo_base_graph_create (mca_topo_base_comm_t *topo_data,
                                int *proc_count,
                                ompi_proc_t **proc_pointers,
                                int *new_rank,
                                int nnodes,
                                int *index,
                                int *edges,
                                bool reorder)
{
    int  nedges;
    int  i;
    int  *p;

    /* check if the number of nodes is more than the number of procs */

    if (nnodes > *proc_count) {
        return MPI_ERR_DIMS;
    }

    /* Create and error check the topology information */

    nedges = topo_data->mtc_dims_or_index[nnodes-1];

    /* Check if there are any negative values on the edges */
    
    p = topo_data->mtc_periods_or_edges;

    for (i = 0; i < nedges; ++i, ++p) {
         if (*p < 0 || *p >= nnodes) {
            return MPI_ERR_TOPOLOGY;
         }
    }

    /* if the graph does not have to be trimmed, then nothing has to change */
    if (nnodes < *proc_count) {
        *proc_count = nnodes;
    }

    /* check if this rank makes the cut. if it does not return -1 */
    if (*new_rank > (nnodes-1)) {
        /* sorry but in our scheme, you are out */
        *new_rank = MPI_UNDEFINED;
        return MPI_SUCCESS;
    }

    return(MPI_SUCCESS);
}