Zoltan2
Loading...
Searching...
No Matches
Machine.cpp
Go to the documentation of this file.
1// @HEADER
2//
3// ***********************************************************************
4//
5// Zoltan2: A package of combinatorial algorithms for scientific computing
6// Copyright 2012 Sandia Corporation
7//
8// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9// the U.S. Government retains certain rights in this software.
10//
11// Redistribution and use in source and binary forms, with or without
12// modification, are permitted provided that the following conditions are
13// met:
14//
15// 1. Redistributions of source code must retain the above copyright
16// notice, this list of conditions and the following disclaimer.
17//
18// 2. Redistributions in binary form must reproduce the above copyright
19// notice, this list of conditions and the following disclaimer in the
20// documentation and/or other materials provided with the distribution.
21//
22// 3. Neither the name of the Corporation nor the names of the
23// contributors may be used to endorse or promote products derived from
24// this software without specific prior written permission.
25//
26// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Questions? Contact Karen Devine (kddevin@sandia.gov)
39// Erik Boman (egboman@sandia.gov)
40// Siva Rajamanickam (srajama@sandia.gov)
41//
42// ***********************************************************************
43//
44// @HEADER
45//
46// Testing Zoltan2::MachineRepresentation
47
50#include <Teuchos_DefaultComm.hpp>
51
52template <typename nCoord_t, typename part_t>
53int checkAllCoords(const Teuchos::Comm<int> &comm,
55{
56 // Verify that getAllMachineCoordinatesView returns the same values
57 // as individual calls by rank.
58 // Verify that returned coordinates lie within the extent of the coordinates.
59
60 int fail = 0;
61 const int failval = 100000000;
62
63 int np = comm.getSize();
64 int me = comm.getRank();
65
66 int dim = mach.getMachineDim();
67 int *nxyz = new int[dim];
68
69 nCoord_t *xyz = new nCoord_t[dim];
70
71 nCoord_t **allCoords;
72
73 bool haveExtent = mach.getMachineExtent(nxyz);
74
75 if (mach.getAllMachineCoordinatesView(allCoords)) {
76
77 // Check all ranks
78 for (int i = 0; i < np; i++) {
79 if (mach.getMachineCoordinate(i, xyz)) {
80 if (me == 0) std::cout << "RANK " << i << " COORD ";
81 for (int d = 0; d < dim; d++) {
82 if (me == 0) std::cout << " " << xyz[d];
83 if (xyz[d] != allCoords[d][i]) fail = failval;
84 if (haveExtent && (xyz[d] < 0 || xyz[d] >= nxyz[d])) fail = failval;
85 }
86 if (me == 0) std::cout << std::endl;
87 }
88 else {
89 std::cout << "Rank " << me
90 << " getMachineCoordinate failed " << std::endl;
91 fail = failval; // getMachineCoordinate failed
92 }
93 }
94 if (fail == failval) {
95 std::cout << "Rank " << me
96 << " Invalid coordinates from getAllMachineCoordinatesView or "
97 << "getMachineCoordinate" << std::endl;
98 }
99
100 // Check my rank
101 if (mach.getMyMachineCoordinate(xyz)) {
102 for (int d = 0; d < dim; d++)
103 if (xyz[d] != allCoords[d][me]) fail = failval;
104 }
105 else {
106 fail = failval; // getMyMachineCoordinate failed
107 std::cout << "Rank " << me
108 << "getMyMachineCoordinates failed" << std::endl;
109 }
110 }
111 else {
112 fail = failval; // couldn't retrieve coordinates
113 std::cout << "Rank " << me
114 << "couldn't retrieve coordinates with "
115 << "getAllMachineCoordinatesView" << std::endl;
116 }
117
118 delete [] xyz;
119 delete [] nxyz;
120
121 return fail;
122}
123
125int checkErrorCode(const Teuchos::Comm<int> &comm, int code)
126{
127 int rank = comm.getRank();
128 if (code > 0)
129 std::cerr << "Proc " << rank << " error: " << code << std::endl;
130 comm.barrier();
131
132 // Will return 1 if any process has a non-zero code
133 TEST_FAIL_AND_RETURN_VALUE(comm, code==0, "TEST FAILED", 1);
134
135 return 0;
136}
137
139
140int main(int narg, char *arg[])
141{
142 Tpetra::ScopeGuard tscope(&narg, &arg);
143 Teuchos::RCP<const Teuchos::Comm<int> > comm = Tpetra::getDefaultComm();
144
145 int me = comm->getRank();
146 int np = comm->getSize();
147 //char *name = "node0"; Causes compiler warnings. Do weirdness.
148 char node0[6] = {'n', 'o', 'd', 'e', '0', '\0'};
149 char *name = node0;
150 int fail = 0;
151
152 typedef zlno_t ncoord_t;
153 typedef zlno_t part_t;
154
155 Teuchos::ParameterList pl;
156
158
159 // Tests that all machines should pass
160 if (mach.getNumRanks() != np) fail += 1;
161
162 if (mach.hasMachineCoordinates())
163 fail += checkAllCoords<ncoord_t,part_t>(*comm, mach);
164
165 if (checkErrorCode(*comm, fail))
166 return 1;
167
168#if defined(HAVE_ZOLTAN2_LDMS)
169 { // Add tests specific to LDMS
170 if (me == 0 ) std::cout << "LDMS Topology" << std::endl;
171 if (checkErrorCode(*comm, fail))
172 return 1;
173 }
174#elif defined(HAVE_ZOLTAN2_RCALIB)
175 {
176 if (me == 0 ) std::cout << "RCALIB Topology" << std::endl;
177 // Add tests specific to RCA
178 if (checkErrorCode(*comm, fail))
179 return 1;
180 }
181#elif defined(HAVE_ZOLTAN2_TOPOMANAGER)
182 {
183 if (me == 0 ) std::cout << "TOPOMANAGER Topology" << std::endl;
184 // Add tests specific to TopoMgr
185 if (checkErrorCode(*comm, fail))
186 return 1;
187 }
188#elif defined(HAVE_ZOLTAN2_BGQTEST)
189 {
190 if (me == 0 ) std::cout << "BGQTEST Topology" << std::endl;
191 // Add tests specific to BGQ
192 if (checkErrorCode(*comm, fail))
193 return 1;
194 }
195#else
196 {
197 if (me == 0 ) std::cout << "TEST Topology" << std::endl;
198 // Tests specific to MachineForTesting
199 if (mach.getMachineDim() != 3) {
200 std::cout << "Error: Dimension != 3" << std::endl;
201 fail += 10;
202 }
203
204 int nxyz[3];
205 if (!mach.getMachineExtent(nxyz)) {
206 std::cout << "Error: getMachineExtent failed" << std::endl;
207 fail += 100;
208 }
209 if (nxyz[0] != np || nxyz[1] != 2*np || nxyz[2] != 3*np) {
210 // Depends on ficticious extent in Zoltan2_MachineForTesting.hpp
211 std::cout << "Error: incorrect MachineExtent" << std::endl;
212 fail += 1000;
213 }
214
215 ncoord_t xyz[3];
216
217 // Depends on ficticious coordinates in Zoltan2_MachineForTesting.hpp
218 ncoord_t xyz_expected[3] = {me, np, np+1};
219
220 if (!mach.getMyMachineCoordinate(xyz)) {
221 std::cout << "Error: getMyMachineCoordinate failed" << std::endl;
222 fail += 1000;
223 }
224
225 if ((xyz[0] != xyz_expected[0]) ||
226 (xyz[1] != xyz_expected[1]) ||
227 (xyz[2] != xyz_expected[2])) {
228 std::cout << "Error: incorrect MyMachineCoordinate" << std::endl;
229 fail += 10000;
230 }
231
232 // MachineForTesting cannot retrieve coords by node name
233 if (mach.getMachineCoordinate(name, xyz)) {
234 std::cout << "Error: getMachineCoordinate failed" << std::endl;
235 fail += 10000000;
236 }
237
238 if (checkErrorCode(*comm, fail))
239 return 1;
240 }
241#endif
242
243 if (me == 0) std::cout << "PASS" << std::endl;
244
245 return 0;
246}
#define TEST_FAIL_AND_RETURN_VALUE(comm, ok, s, rc)
int checkAllCoords(const Teuchos::Comm< int > &comm, const Zoltan2::MachineRepresentation< nCoord_t, part_t > &mach)
Definition Machine.cpp:53
int checkErrorCode(const Teuchos::Comm< int > &comm, int code)
Definition Machine.cpp:125
common code used by tests
Tpetra::Map ::local_ordinal_type zlno_t
int main()
MachineRepresentation Class Base class for representing machine coordinates, networks,...
static const std::string fail
SparseMatrixAdapter_t::part_t part_t