File: topo_base_cart_create.c

package info (click to toggle)
openmpi 1.4.5-1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 60,812 kB
  • sloc: ansic: 307,904; sh: 39,104; cpp: 19,228; makefile: 8,573; asm: 3,627; lex: 901; perl: 362; yacc: 275; csh: 188; fortran: 175; f90: 126; tcl: 12
file content (105 lines) | stat: -rw-r--r-- 3,281 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
/*
 * 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 (c) 2008      Cisco Systems, Inc.  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/group/group.h"
#include "ompi/mca/topo/topo.h"
#include "mpi.h"

/*
 * function - makes a new communicator to which topology information
 *            has been attached
 *
 * @param comm input communicator (handle)
 * @param ndims number of dimensions of cartesian grid (integer)
 * @param dims integer array of size ndims specifying the number of processes in
 *             each dimension
 * @param periods logical array of size ndims specifying whether the grid is
 *                periodic (true) or not (false) in each dimension
 * @param reorder ranking may be reordered (true) or not (false) (logical)
 * @param comm_cart communicator with new cartesian topology (handle)
 *
 * Open MPI currently ignores the 'reorder' flag.
 *
 * @retval MPI_SUCCESS
 */                       

int mca_topo_base_cart_create (mca_topo_base_comm_t *topo_data,
                               int *proc_count,
                               ompi_proc_t **proc_pointers,
                               int *new_rank,
                               int ndims,
                               int *dims,
                               int *periods,
                               bool reorder) {

   int nprocs;
   int dim;
   int i;
   int *p;
   int *coords = topo_data->mtc_coords;
   int dummy_rank;

   nprocs = 1;
   p = topo_data->mtc_dims_or_index;

   /* Calculate the number of processes in this grid */
   for (i = 0; i < topo_data->mtc_ndims_or_nnodes; ++i, ++p) {
      if(*p <= 0) {
          return OMPI_ERROR;
       }
       nprocs *= *p;
   }

   /* check for the error condition */

   if (*proc_count < nprocs) {
       return MPI_ERR_DIMS;
   }

   /* check if we have to trim the list of processes */
   if (nprocs < *proc_count) {
       *proc_count = nprocs;
   }
   
   if (*new_rank > (nprocs-1)) {
       /* sorry, but in our scheme this process is cut off */
       *new_rank = MPI_UNDEFINED;
       return MPI_SUCCESS;
   }

   /* Have to replace this with the actual function body itself */
   p = topo_data->mtc_dims_or_index;
   coords =  topo_data->mtc_coords;
   dummy_rank = *new_rank;

   for (i=0; 
        (i < topo_data->mtc_ndims_or_nnodes && i < ndims); 
        ++i, ++p) {
        dim = *p;
        nprocs /= dim;
        *coords++ = dummy_rank / nprocs;
        dummy_rank %= nprocs;
    }

   /* end here */
   return MPI_SUCCESS;
}