Zoltan2
Toggle main menu visibility
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
48
#include <
Zoltan2_MachineRepresentation.hpp
>
49
#include <
Zoltan2_TestHelpers.hpp
>
50
#include <Teuchos_DefaultComm.hpp>
51
52
template
<
typename
nCoord_t,
typename
part_t>
53
int
checkAllCoords
(
const
Teuchos::Comm<int> &comm,
54
const
Zoltan2::MachineRepresentation<nCoord_t,part_t>
&mach)
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
125
int
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
140
int
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
157
Zoltan2::MachineRepresentation<ncoord_t, part_t>
mach(*comm, pl);
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
}
TEST_FAIL_AND_RETURN_VALUE
#define TEST_FAIL_AND_RETURN_VALUE(comm, ok, s, rc)
Definition
ErrorHandlingForTests.hpp:96
checkAllCoords
int checkAllCoords(const Teuchos::Comm< int > &comm, const Zoltan2::MachineRepresentation< nCoord_t, part_t > &mach)
Definition
Machine.cpp:53
checkErrorCode
int checkErrorCode(const Teuchos::Comm< int > &comm, int code)
Definition
Machine.cpp:125
Zoltan2_MachineRepresentation.hpp
Zoltan2_TestHelpers.hpp
common code used by tests
zlno_t
Tpetra::Map ::local_ordinal_type zlno_t
Definition
Zoltan2_TestHelpers.hpp:106
main
int main()
Definition
absdefinitiontest.cpp:6
Zoltan2::MachineRepresentation
MachineRepresentation Class Base class for representing machine coordinates, networks,...
Definition
Zoltan2_MachineRepresentation.hpp:25
Zoltan2::MachineRepresentation::getAllMachineCoordinatesView
bool getAllMachineCoordinatesView(pcoord_t **&allCoords) const
getProcDim function set the coordinates of all ranks allCoords[i][j], i=0,...,getMachineDim(),...
Definition
Zoltan2_MachineRepresentation.hpp:152
Zoltan2::MachineRepresentation::hasMachineCoordinates
bool hasMachineCoordinates() const
indicates whether or not the machine has coordinates
Definition
Zoltan2_MachineRepresentation.hpp:93
Zoltan2::MachineRepresentation::getMachineDim
int getMachineDim() const
returns the dimension (number of coords per node) in the machine
Definition
Zoltan2_MachineRepresentation.hpp:100
Zoltan2::MachineRepresentation::getMachineExtent
bool getMachineExtent(int *nxyz) const
sets the number of unique coordinates in each machine dimension
Definition
Zoltan2_MachineRepresentation.hpp:107
Zoltan2::MachineRepresentation::getNumRanks
int getNumRanks() const
return the number of ranks.
Definition
Zoltan2_MachineRepresentation.hpp:158
Zoltan2::MachineRepresentation::getMyMachineCoordinate
bool getMyMachineCoordinate(pcoord_t *xyz) const
getMyCoordinate function set the machine coordinate xyz of the current process return true if current...
Definition
Zoltan2_MachineRepresentation.hpp:124
Zoltan2::MachineRepresentation::getMachineCoordinate
bool getMachineCoordinate(const int rank, pcoord_t *xyz) const
getCoordinate function set the machine coordinate xyz of any rank process return true if coordinates ...
Definition
Zoltan2_MachineRepresentation.hpp:132
fail
static const std::string fail
Definition
findUniqueGids.cpp:81
part_t
SparseMatrixAdapter_t::part_t part_t
Definition
partitioningTree.cpp:74
test
core
unit
environment
Machine.cpp
Generated by
1.17.0