1 //
2 // messmpi.h
3 //
4 // Copyright (C) 1996 Limit Point Systems, Inc.
5 //
6 // Author: Curtis Janssen <cljanss@limitpt.com>
7 // Maintainer: LPS
8 //
9 // This file is part of the SC Toolkit.
10 //
11 // The SC Toolkit is free software; you can redistribute it and/or modify
12 // it under the terms of the GNU Library General Public License as published by
13 // the Free Software Foundation; either version 2, or (at your option)
14 // any later version.
15 //
16 // The SC Toolkit is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 // GNU Library General Public License for more details.
20 //
21 // You should have received a copy of the GNU Library General Public License
22 // along with the SC Toolkit; see the file COPYING.LIB.  If not, write to
23 // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
24 //
25 // The U.S. Government is granted a limited license as per AL 91-7.
26 //
27 
28 #ifndef _util_group_messmpi_h
29 #define _util_group_messmpi_h
30 
31 #include <util/group/message.h>
32 #include <util/group/thread.h>
33 
34 #define MPICH_SKIP_MPICXX
35 #include <mpi.h>
36 
37 namespace sc {
38 
39 /** The MPIMessageGrp class is an concrete implementation of MessageGrp
40 that uses the MPI 1 library.  */
41 class MPIMessageGrp: public MessageGrp {
42   protected:
43     void* buf;
44     int bufsize;
45 
46     int rnode;
47     int rtag;
48     int rlen;
49 
50     /// If true use the generic collective routines in the base class
51     bool use_messagegrp_collectives_;
52 
53     /// Number of MPIMessageGrp's currently in use.
54     static int nmpi_grps;
55     /// lock to access nmpi_grps variable
56     static Ref<ThreadLock> grplock;
57 
58     Ref<ThreadGrp> threadgrp;
59     /// Currently each commgrp is a dup of MPI_COMM_WORLD
60     MPI_Comm commgrp;
61 
62     /// Not thread-safe due to race condition on nmpi_grps variable.
63     void init(MPI_Comm comm, int *argc=0, char ***argv=0);
64   public:
65     MPIMessageGrp();
66     /** Use an MPI communicator to create a MessageGrp.  The comm
67         argument could be a subset of MPI_COMM_WORLD, for example. */
68     MPIMessageGrp(MPI_Comm comm);
69     /** Use argc and argv to create a MPIMessageGrp.  This would
70         have to be used for implementations of MPI that have MPI_Init
71         fill in argc and argv. */
72     MPIMessageGrp(int *argc, char ***argv);
73     /** Construction MPIMessageGrp given a KeyVal input object. */
74     MPIMessageGrp(const Ref<KeyVal>&);
75     ~MPIMessageGrp();
76 
77     /// Clones (dups) an MPIMessageGrp from MPI_COMM_WORLD
78     Ref<MessageGrp> clone(void);
79 
80     void raw_send(int target, const void* data, int nbyte);
81     void raw_recv(int sender, void* data, int nbyte);
82     void raw_sendt(int target, int type, const void* data, int nbyte);
83     void raw_recvt(int type, void* data, int nbyte);
84 
85     int probet(int type);
86 
87     void sync();
88 
89     void sum(double*, int n, double*scratch = 0, int target = -1);
90     void sum(int*, int n, int*scratch = 0, int target = -1);
91 
92     void reduce(double*, int n, GrpReduce<double>&,
93                 double*scratch = 0, int target = -1);
94     void reduce(unsigned int*, int n, GrpReduce<unsigned int>&,
95                 unsigned int*scratch = 0, int target = -1);
96     void reduce(int*, int n, GrpReduce<int>&,
97                 int*scratch = 0, int target = -1);
98     void reduce(char*, int n, GrpReduce<char>&,
99                 char*scratch = 0, int target = -1);
100     void reduce(unsigned char*, int n, GrpReduce<unsigned char>&,
101                 unsigned char*scratch = 0, int target = -1);
102     void reduce(signed char*, int n, GrpReduce<signed char>&,
103                 signed char*scratch = 0, int target = -1);
104     void reduce(short*, int n, GrpReduce<short>&,
105                 short*scratch = 0, int target = -1);
106     void reduce(float*, int n, GrpReduce<float>&,
107                 float*scratch = 0, int target = -1);
108     void reduce(long*, int n, GrpReduce<long>&,
109                 long*scratch = 0, int target = -1);
110 
111     void raw_bcast(void* data, int nbyte, int from);
112 };
113 
114 }
115 
116 #endif
117 
118 // Local Variables:
119 // mode: c++
120 // c-file-style: "CLJ"
121 // End:
122