root / testing / ptest / HPL_pdinfo.c
Historique | Voir | Annoter | Télécharger (43,51 ko)
1 | 1 | equemene | /*
|
---|---|---|---|
2 | 1 | equemene | * -- High Performance Computing Linpack Benchmark (HPL)
|
3 | 1 | equemene | * HPL - 2.0 - September 10, 2008
|
4 | 1 | equemene | * Antoine P. Petitet
|
5 | 1 | equemene | * University of Tennessee, Knoxville
|
6 | 1 | equemene | * Innovative Computing Laboratory
|
7 | 1 | equemene | * (C) Copyright 2000-2008 All Rights Reserved
|
8 | 1 | equemene | *
|
9 | 1 | equemene | * -- Copyright notice and Licensing terms:
|
10 | 1 | equemene | *
|
11 | 1 | equemene | * Redistribution and use in source and binary forms, with or without
|
12 | 1 | equemene | * modification, are permitted provided that the following conditions
|
13 | 1 | equemene | * are met:
|
14 | 1 | equemene | *
|
15 | 1 | equemene | * 1. Redistributions of source code must retain the above copyright
|
16 | 1 | equemene | * notice, this list of conditions and the following disclaimer.
|
17 | 1 | equemene | *
|
18 | 1 | equemene | * 2. Redistributions in binary form must reproduce the above copyright
|
19 | 1 | equemene | * notice, this list of conditions, and the following disclaimer in the
|
20 | 1 | equemene | * documentation and/or other materials provided with the distribution.
|
21 | 1 | equemene | *
|
22 | 1 | equemene | * 3. All advertising materials mentioning features or use of this
|
23 | 1 | equemene | * software must display the following acknowledgement:
|
24 | 1 | equemene | * This product includes software developed at the University of
|
25 | 1 | equemene | * Tennessee, Knoxville, Innovative Computing Laboratory.
|
26 | 1 | equemene | *
|
27 | 1 | equemene | * 4. The name of the University, the name of the Laboratory, or the
|
28 | 1 | equemene | * names of its contributors may not be used to endorse or promote
|
29 | 1 | equemene | * products derived from this software without specific written
|
30 | 1 | equemene | * permission.
|
31 | 1 | equemene | *
|
32 | 1 | equemene | * -- Disclaimer:
|
33 | 1 | equemene | *
|
34 | 1 | equemene | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
35 | 1 | equemene | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
36 | 1 | equemene | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
37 | 1 | equemene | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
|
38 | 1 | equemene | * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
39 | 1 | equemene | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
40 | 1 | equemene | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
41 | 1 | equemene | * DATA OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
42 | 1 | equemene | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
43 | 1 | equemene | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
44 | 1 | equemene | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
45 | 1 | equemene | * ---------------------------------------------------------------------
|
46 | 1 | equemene | */
|
47 | 1 | equemene | /*
|
48 | 1 | equemene | * Include files
|
49 | 1 | equemene | */
|
50 | 1 | equemene | #include "hpl.h" |
51 | 1 | equemene | |
52 | 1 | equemene | #ifdef STDC_HEADERS
|
53 | 1 | equemene | void HPL_pdinfo
|
54 | 1 | equemene | ( |
55 | 1 | equemene | HPL_T_test * TEST, |
56 | 1 | equemene | int * NS,
|
57 | 1 | equemene | int * N,
|
58 | 1 | equemene | int * NBS,
|
59 | 1 | equemene | int * NB,
|
60 | 1 | equemene | HPL_T_ORDER * PMAPPIN, |
61 | 1 | equemene | int * NPQS,
|
62 | 1 | equemene | int * P,
|
63 | 1 | equemene | int * Q,
|
64 | 1 | equemene | int * NPFS,
|
65 | 1 | equemene | HPL_T_FACT * PF, |
66 | 1 | equemene | int * NBMS,
|
67 | 1 | equemene | int * NBM,
|
68 | 1 | equemene | int * NDVS,
|
69 | 1 | equemene | int * NDV,
|
70 | 1 | equemene | int * NRFS,
|
71 | 1 | equemene | HPL_T_FACT * RF, |
72 | 1 | equemene | int * NTPS,
|
73 | 1 | equemene | HPL_T_TOP * TP, |
74 | 1 | equemene | int * NDHS,
|
75 | 1 | equemene | int * DH,
|
76 | 1 | equemene | HPL_T_SWAP * FSWAP, |
77 | 1 | equemene | int * TSWAP,
|
78 | 1 | equemene | int * L1NOTRAN,
|
79 | 1 | equemene | int * UNOTRAN,
|
80 | 1 | equemene | int * EQUIL,
|
81 | 1 | equemene | int * ALIGN
|
82 | 1 | equemene | ) |
83 | 1 | equemene | #else
|
84 | 1 | equemene | void HPL_pdinfo
|
85 | 1 | equemene | ( TEST, NS, N, NBS, NB, PMAPPIN, NPQS, P, Q, NPFS, PF, NBMS, NBM, NDVS, NDV, NRFS, RF, NTPS, TP, NDHS, DH, FSWAP, TSWAP, L1NOTRAN, UNOTRAN, EQUIL, ALIGN ) |
86 | 1 | equemene | HPL_T_test * TEST; |
87 | 1 | equemene | int * NS;
|
88 | 1 | equemene | int * N;
|
89 | 1 | equemene | int * NBS;
|
90 | 1 | equemene | int * NB;
|
91 | 1 | equemene | HPL_T_ORDER * PMAPPIN; |
92 | 1 | equemene | int * NPQS;
|
93 | 1 | equemene | int * P;
|
94 | 1 | equemene | int * Q;
|
95 | 1 | equemene | int * NPFS;
|
96 | 1 | equemene | HPL_T_FACT * PF; |
97 | 1 | equemene | int * NBMS;
|
98 | 1 | equemene | int * NBM;
|
99 | 1 | equemene | int * NDVS;
|
100 | 1 | equemene | int * NDV;
|
101 | 1 | equemene | int * NRFS;
|
102 | 1 | equemene | HPL_T_FACT * RF; |
103 | 1 | equemene | int * NTPS;
|
104 | 1 | equemene | HPL_T_TOP * TP; |
105 | 1 | equemene | int * NDHS;
|
106 | 1 | equemene | int * DH;
|
107 | 1 | equemene | HPL_T_SWAP * FSWAP; |
108 | 1 | equemene | int * TSWAP;
|
109 | 1 | equemene | int * L1NOTRAN;
|
110 | 1 | equemene | int * UNOTRAN;
|
111 | 1 | equemene | int * EQUIL;
|
112 | 1 | equemene | int * ALIGN;
|
113 | 1 | equemene | #endif
|
114 | 1 | equemene | { |
115 | 1 | equemene | /*
|
116 | 1 | equemene | * Purpose
|
117 | 1 | equemene | * =======
|
118 | 1 | equemene | *
|
119 | 1 | equemene | * HPL_pdinfo reads the startup information for the various tests and
|
120 | 1 | equemene | * transmits it to all processes.
|
121 | 1 | equemene | *
|
122 | 1 | equemene | * Arguments
|
123 | 1 | equemene | * =========
|
124 | 1 | equemene | *
|
125 | 1 | equemene | * TEST (global output) HPL_T_test *
|
126 | 1 | equemene | * On entry, TEST points to a testing data structure. On exit,
|
127 | 1 | equemene | * the fields of this data structure are initialized as follows:
|
128 | 1 | equemene | * TEST->outfp specifies the output file where the results will
|
129 | 1 | equemene | * be printed. It is only defined and used by the process 0 of
|
130 | 1 | equemene | * the grid. TEST->thrsh specifies the threshhold value for the
|
131 | 1 | equemene | * test ratio. TEST->epsil is the relative machine precision of
|
132 | 1 | equemene | * the distributed computer. Finally the test counters, kfail,
|
133 | 1 | equemene | * kpass, kskip, ktest are initialized to zero.
|
134 | 1 | equemene | *
|
135 | 1 | equemene | * NS (global output) int *
|
136 | 1 | equemene | * On exit, NS specifies the number of different problem sizes
|
137 | 1 | equemene | * to be tested. NS is less than or equal to HPL_MAX_PARAM.
|
138 | 1 | equemene | *
|
139 | 1 | equemene | * N (global output) int *
|
140 | 1 | equemene | * On entry, N is an array of dimension HPL_MAX_PARAM. On exit,
|
141 | 1 | equemene | * the first NS entries of this array contain the problem sizes
|
142 | 1 | equemene | * to run the code with.
|
143 | 1 | equemene | *
|
144 | 1 | equemene | * NBS (global output) int *
|
145 | 1 | equemene | * On exit, NBS specifies the number of different distribution
|
146 | 1 | equemene | * blocking factors to be tested. NBS must be less than or equal
|
147 | 1 | equemene | * to HPL_MAX_PARAM.
|
148 | 1 | equemene | *
|
149 | 1 | equemene | * NB (global output) int *
|
150 | 1 | equemene | * On exit, PMAPPIN specifies the process mapping onto the no-
|
151 | 1 | equemene | * des of the MPI machine configuration. PMAPPIN defaults to
|
152 | 1 | equemene | * row-major ordering.
|
153 | 1 | equemene | *
|
154 | 1 | equemene | * PMAPPIN (global output) HPL_T_ORDER *
|
155 | 1 | equemene | * On entry, NB is an array of dimension HPL_MAX_PARAM. On exit,
|
156 | 1 | equemene | * the first NBS entries of this array contain the values of the
|
157 | 1 | equemene | * various distribution blocking factors, to run the code with.
|
158 | 1 | equemene | *
|
159 | 1 | equemene | * NPQS (global output) int *
|
160 | 1 | equemene | * On exit, NPQS specifies the number of different values that
|
161 | 1 | equemene | * can be used for P and Q, i.e., the number of process grids to
|
162 | 1 | equemene | * run the code with. NPQS must be less than or equal to
|
163 | 1 | equemene | * HPL_MAX_PARAM.
|
164 | 1 | equemene | *
|
165 | 1 | equemene | * P (global output) int *
|
166 | 1 | equemene | * On entry, P is an array of dimension HPL_MAX_PARAM. On exit,
|
167 | 1 | equemene | * the first NPQS entries of this array contain the values of P,
|
168 | 1 | equemene | * the number of process rows of the NPQS grids to run the code
|
169 | 1 | equemene | * with.
|
170 | 1 | equemene | *
|
171 | 1 | equemene | * Q (global output) int *
|
172 | 1 | equemene | * On entry, Q is an array of dimension HPL_MAX_PARAM. On exit,
|
173 | 1 | equemene | * the first NPQS entries of this array contain the values of Q,
|
174 | 1 | equemene | * the number of process columns of the NPQS grids to run the
|
175 | 1 | equemene | * code with.
|
176 | 1 | equemene | *
|
177 | 1 | equemene | * NPFS (global output) int *
|
178 | 1 | equemene | * On exit, NPFS specifies the number of different values that
|
179 | 1 | equemene | * can be used for PF : the panel factorization algorithm to run
|
180 | 1 | equemene | * the code with. NPFS is less than or equal to HPL_MAX_PARAM.
|
181 | 1 | equemene | *
|
182 | 1 | equemene | * PF (global output) HPL_T_FACT *
|
183 | 1 | equemene | * On entry, PF is an array of dimension HPL_MAX_PARAM. On exit,
|
184 | 1 | equemene | * the first NPFS entries of this array contain the various
|
185 | 1 | equemene | * panel factorization algorithms to run the code with.
|
186 | 1 | equemene | *
|
187 | 1 | equemene | * NBMS (global output) int *
|
188 | 1 | equemene | * On exit, NBMS specifies the number of various recursive
|
189 | 1 | equemene | * stopping criteria to be tested. NBMS must be less than or
|
190 | 1 | equemene | * equal to HPL_MAX_PARAM.
|
191 | 1 | equemene | *
|
192 | 1 | equemene | * NBM (global output) int *
|
193 | 1 | equemene | * On entry, NBM is an array of dimension HPL_MAX_PARAM. On
|
194 | 1 | equemene | * exit, the first NBMS entries of this array contain the values
|
195 | 1 | equemene | * of the various recursive stopping criteria to be tested.
|
196 | 1 | equemene | *
|
197 | 1 | equemene | * NDVS (global output) int *
|
198 | 1 | equemene | * On exit, NDVS specifies the number of various numbers of
|
199 | 1 | equemene | * panels in recursion to be tested. NDVS is less than or equal
|
200 | 1 | equemene | * to HPL_MAX_PARAM.
|
201 | 1 | equemene | *
|
202 | 1 | equemene | * NDV (global output) int *
|
203 | 1 | equemene | * On entry, NDV is an array of dimension HPL_MAX_PARAM. On
|
204 | 1 | equemene | * exit, the first NDVS entries of this array contain the values
|
205 | 1 | equemene | * of the various numbers of panels in recursion to be tested.
|
206 | 1 | equemene | *
|
207 | 1 | equemene | * NRFS (global output) int *
|
208 | 1 | equemene | * On exit, NRFS specifies the number of different values that
|
209 | 1 | equemene | * can be used for RF : the recursive factorization algorithm to
|
210 | 1 | equemene | * be tested. NRFS is less than or equal to HPL_MAX_PARAM.
|
211 | 1 | equemene | *
|
212 | 1 | equemene | * RF (global output) HPL_T_FACT *
|
213 | 1 | equemene | * On entry, RF is an array of dimension HPL_MAX_PARAM. On exit,
|
214 | 1 | equemene | * the first NRFS entries of this array contain the various
|
215 | 1 | equemene | * recursive factorization algorithms to run the code with.
|
216 | 1 | equemene | *
|
217 | 1 | equemene | * NTPS (global output) int *
|
218 | 1 | equemene | * On exit, NTPS specifies the number of different values that
|
219 | 1 | equemene | * can be used for the broadcast topologies to be tested. NTPS
|
220 | 1 | equemene | * is less than or equal to HPL_MAX_PARAM.
|
221 | 1 | equemene | *
|
222 | 1 | equemene | * TP (global output) HPL_T_TOP *
|
223 | 1 | equemene | * On entry, TP is an array of dimension HPL_MAX_PARAM. On exit,
|
224 | 1 | equemene | * the first NTPS entries of this array contain the various
|
225 | 1 | equemene | * broadcast (along rows) topologies to run the code with.
|
226 | 1 | equemene | *
|
227 | 1 | equemene | * NDHS (global output) int *
|
228 | 1 | equemene | * On exit, NDHS specifies the number of different values that
|
229 | 1 | equemene | * can be used for the lookahead depths to be tested. NDHS is
|
230 | 1 | equemene | * less than or equal to HPL_MAX_PARAM.
|
231 | 1 | equemene | *
|
232 | 1 | equemene | * DH (global output) int *
|
233 | 1 | equemene | * On entry, DH is an array of dimension HPL_MAX_PARAM. On
|
234 | 1 | equemene | * exit, the first NDHS entries of this array contain the values
|
235 | 1 | equemene | * of lookahead depths to run the code with. Such a value is at
|
236 | 1 | equemene | * least 0 (no-lookahead) or greater than zero.
|
237 | 1 | equemene | *
|
238 | 1 | equemene | * FSWAP (global output) HPL_T_SWAP *
|
239 | 1 | equemene | * On exit, FSWAP specifies the swapping algorithm to be used in
|
240 | 1 | equemene | * all tests.
|
241 | 1 | equemene | *
|
242 | 1 | equemene | * TSWAP (global output) int *
|
243 | 1 | equemene | * On exit, TSWAP specifies the swapping threshold as a number
|
244 | 1 | equemene | * of columns when the mixed swapping algorithm was chosen.
|
245 | 1 | equemene | *
|
246 | 1 | equemene | * L1NOTRA (global output) int *
|
247 | 1 | equemene | * On exit, L1NOTRAN specifies whether the upper triangle of the
|
248 | 1 | equemene | * panels of columns should be stored in no-transposed form
|
249 | 1 | equemene | * (L1NOTRAN=1) or in transposed form (L1NOTRAN=0).
|
250 | 1 | equemene | *
|
251 | 1 | equemene | * UNOTRAN (global output) int *
|
252 | 1 | equemene | * On exit, UNOTRAN specifies whether the panels of rows should
|
253 | 1 | equemene | * be stored in no-transposed form (UNOTRAN=1) or transposed
|
254 | 1 | equemene | * form (UNOTRAN=0) during their broadcast.
|
255 | 1 | equemene | *
|
256 | 1 | equemene | * EQUIL (global output) int *
|
257 | 1 | equemene | * On exit, EQUIL specifies whether equilibration during the
|
258 | 1 | equemene | * swap-broadcast of the panel of rows should be performed
|
259 | 1 | equemene | * (EQUIL=1) or not (EQUIL=0).
|
260 | 1 | equemene | *
|
261 | 1 | equemene | * ALIGN (global output) int *
|
262 | 1 | equemene | * On exit, ALIGN specifies the alignment of the dynamically
|
263 | 1 | equemene | * allocated buffers in double precision words. ALIGN is greater
|
264 | 1 | equemene | * than zero.
|
265 | 1 | equemene | *
|
266 | 1 | equemene | * ---------------------------------------------------------------------
|
267 | 1 | equemene | */
|
268 | 1 | equemene | /*
|
269 | 1 | equemene | * .. Local Variables ..
|
270 | 1 | equemene | */
|
271 | 1 | equemene | char file[HPL_LINE_MAX], line[HPL_LINE_MAX],
|
272 | 1 | equemene | auth[HPL_LINE_MAX], num [HPL_LINE_MAX]; |
273 | 1 | equemene | FILE * infp; |
274 | 1 | equemene | int * iwork = NULL; |
275 | 1 | equemene | char * lineptr;
|
276 | 1 | equemene | int error=0, fid, i, j, lwork, maxp, nprocs, |
277 | 1 | equemene | rank, size; |
278 | 1 | equemene | /* ..
|
279 | 1 | equemene | * .. Executable Statements ..
|
280 | 1 | equemene | */
|
281 | 1 | equemene | MPI_Comm_rank( MPI_COMM_WORLD, &rank ); |
282 | 1 | equemene | MPI_Comm_size( MPI_COMM_WORLD, &size ); |
283 | 1 | equemene | /*
|
284 | 1 | equemene | * Initialize the TEST data structure with default values
|
285 | 1 | equemene | */
|
286 | 1 | equemene | TEST->outfp = stderr; TEST->epsil = 2.0e-16; TEST->thrsh = 16.0; |
287 | 1 | equemene | TEST->kfail = TEST->kpass = TEST->kskip = TEST->ktest = 0;
|
288 | 1 | equemene | /*
|
289 | 1 | equemene | * Process 0 reads the input data, broadcasts to other processes and
|
290 | 1 | equemene | * writes needed information to TEST->outfp.
|
291 | 1 | equemene | */
|
292 | 1 | equemene | if( rank == 0 ) |
293 | 1 | equemene | { |
294 | 1 | equemene | /*
|
295 | 1 | equemene | * Open file and skip data file header
|
296 | 1 | equemene | */
|
297 | 1 | equemene | if( ( infp = fopen( "HPL.dat", "r" ) ) == NULL ) |
298 | 1 | equemene | { |
299 | 1 | equemene | HPL_pwarn( stderr, __LINE__, "HPL_pdinfo",
|
300 | 1 | equemene | "cannot open file HPL.dat" );
|
301 | 1 | equemene | error = 1; goto label_error; |
302 | 1 | equemene | } |
303 | 1 | equemene | |
304 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); |
305 | 1 | equemene | (void) fgets( auth, HPL_LINE_MAX - 2, infp ); |
306 | 1 | equemene | /*
|
307 | 1 | equemene | * Read name and unit number for summary output file
|
308 | 1 | equemene | */
|
309 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); |
310 | 1 | equemene | (void) sscanf( line, "%s", file ); |
311 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); |
312 | 1 | equemene | (void) sscanf( line, "%s", num ); |
313 | 1 | equemene | fid = atoi( num ); |
314 | 1 | equemene | if ( fid == 6 ) TEST->outfp = stdout; |
315 | 1 | equemene | else if( fid == 7 ) TEST->outfp = stderr; |
316 | 1 | equemene | else if( ( TEST->outfp = fopen( file, "w" ) ) == NULL ) |
317 | 1 | equemene | { |
318 | 1 | equemene | HPL_pwarn( stderr, __LINE__, "HPL_pdinfo", "cannot open file %s.", |
319 | 1 | equemene | file ); |
320 | 1 | equemene | error = 1; goto label_error; |
321 | 1 | equemene | } |
322 | 1 | equemene | /*
|
323 | 1 | equemene | * Read and check the parameter values for the tests.
|
324 | 1 | equemene | *
|
325 | 1 | equemene | * Problem size (>=0) (N)
|
326 | 1 | equemene | */
|
327 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); |
328 | 1 | equemene | (void) sscanf( line, "%s", num ); *NS = atoi( num ); |
329 | 1 | equemene | if( ( *NS < 1 ) || ( *NS > HPL_MAX_PARAM ) ) |
330 | 1 | equemene | { |
331 | 1 | equemene | HPL_pwarn( stderr, __LINE__, "HPL_pdinfo", "%s %d", |
332 | 1 | equemene | "Number of values of N is less than 1 or greater than",
|
333 | 1 | equemene | HPL_MAX_PARAM ); |
334 | 1 | equemene | error = 1; goto label_error; |
335 | 1 | equemene | } |
336 | 1 | equemene | |
337 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); lineptr = line; |
338 | 1 | equemene | for( i = 0; i < *NS; i++ ) |
339 | 1 | equemene | { |
340 | 1 | equemene | (void) sscanf( lineptr, "%s", num ); lineptr += strlen( num ) + 1; |
341 | 1 | equemene | if( ( N[ i ] = atoi( num ) ) < 0 ) |
342 | 1 | equemene | { |
343 | 1 | equemene | HPL_pwarn( stderr, __LINE__, "HPL_pdinfo",
|
344 | 1 | equemene | "Value of N less than 0" );
|
345 | 1 | equemene | error = 1; goto label_error; |
346 | 1 | equemene | } |
347 | 1 | equemene | } |
348 | 1 | equemene | /*
|
349 | 1 | equemene | * Block size (>=1) (NB)
|
350 | 1 | equemene | */
|
351 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); |
352 | 1 | equemene | (void) sscanf( line, "%s", num ); *NBS = atoi( num ); |
353 | 1 | equemene | if( ( *NBS < 1 ) || ( *NBS > HPL_MAX_PARAM ) ) |
354 | 1 | equemene | { |
355 | 1 | equemene | HPL_pwarn( stderr, __LINE__, "HPL_pdinfo", "%s %s %d", |
356 | 1 | equemene | "Number of values of NB is less than 1 or",
|
357 | 1 | equemene | "greater than", HPL_MAX_PARAM );
|
358 | 1 | equemene | error = 1; goto label_error; |
359 | 1 | equemene | } |
360 | 1 | equemene | |
361 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); lineptr = line; |
362 | 1 | equemene | for( i = 0; i < *NBS; i++ ) |
363 | 1 | equemene | { |
364 | 1 | equemene | (void) sscanf( lineptr, "%s", num ); lineptr += strlen( num ) + 1; |
365 | 1 | equemene | if( ( NB[ i ] = atoi( num ) ) < 1 ) |
366 | 1 | equemene | { |
367 | 1 | equemene | HPL_pwarn( stderr, __LINE__, "HPL_pdinfo",
|
368 | 1 | equemene | "Value of NB less than 1" );
|
369 | 1 | equemene | error = 1; goto label_error; |
370 | 1 | equemene | } |
371 | 1 | equemene | } |
372 | 1 | equemene | /*
|
373 | 1 | equemene | * Process grids, mapping, (>=1) (P, Q)
|
374 | 1 | equemene | */
|
375 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); |
376 | 1 | equemene | (void) sscanf( line, "%s", num ); |
377 | 1 | equemene | *PMAPPIN = ( atoi( num ) == 1 ? HPL_COLUMN_MAJOR : HPL_ROW_MAJOR );
|
378 | 1 | equemene | |
379 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); |
380 | 1 | equemene | (void) sscanf( line, "%s", num ); *NPQS = atoi( num ); |
381 | 1 | equemene | if( ( *NPQS < 1 ) || ( *NPQS > HPL_MAX_PARAM ) ) |
382 | 1 | equemene | { |
383 | 1 | equemene | HPL_pwarn( stderr, __LINE__, "HPL_pdinfo", "%s %s %d", |
384 | 1 | equemene | "Number of values of grids is less",
|
385 | 1 | equemene | "than 1 or greater than", HPL_MAX_PARAM );
|
386 | 1 | equemene | error = 1; goto label_error; |
387 | 1 | equemene | } |
388 | 1 | equemene | |
389 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); lineptr = line; |
390 | 1 | equemene | for( i = 0; i < *NPQS; i++ ) |
391 | 1 | equemene | { |
392 | 1 | equemene | (void) sscanf( lineptr, "%s", num ); lineptr += strlen( num ) + 1; |
393 | 1 | equemene | if( ( P[ i ] = atoi( num ) ) < 1 ) |
394 | 1 | equemene | { |
395 | 1 | equemene | HPL_pwarn( stderr, __LINE__, "HPL_pdinfo",
|
396 | 1 | equemene | "Value of P less than 1" );
|
397 | 1 | equemene | error = 1; goto label_error; |
398 | 1 | equemene | } |
399 | 1 | equemene | } |
400 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); lineptr = line; |
401 | 1 | equemene | for( i = 0; i < *NPQS; i++ ) |
402 | 1 | equemene | { |
403 | 1 | equemene | (void) sscanf( lineptr, "%s", num ); lineptr += strlen( num ) + 1; |
404 | 1 | equemene | if( ( Q[ i ] = atoi( num ) ) < 1 ) |
405 | 1 | equemene | { |
406 | 1 | equemene | HPL_pwarn( stderr, __LINE__, "HPL_pdinfo",
|
407 | 1 | equemene | "Value of Q less than 1" );
|
408 | 1 | equemene | error = 1; goto label_error; |
409 | 1 | equemene | } |
410 | 1 | equemene | } |
411 | 1 | equemene | /*
|
412 | 1 | equemene | * Check for enough processes in machine configuration
|
413 | 1 | equemene | */
|
414 | 1 | equemene | maxp = 0;
|
415 | 1 | equemene | for( i = 0; i < *NPQS; i++ ) |
416 | 1 | equemene | { nprocs = P[i] * Q[i]; maxp = Mmax( maxp, nprocs ); } |
417 | 1 | equemene | if( maxp > size )
|
418 | 1 | equemene | { |
419 | 1 | equemene | HPL_pwarn( stderr, __LINE__, "HPL_pdinfo",
|
420 | 1 | equemene | "Need at least %d processes for these tests", maxp );
|
421 | 1 | equemene | error = 1; goto label_error; |
422 | 1 | equemene | } |
423 | 1 | equemene | /*
|
424 | 1 | equemene | * Checking threshold value (TEST->thrsh)
|
425 | 1 | equemene | */
|
426 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); |
427 | 1 | equemene | (void) sscanf( line, "%s", num ); TEST->thrsh = atof( num ); |
428 | 1 | equemene | /*
|
429 | 1 | equemene | * Panel factorization algorithm (PF)
|
430 | 1 | equemene | */
|
431 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); |
432 | 1 | equemene | (void) sscanf( line, "%s", num ); *NPFS = atoi( num ); |
433 | 1 | equemene | if( ( *NPFS < 1 ) || ( *NPFS > HPL_MAX_PARAM ) ) |
434 | 1 | equemene | { |
435 | 1 | equemene | HPL_pwarn( stderr, __LINE__, "HPL_pdinfo", "%s %s %d", |
436 | 1 | equemene | "number of values of PFACT",
|
437 | 1 | equemene | "is less than 1 or greater than", HPL_MAX_PARAM );
|
438 | 1 | equemene | error = 1; goto label_error; |
439 | 1 | equemene | } |
440 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); lineptr = line; |
441 | 1 | equemene | for( i = 0; i < *NPFS; i++ ) |
442 | 1 | equemene | { |
443 | 1 | equemene | (void) sscanf( lineptr, "%s", num ); lineptr += strlen( num ) + 1; |
444 | 1 | equemene | j = atoi( num ); |
445 | 1 | equemene | if( j == 0 ) PF[ i ] = HPL_LEFT_LOOKING; |
446 | 1 | equemene | else if( j == 1 ) PF[ i ] = HPL_CROUT; |
447 | 1 | equemene | else if( j == 2 ) PF[ i ] = HPL_RIGHT_LOOKING; |
448 | 1 | equemene | else PF[ i ] = HPL_RIGHT_LOOKING;
|
449 | 1 | equemene | } |
450 | 1 | equemene | /*
|
451 | 1 | equemene | * Recursive stopping criterium (>=1) (NBM)
|
452 | 1 | equemene | */
|
453 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); |
454 | 1 | equemene | (void) sscanf( line, "%s", num ); *NBMS = atoi( num ); |
455 | 1 | equemene | if( ( *NBMS < 1 ) || ( *NBMS > HPL_MAX_PARAM ) ) |
456 | 1 | equemene | { |
457 | 1 | equemene | HPL_pwarn( stderr, __LINE__, "HPL_pdinfo", "%s %s %d", |
458 | 1 | equemene | "Number of values of NBMIN",
|
459 | 1 | equemene | "is less than 1 or greater than", HPL_MAX_PARAM );
|
460 | 1 | equemene | error = 1; goto label_error; |
461 | 1 | equemene | } |
462 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); lineptr = line; |
463 | 1 | equemene | for( i = 0; i < *NBMS; i++ ) |
464 | 1 | equemene | { |
465 | 1 | equemene | (void) sscanf( lineptr, "%s", num ); lineptr += strlen( num ) + 1; |
466 | 1 | equemene | if( ( NBM[ i ] = atoi( num ) ) < 1 ) |
467 | 1 | equemene | { |
468 | 1 | equemene | HPL_pwarn( stderr, __LINE__, "HPL_pdinfo",
|
469 | 1 | equemene | "Value of NBMIN less than 1" );
|
470 | 1 | equemene | error = 1; goto label_error; |
471 | 1 | equemene | } |
472 | 1 | equemene | } |
473 | 1 | equemene | /*
|
474 | 1 | equemene | * Number of panels in recursion (>=2) (NDV)
|
475 | 1 | equemene | */
|
476 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); |
477 | 1 | equemene | (void) sscanf( line, "%s", num ); *NDVS = atoi( num ); |
478 | 1 | equemene | if( ( *NDVS < 1 ) || ( *NDVS > HPL_MAX_PARAM ) ) |
479 | 1 | equemene | { |
480 | 1 | equemene | HPL_pwarn( stderr, __LINE__, "HPL_pdinfo", "%s %s %d", |
481 | 1 | equemene | "Number of values of NDIV",
|
482 | 1 | equemene | "is less than 1 or greater than", HPL_MAX_PARAM );
|
483 | 1 | equemene | error = 1; goto label_error; |
484 | 1 | equemene | } |
485 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); lineptr = line; |
486 | 1 | equemene | for( i = 0; i < *NDVS; i++ ) |
487 | 1 | equemene | { |
488 | 1 | equemene | (void) sscanf( lineptr, "%s", num ); lineptr += strlen( num ) + 1; |
489 | 1 | equemene | if( ( NDV[ i ] = atoi( num ) ) < 2 ) |
490 | 1 | equemene | { |
491 | 1 | equemene | HPL_pwarn( stderr, __LINE__, "HPL_pdinfo",
|
492 | 1 | equemene | "Value of NDIV less than 2" );
|
493 | 1 | equemene | error = 1; goto label_error; |
494 | 1 | equemene | } |
495 | 1 | equemene | } |
496 | 1 | equemene | /*
|
497 | 1 | equemene | * Recursive panel factorization (RF)
|
498 | 1 | equemene | */
|
499 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); |
500 | 1 | equemene | (void) sscanf( line, "%s", num ); *NRFS = atoi( num ); |
501 | 1 | equemene | if( ( *NRFS < 1 ) || ( *NRFS > HPL_MAX_PARAM ) ) |
502 | 1 | equemene | { |
503 | 1 | equemene | HPL_pwarn( stderr, __LINE__, "HPL_pdinfo", "%s %s %d", |
504 | 1 | equemene | "Number of values of RFACT",
|
505 | 1 | equemene | "is less than 1 or greater than", HPL_MAX_PARAM );
|
506 | 1 | equemene | error = 1; goto label_error; |
507 | 1 | equemene | } |
508 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); lineptr = line; |
509 | 1 | equemene | for( i = 0; i < *NRFS; i++ ) |
510 | 1 | equemene | { |
511 | 1 | equemene | (void) sscanf( lineptr, "%s", num ); lineptr += strlen( num ) + 1; |
512 | 1 | equemene | j = atoi( num ); |
513 | 1 | equemene | if( j == 0 ) RF[ i ] = HPL_LEFT_LOOKING; |
514 | 1 | equemene | else if( j == 1 ) RF[ i ] = HPL_CROUT; |
515 | 1 | equemene | else if( j == 2 ) RF[ i ] = HPL_RIGHT_LOOKING; |
516 | 1 | equemene | else RF[ i ] = HPL_RIGHT_LOOKING;
|
517 | 1 | equemene | } |
518 | 1 | equemene | /*
|
519 | 1 | equemene | * Broadcast topology (TP) (0=rg, 1=2rg, 2=rgM, 3=2rgM, 4=L)
|
520 | 1 | equemene | */
|
521 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); |
522 | 1 | equemene | (void) sscanf( line, "%s", num ); *NTPS = atoi( num ); |
523 | 1 | equemene | if( ( *NTPS < 1 ) || ( *NTPS > HPL_MAX_PARAM ) ) |
524 | 1 | equemene | { |
525 | 1 | equemene | HPL_pwarn( stderr, __LINE__, "HPL_pdinfo", "%s %s %d", |
526 | 1 | equemene | "Number of values of BCAST",
|
527 | 1 | equemene | "is less than 1 or greater than", HPL_MAX_PARAM );
|
528 | 1 | equemene | error = 1; goto label_error; |
529 | 1 | equemene | } |
530 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); lineptr = line; |
531 | 1 | equemene | for( i = 0; i < *NTPS; i++ ) |
532 | 1 | equemene | { |
533 | 1 | equemene | (void) sscanf( lineptr, "%s", num ); lineptr += strlen( num ) + 1; |
534 | 1 | equemene | j = atoi( num ); |
535 | 1 | equemene | if( j == 0 ) TP[ i ] = HPL_1RING; |
536 | 1 | equemene | else if( j == 1 ) TP[ i ] = HPL_1RING_M; |
537 | 1 | equemene | else if( j == 2 ) TP[ i ] = HPL_2RING; |
538 | 1 | equemene | else if( j == 3 ) TP[ i ] = HPL_2RING_M; |
539 | 1 | equemene | else if( j == 4 ) TP[ i ] = HPL_BLONG; |
540 | 1 | equemene | else if( j == 5 ) TP[ i ] = HPL_BLONG_M; |
541 | 1 | equemene | else TP[ i ] = HPL_1RING_M;
|
542 | 1 | equemene | } |
543 | 1 | equemene | /*
|
544 | 1 | equemene | * Lookahead depth (>=0) (NDH)
|
545 | 1 | equemene | */
|
546 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); |
547 | 1 | equemene | (void) sscanf( line, "%s", num ); *NDHS = atoi( num ); |
548 | 1 | equemene | if( ( *NDHS < 1 ) || ( *NDHS > HPL_MAX_PARAM ) ) |
549 | 1 | equemene | { |
550 | 1 | equemene | HPL_pwarn( stderr, __LINE__, "HPL_pdinfo", "%s %s %d", |
551 | 1 | equemene | "Number of values of DEPTH",
|
552 | 1 | equemene | "is less than 1 or greater than", HPL_MAX_PARAM );
|
553 | 1 | equemene | error = 1; goto label_error; |
554 | 1 | equemene | } |
555 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); lineptr = line; |
556 | 1 | equemene | for( i = 0; i < *NDHS; i++ ) |
557 | 1 | equemene | { |
558 | 1 | equemene | (void) sscanf( lineptr, "%s", num ); |
559 | 1 | equemene | lineptr += strlen( num ) + 1;
|
560 | 1 | equemene | if( ( DH[ i ] = atoi( num ) ) < 0 ) |
561 | 1 | equemene | { |
562 | 1 | equemene | HPL_pwarn( stderr, __LINE__, "HPL_pdinfo",
|
563 | 1 | equemene | "Value of DEPTH less than 0" );
|
564 | 1 | equemene | error = 1; goto label_error; |
565 | 1 | equemene | } |
566 | 1 | equemene | } |
567 | 1 | equemene | /*
|
568 | 1 | equemene | * Swapping algorithm (0,1 or 2) (FSWAP)
|
569 | 1 | equemene | */
|
570 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); |
571 | 1 | equemene | (void) sscanf( line, "%s", num ); j = atoi( num ); |
572 | 1 | equemene | if( j == 0 ) *FSWAP = HPL_SWAP00; |
573 | 1 | equemene | else if( j == 1 ) *FSWAP = HPL_SWAP01; |
574 | 1 | equemene | else if( j == 2 ) *FSWAP = HPL_SW_MIX; |
575 | 1 | equemene | else *FSWAP = HPL_SWAP01;
|
576 | 1 | equemene | /*
|
577 | 1 | equemene | * Swapping threshold (>=0) (TSWAP)
|
578 | 1 | equemene | */
|
579 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); |
580 | 1 | equemene | (void) sscanf( line, "%s", num ); *TSWAP = atoi( num ); |
581 | 1 | equemene | if( *TSWAP <= 0 ) *TSWAP = 0; |
582 | 1 | equemene | /*
|
583 | 1 | equemene | * L1 in (no-)transposed form (0 or 1)
|
584 | 1 | equemene | */
|
585 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); |
586 | 1 | equemene | (void) sscanf( line, "%s", num ); *L1NOTRAN = atoi( num ); |
587 | 1 | equemene | if( ( *L1NOTRAN != 0 ) && ( *L1NOTRAN != 1 ) ) *L1NOTRAN = 0; |
588 | 1 | equemene | /*
|
589 | 1 | equemene | * U in (no-)transposed form (0 or 1)
|
590 | 1 | equemene | */
|
591 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); |
592 | 1 | equemene | (void) sscanf( line, "%s", num ); *UNOTRAN = atoi( num ); |
593 | 1 | equemene | if( ( *UNOTRAN != 0 ) && ( *UNOTRAN != 1 ) ) *UNOTRAN = 0; |
594 | 1 | equemene | /*
|
595 | 1 | equemene | * Equilibration (0=no, 1=yes)
|
596 | 1 | equemene | */
|
597 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); |
598 | 1 | equemene | (void) sscanf( line, "%s", num ); *EQUIL = atoi( num ); |
599 | 1 | equemene | if( ( *EQUIL != 0 ) && ( *EQUIL != 1 ) ) *EQUIL = 1; |
600 | 1 | equemene | /*
|
601 | 1 | equemene | * Memory alignment in bytes (> 0) (ALIGN)
|
602 | 1 | equemene | */
|
603 | 1 | equemene | (void) fgets( line, HPL_LINE_MAX - 2, infp ); |
604 | 1 | equemene | (void) sscanf( line, "%s", num ); *ALIGN = atoi( num ); |
605 | 1 | equemene | if( *ALIGN <= 0 ) *ALIGN = 4; |
606 | 1 | equemene | /*
|
607 | 1 | equemene | * Close input file
|
608 | 1 | equemene | */
|
609 | 1 | equemene | label_error:
|
610 | 1 | equemene | (void) fclose( infp );
|
611 | 1 | equemene | } |
612 | 1 | equemene | else { TEST->outfp = NULL; } |
613 | 1 | equemene | /*
|
614 | 1 | equemene | * Check for error on reading input file
|
615 | 1 | equemene | */
|
616 | 1 | equemene | (void) HPL_all_reduce( (void *)(&error), 1, HPL_INT, HPL_max, |
617 | 1 | equemene | MPI_COMM_WORLD ); |
618 | 1 | equemene | if( error )
|
619 | 1 | equemene | { |
620 | 1 | equemene | if( rank == 0 ) |
621 | 1 | equemene | HPL_pwarn( stderr, __LINE__, "HPL_pdinfo",
|
622 | 1 | equemene | "Illegal input in file HPL.dat. Exiting ..." );
|
623 | 1 | equemene | MPI_Finalize(); |
624 | 1 | equemene | #ifdef HPL_CALL_VSIPL
|
625 | 1 | equemene | (void) vsip_finalize( NULL ); |
626 | 1 | equemene | #endif
|
627 | 1 | equemene | exit( 1 );
|
628 | 1 | equemene | } |
629 | 1 | equemene | /*
|
630 | 1 | equemene | * Compute and broadcast machine epsilon
|
631 | 1 | equemene | */
|
632 | 1 | equemene | TEST->epsil = HPL_pdlamch( MPI_COMM_WORLD, HPL_MACH_EPS ); |
633 | 1 | equemene | /*
|
634 | 1 | equemene | * Pack information arrays and broadcast
|
635 | 1 | equemene | */
|
636 | 1 | equemene | (void) HPL_broadcast( (void *)(&(TEST->thrsh)), 1, HPL_DOUBLE, 0, |
637 | 1 | equemene | MPI_COMM_WORLD ); |
638 | 1 | equemene | /*
|
639 | 1 | equemene | * Broadcast array sizes
|
640 | 1 | equemene | */
|
641 | 1 | equemene | iwork = (int *)malloc( (size_t)(15) * sizeof( int ) ); |
642 | 1 | equemene | if( rank == 0 ) |
643 | 1 | equemene | { |
644 | 1 | equemene | iwork[ 0] = *NS; iwork[ 1] = *NBS; |
645 | 1 | equemene | iwork[ 2] = ( *PMAPPIN == HPL_ROW_MAJOR ? 0 : 1 ); |
646 | 1 | equemene | iwork[ 3] = *NPQS; iwork[ 4] = *NPFS; iwork[ 5] = *NBMS; |
647 | 1 | equemene | iwork[ 6] = *NDVS; iwork[ 7] = *NRFS; iwork[ 8] = *NTPS; |
648 | 1 | equemene | iwork[ 9] = *NDHS; iwork[10] = *TSWAP; iwork[11] = *L1NOTRAN; |
649 | 1 | equemene | iwork[12] = *UNOTRAN; iwork[13] = *EQUIL; iwork[14] = *ALIGN; |
650 | 1 | equemene | } |
651 | 1 | equemene | (void) HPL_broadcast( (void *)iwork, 15, HPL_INT, 0, MPI_COMM_WORLD ); |
652 | 1 | equemene | if( rank != 0 ) |
653 | 1 | equemene | { |
654 | 1 | equemene | *NS = iwork[ 0]; *NBS = iwork[ 1]; |
655 | 1 | equemene | *PMAPPIN = ( iwork[ 2] == 0 ? HPL_ROW_MAJOR : HPL_COLUMN_MAJOR ); |
656 | 1 | equemene | *NPQS = iwork[ 3]; *NPFS = iwork[ 4]; *NBMS = iwork[ 5]; |
657 | 1 | equemene | *NDVS = iwork[ 6]; *NRFS = iwork[ 7]; *NTPS = iwork[ 8]; |
658 | 1 | equemene | *NDHS = iwork[ 9]; *TSWAP = iwork[10]; *L1NOTRAN = iwork[11]; |
659 | 1 | equemene | *UNOTRAN = iwork[12]; *EQUIL = iwork[13]; *ALIGN = iwork[14]; |
660 | 1 | equemene | } |
661 | 1 | equemene | if( iwork ) free( iwork );
|
662 | 1 | equemene | /*
|
663 | 1 | equemene | * Pack information arrays and broadcast
|
664 | 1 | equemene | */
|
665 | 1 | equemene | lwork = (*NS) + (*NBS) + 2 * (*NPQS) + (*NPFS) + (*NBMS) +
|
666 | 1 | equemene | (*NDVS) + (*NRFS) + (*NTPS) + (*NDHS) + 1;
|
667 | 1 | equemene | iwork = (int *)malloc( (size_t)(lwork) * sizeof( int ) ); |
668 | 1 | equemene | if( rank == 0 ) |
669 | 1 | equemene | { |
670 | 1 | equemene | j = 0;
|
671 | 1 | equemene | for( i = 0; i < *NS; i++ ) { iwork[j] = N [i]; j++; } |
672 | 1 | equemene | for( i = 0; i < *NBS; i++ ) { iwork[j] = NB[i]; j++; } |
673 | 1 | equemene | for( i = 0; i < *NPQS; i++ ) { iwork[j] = P [i]; j++; } |
674 | 1 | equemene | for( i = 0; i < *NPQS; i++ ) { iwork[j] = Q [i]; j++; } |
675 | 1 | equemene | for( i = 0; i < *NPFS; i++ ) |
676 | 1 | equemene | { |
677 | 1 | equemene | if( PF[i] == HPL_LEFT_LOOKING ) iwork[j] = 0; |
678 | 1 | equemene | else if( PF[i] == HPL_CROUT ) iwork[j] = 1; |
679 | 1 | equemene | else if( PF[i] == HPL_RIGHT_LOOKING ) iwork[j] = 2; |
680 | 1 | equemene | j++; |
681 | 1 | equemene | } |
682 | 1 | equemene | for( i = 0; i < *NBMS; i++ ) { iwork[j] = NBM[i]; j++; } |
683 | 1 | equemene | for( i = 0; i < *NDVS; i++ ) { iwork[j] = NDV[i]; j++; } |
684 | 1 | equemene | for( i = 0; i < *NRFS; i++ ) |
685 | 1 | equemene | { |
686 | 1 | equemene | if( RF[i] == HPL_LEFT_LOOKING ) iwork[j] = 0; |
687 | 1 | equemene | else if( RF[i] == HPL_CROUT ) iwork[j] = 1; |
688 | 1 | equemene | else if( RF[i] == HPL_RIGHT_LOOKING ) iwork[j] = 2; |
689 | 1 | equemene | j++; |
690 | 1 | equemene | } |
691 | 1 | equemene | for( i = 0; i < *NTPS; i++ ) |
692 | 1 | equemene | { |
693 | 1 | equemene | if( TP[i] == HPL_1RING ) iwork[j] = 0; |
694 | 1 | equemene | else if( TP[i] == HPL_1RING_M ) iwork[j] = 1; |
695 | 1 | equemene | else if( TP[i] == HPL_2RING ) iwork[j] = 2; |
696 | 1 | equemene | else if( TP[i] == HPL_2RING_M ) iwork[j] = 3; |
697 | 1 | equemene | else if( TP[i] == HPL_BLONG ) iwork[j] = 4; |
698 | 1 | equemene | else if( TP[i] == HPL_BLONG_M ) iwork[j] = 5; |
699 | 1 | equemene | j++; |
700 | 1 | equemene | } |
701 | 1 | equemene | for( i = 0; i < *NDHS; i++ ) { iwork[j] = DH[i]; j++; } |
702 | 1 | equemene | |
703 | 1 | equemene | if( *FSWAP == HPL_SWAP00 ) iwork[j] = 0; |
704 | 1 | equemene | else if( *FSWAP == HPL_SWAP01 ) iwork[j] = 1; |
705 | 1 | equemene | else if( *FSWAP == HPL_SW_MIX ) iwork[j] = 2; |
706 | 1 | equemene | j++; |
707 | 1 | equemene | } |
708 | 1 | equemene | (void) HPL_broadcast( (void*)iwork, lwork, HPL_INT, 0, |
709 | 1 | equemene | MPI_COMM_WORLD ); |
710 | 1 | equemene | if( rank != 0 ) |
711 | 1 | equemene | { |
712 | 1 | equemene | j = 0;
|
713 | 1 | equemene | for( i = 0; i < *NS; i++ ) { N [i] = iwork[j]; j++; } |
714 | 1 | equemene | for( i = 0; i < *NBS; i++ ) { NB[i] = iwork[j]; j++; } |
715 | 1 | equemene | for( i = 0; i < *NPQS; i++ ) { P [i] = iwork[j]; j++; } |
716 | 1 | equemene | for( i = 0; i < *NPQS; i++ ) { Q [i] = iwork[j]; j++; } |
717 | 1 | equemene | |
718 | 1 | equemene | for( i = 0; i < *NPFS; i++ ) |
719 | 1 | equemene | { |
720 | 1 | equemene | if( iwork[j] == 0 ) PF[i] = HPL_LEFT_LOOKING; |
721 | 1 | equemene | else if( iwork[j] == 1 ) PF[i] = HPL_CROUT; |
722 | 1 | equemene | else if( iwork[j] == 2 ) PF[i] = HPL_RIGHT_LOOKING; |
723 | 1 | equemene | j++; |
724 | 1 | equemene | } |
725 | 1 | equemene | for( i = 0; i < *NBMS; i++ ) { NBM[i] = iwork[j]; j++; } |
726 | 1 | equemene | for( i = 0; i < *NDVS; i++ ) { NDV[i] = iwork[j]; j++; } |
727 | 1 | equemene | for( i = 0; i < *NRFS; i++ ) |
728 | 1 | equemene | { |
729 | 1 | equemene | if( iwork[j] == 0 ) RF[i] = HPL_LEFT_LOOKING; |
730 | 1 | equemene | else if( iwork[j] == 1 ) RF[i] = HPL_CROUT; |
731 | 1 | equemene | else if( iwork[j] == 2 ) RF[i] = HPL_RIGHT_LOOKING; |
732 | 1 | equemene | j++; |
733 | 1 | equemene | } |
734 | 1 | equemene | for( i = 0; i < *NTPS; i++ ) |
735 | 1 | equemene | { |
736 | 1 | equemene | if( iwork[j] == 0 ) TP[i] = HPL_1RING; |
737 | 1 | equemene | else if( iwork[j] == 1 ) TP[i] = HPL_1RING_M; |
738 | 1 | equemene | else if( iwork[j] == 2 ) TP[i] = HPL_2RING; |
739 | 1 | equemene | else if( iwork[j] == 3 ) TP[i] = HPL_2RING_M; |
740 | 1 | equemene | else if( iwork[j] == 4 ) TP[i] = HPL_BLONG; |
741 | 1 | equemene | else if( iwork[j] == 5 ) TP[i] = HPL_BLONG_M; |
742 | 1 | equemene | j++; |
743 | 1 | equemene | } |
744 | 1 | equemene | for( i = 0; i < *NDHS; i++ ) { DH[i] = iwork[j]; j++; } |
745 | 1 | equemene | |
746 | 1 | equemene | if( iwork[j] == 0 ) *FSWAP = HPL_SWAP00; |
747 | 1 | equemene | else if( iwork[j] == 1 ) *FSWAP = HPL_SWAP01; |
748 | 1 | equemene | else if( iwork[j] == 2 ) *FSWAP = HPL_SW_MIX; |
749 | 1 | equemene | j++; |
750 | 1 | equemene | } |
751 | 1 | equemene | if( iwork ) free( iwork );
|
752 | 1 | equemene | /*
|
753 | 1 | equemene | * regurgitate input
|
754 | 1 | equemene | */
|
755 | 1 | equemene | if( rank == 0 ) |
756 | 1 | equemene | { |
757 | 1 | equemene | HPL_fprintf( TEST->outfp, "%s%s\n",
|
758 | 1 | equemene | "========================================",
|
759 | 1 | equemene | "========================================" );
|
760 | 1 | equemene | HPL_fprintf( TEST->outfp, "%s%s\n",
|
761 | 1 | equemene | "HPLinpack 2.0 -- High-Performance Linpack benchmark -- ",
|
762 | 1 | equemene | " September 10, 2008" );
|
763 | 1 | equemene | HPL_fprintf( TEST->outfp, "%s%s\n",
|
764 | 1 | equemene | "Written by A. Petitet and R. Clint Whaley, ",
|
765 | 1 | equemene | "Innovative Computing Laboratory, UTK" );
|
766 | 1 | equemene | HPL_fprintf( TEST->outfp, "%s%s\n",
|
767 | 1 | equemene | "Modified by Piotr Luszczek, ",
|
768 | 1 | equemene | "Innovative Computing Laboratory, UTK" );
|
769 | 1 | equemene | HPL_fprintf( TEST->outfp, "%s%s\n",
|
770 | 1 | equemene | "Modified by Julien Langou, ",
|
771 | 1 | equemene | "University of Colorado Denver");
|
772 | 1 | equemene | HPL_fprintf( TEST->outfp, "%s%s\n",
|
773 | 1 | equemene | "========================================",
|
774 | 1 | equemene | "========================================" );
|
775 | 1 | equemene | |
776 | 1 | equemene | HPL_fprintf( TEST->outfp, "\n%s\n",
|
777 | 1 | equemene | "An explanation of the input/output parameters follows:" );
|
778 | 1 | equemene | HPL_fprintf( TEST->outfp, "%s\n",
|
779 | 1 | equemene | "T/V : Wall time / encoded variant." );
|
780 | 1 | equemene | HPL_fprintf( TEST->outfp, "%s\n",
|
781 | 1 | equemene | "N : The order of the coefficient matrix A." );
|
782 | 1 | equemene | HPL_fprintf( TEST->outfp, "%s\n",
|
783 | 1 | equemene | "NB : The partitioning blocking factor." );
|
784 | 1 | equemene | HPL_fprintf( TEST->outfp, "%s\n",
|
785 | 1 | equemene | "P : The number of process rows." );
|
786 | 1 | equemene | HPL_fprintf( TEST->outfp, "%s\n",
|
787 | 1 | equemene | "Q : The number of process columns." );
|
788 | 1 | equemene | HPL_fprintf( TEST->outfp, "%s\n",
|
789 | 1 | equemene | "Time : Time in seconds to solve the linear system." );
|
790 | 1 | equemene | HPL_fprintf( TEST->outfp, "%s\n\n",
|
791 | 1 | equemene | "Gflops : Rate of execution for solving the linear system." );
|
792 | 1 | equemene | HPL_fprintf( TEST->outfp, "%s\n",
|
793 | 1 | equemene | "The following parameter values will be used:" );
|
794 | 1 | equemene | /*
|
795 | 1 | equemene | * Problem size
|
796 | 1 | equemene | */
|
797 | 1 | equemene | HPL_fprintf( TEST->outfp, "\nN :" );
|
798 | 1 | equemene | for( i = 0; i < Mmin( 8, *NS ); i++ ) |
799 | 1 | equemene | HPL_fprintf( TEST->outfp, "%8d ", N[i] );
|
800 | 1 | equemene | if( *NS > 8 ) |
801 | 1 | equemene | { |
802 | 1 | equemene | HPL_fprintf( TEST->outfp, "\n " );
|
803 | 1 | equemene | for( i = 8; i < Mmin( 16, *NS ); i++ ) |
804 | 1 | equemene | HPL_fprintf( TEST->outfp, "%8d ", N[i] );
|
805 | 1 | equemene | if( *NS > 16 ) |
806 | 1 | equemene | { |
807 | 1 | equemene | HPL_fprintf( TEST->outfp, "\n " );
|
808 | 1 | equemene | for( i = 16; i < *NS; i++ ) |
809 | 1 | equemene | HPL_fprintf( TEST->outfp, "%8d ", N[i] );
|
810 | 1 | equemene | } |
811 | 1 | equemene | } |
812 | 1 | equemene | /*
|
813 | 1 | equemene | * Distribution blocking factor
|
814 | 1 | equemene | */
|
815 | 1 | equemene | HPL_fprintf( TEST->outfp, "\nNB :" );
|
816 | 1 | equemene | for( i = 0; i < Mmin( 8, *NBS ); i++ ) |
817 | 1 | equemene | HPL_fprintf( TEST->outfp, "%8d ", NB[i] );
|
818 | 1 | equemene | if( *NBS > 8 ) |
819 | 1 | equemene | { |
820 | 1 | equemene | HPL_fprintf( TEST->outfp, "\n " );
|
821 | 1 | equemene | for( i = 8; i < Mmin( 16, *NBS ); i++ ) |
822 | 1 | equemene | HPL_fprintf( TEST->outfp, "%8d ", NB[i] );
|
823 | 1 | equemene | if( *NBS > 16 ) |
824 | 1 | equemene | { |
825 | 1 | equemene | HPL_fprintf( TEST->outfp, "\n " );
|
826 | 1 | equemene | for( i = 16; i < *NBS; i++ ) |
827 | 1 | equemene | HPL_fprintf( TEST->outfp, "%8d ", NB[i] );
|
828 | 1 | equemene | } |
829 | 1 | equemene | } |
830 | 1 | equemene | /*
|
831 | 1 | equemene | * Process mapping
|
832 | 1 | equemene | */
|
833 | 1 | equemene | HPL_fprintf( TEST->outfp, "\nPMAP :" );
|
834 | 1 | equemene | if( *PMAPPIN == HPL_ROW_MAJOR )
|
835 | 1 | equemene | HPL_fprintf( TEST->outfp, " Row-major process mapping" );
|
836 | 1 | equemene | else if( *PMAPPIN == HPL_COLUMN_MAJOR ) |
837 | 1 | equemene | HPL_fprintf( TEST->outfp, " Column-major process mapping" );
|
838 | 1 | equemene | /*
|
839 | 1 | equemene | * Process grid
|
840 | 1 | equemene | */
|
841 | 1 | equemene | HPL_fprintf( TEST->outfp, "\nP :" );
|
842 | 1 | equemene | for( i = 0; i < Mmin( 8, *NPQS ); i++ ) |
843 | 1 | equemene | HPL_fprintf( TEST->outfp, "%8d ", P[i] );
|
844 | 1 | equemene | if( *NPQS > 8 ) |
845 | 1 | equemene | { |
846 | 1 | equemene | HPL_fprintf( TEST->outfp, "\n " );
|
847 | 1 | equemene | for( i = 8; i < Mmin( 16, *NPQS ); i++ ) |
848 | 1 | equemene | HPL_fprintf( TEST->outfp, "%8d ", P[i] );
|
849 | 1 | equemene | if( *NPQS > 16 ) |
850 | 1 | equemene | { |
851 | 1 | equemene | HPL_fprintf( TEST->outfp, "\n " );
|
852 | 1 | equemene | for( i = 16; i < *NPQS; i++ ) |
853 | 1 | equemene | HPL_fprintf( TEST->outfp, "%8d ", P[i] );
|
854 | 1 | equemene | } |
855 | 1 | equemene | } |
856 | 1 | equemene | HPL_fprintf( TEST->outfp, "\nQ :" );
|
857 | 1 | equemene | for( i = 0; i < Mmin( 8, *NPQS ); i++ ) |
858 | 1 | equemene | HPL_fprintf( TEST->outfp, "%8d ", Q[i] );
|
859 | 1 | equemene | if( *NPQS > 8 ) |
860 | 1 | equemene | { |
861 | 1 | equemene | HPL_fprintf( TEST->outfp, "\n " );
|
862 | 1 | equemene | for( i = 8; i < Mmin( 16, *NPQS ); i++ ) |
863 | 1 | equemene | HPL_fprintf( TEST->outfp, "%8d ", Q[i] );
|
864 | 1 | equemene | if( *NPQS > 16 ) |
865 | 1 | equemene | { |
866 | 1 | equemene | HPL_fprintf( TEST->outfp, "\n " );
|
867 | 1 | equemene | for( i = 16; i < *NPQS; i++ ) |
868 | 1 | equemene | HPL_fprintf( TEST->outfp, "%8d ", Q[i] );
|
869 | 1 | equemene | } |
870 | 1 | equemene | } |
871 | 1 | equemene | /*
|
872 | 1 | equemene | * Panel Factorization
|
873 | 1 | equemene | */
|
874 | 1 | equemene | HPL_fprintf( TEST->outfp, "\nPFACT :" );
|
875 | 1 | equemene | for( i = 0; i < Mmin( 8, *NPFS ); i++ ) |
876 | 1 | equemene | { |
877 | 1 | equemene | if( PF[i] == HPL_LEFT_LOOKING )
|
878 | 1 | equemene | HPL_fprintf( TEST->outfp, " Left " );
|
879 | 1 | equemene | else if( PF[i] == HPL_CROUT ) |
880 | 1 | equemene | HPL_fprintf( TEST->outfp, " Crout " );
|
881 | 1 | equemene | else if( PF[i] == HPL_RIGHT_LOOKING ) |
882 | 1 | equemene | HPL_fprintf( TEST->outfp, " Right " );
|
883 | 1 | equemene | } |
884 | 1 | equemene | if( *NPFS > 8 ) |
885 | 1 | equemene | { |
886 | 1 | equemene | HPL_fprintf( TEST->outfp, "\n " );
|
887 | 1 | equemene | for( i = 8; i < Mmin( 16, *NPFS ); i++ ) |
888 | 1 | equemene | { |
889 | 1 | equemene | if( PF[i] == HPL_LEFT_LOOKING )
|
890 | 1 | equemene | HPL_fprintf( TEST->outfp, " Left " );
|
891 | 1 | equemene | else if( PF[i] == HPL_CROUT ) |
892 | 1 | equemene | HPL_fprintf( TEST->outfp, " Crout " );
|
893 | 1 | equemene | else if( PF[i] == HPL_RIGHT_LOOKING ) |
894 | 1 | equemene | HPL_fprintf( TEST->outfp, " Right " );
|
895 | 1 | equemene | } |
896 | 1 | equemene | if( *NPFS > 16 ) |
897 | 1 | equemene | { |
898 | 1 | equemene | HPL_fprintf( TEST->outfp, "\n " );
|
899 | 1 | equemene | for( i = 16; i < *NPFS; i++ ) |
900 | 1 | equemene | { |
901 | 1 | equemene | if( PF[i] == HPL_LEFT_LOOKING )
|
902 | 1 | equemene | HPL_fprintf( TEST->outfp, " Left " );
|
903 | 1 | equemene | else if( PF[i] == HPL_CROUT ) |
904 | 1 | equemene | HPL_fprintf( TEST->outfp, " Crout " );
|
905 | 1 | equemene | else if( PF[i] == HPL_RIGHT_LOOKING ) |
906 | 1 | equemene | HPL_fprintf( TEST->outfp, " Right " );
|
907 | 1 | equemene | } |
908 | 1 | equemene | } |
909 | 1 | equemene | } |
910 | 1 | equemene | /*
|
911 | 1 | equemene | * Recursive stopping criterium
|
912 | 1 | equemene | */
|
913 | 1 | equemene | HPL_fprintf( TEST->outfp, "\nNBMIN :" );
|
914 | 1 | equemene | for( i = 0; i < Mmin( 8, *NBMS ); i++ ) |
915 | 1 | equemene | HPL_fprintf( TEST->outfp, "%8d ", NBM[i] );
|
916 | 1 | equemene | if( *NBMS > 8 ) |
917 | 1 | equemene | { |
918 | 1 | equemene | HPL_fprintf( TEST->outfp, "\n " );
|
919 | 1 | equemene | for( i = 8; i < Mmin( 16, *NBMS ); i++ ) |
920 | 1 | equemene | HPL_fprintf( TEST->outfp, "%8d ", NBM[i] );
|
921 | 1 | equemene | if( *NBMS > 16 ) |
922 | 1 | equemene | { |
923 | 1 | equemene | HPL_fprintf( TEST->outfp, "\n " );
|
924 | 1 | equemene | for( i = 16; i < *NBMS; i++ ) |
925 | 1 | equemene | HPL_fprintf( TEST->outfp, "%8d ", NBM[i] );
|
926 | 1 | equemene | } |
927 | 1 | equemene | } |
928 | 1 | equemene | /*
|
929 | 1 | equemene | * Number of panels in recursion
|
930 | 1 | equemene | */
|
931 | 1 | equemene | HPL_fprintf( TEST->outfp, "\nNDIV :" );
|
932 | 1 | equemene | for( i = 0; i < Mmin( 8, *NDVS ); i++ ) |
933 | 1 | equemene | HPL_fprintf( TEST->outfp, "%8d ", NDV[i] );
|
934 | 1 | equemene | if( *NDVS > 8 ) |
935 | 1 | equemene | { |
936 | 1 | equemene | HPL_fprintf( TEST->outfp, "\n " );
|
937 | 1 | equemene | for( i = 8; i < Mmin( 16, *NDVS ); i++ ) |
938 | 1 | equemene | HPL_fprintf( TEST->outfp, "%8d ", NDV[i] );
|
939 | 1 | equemene | if( *NDVS > 16 ) |
940 | 1 | equemene | { |
941 | 1 | equemene | HPL_fprintf( TEST->outfp, "\n " );
|
942 | 1 | equemene | for( i = 16; i < *NDVS; i++ ) |
943 | 1 | equemene | HPL_fprintf( TEST->outfp, "%8d ", NDV[i] );
|
944 | 1 | equemene | } |
945 | 1 | equemene | } |
946 | 1 | equemene | /*
|
947 | 1 | equemene | * Recursive Factorization
|
948 | 1 | equemene | */
|
949 | 1 | equemene | HPL_fprintf( TEST->outfp, "\nRFACT :" );
|
950 | 1 | equemene | for( i = 0; i < Mmin( 8, *NRFS ); i++ ) |
951 | 1 | equemene | { |
952 | 1 | equemene | if( RF[i] == HPL_LEFT_LOOKING )
|
953 | 1 | equemene | HPL_fprintf( TEST->outfp, " Left " );
|
954 | 1 | equemene | else if( RF[i] == HPL_CROUT ) |
955 | 1 | equemene | HPL_fprintf( TEST->outfp, " Crout " );
|
956 | 1 | equemene | else if( RF[i] == HPL_RIGHT_LOOKING ) |
957 | 1 | equemene | HPL_fprintf( TEST->outfp, " Right " );
|
958 | 1 | equemene | } |
959 | 1 | equemene | if( *NRFS > 8 ) |
960 | 1 | equemene | { |
961 | 1 | equemene | HPL_fprintf( TEST->outfp, "\n " );
|
962 | 1 | equemene | for( i = 8; i < Mmin( 16, *NRFS ); i++ ) |
963 | 1 | equemene | { |
964 | 1 | equemene | if( RF[i] == HPL_LEFT_LOOKING )
|
965 | 1 | equemene | HPL_fprintf( TEST->outfp, " Left " );
|
966 | 1 | equemene | else if( RF[i] == HPL_CROUT ) |
967 | 1 | equemene | HPL_fprintf( TEST->outfp, " Crout " );
|
968 | 1 | equemene | else if( RF[i] == HPL_RIGHT_LOOKING ) |
969 | 1 | equemene | HPL_fprintf( TEST->outfp, " Right " );
|
970 | 1 | equemene | } |
971 | 1 | equemene | if( *NRFS > 16 ) |
972 | 1 | equemene | { |
973 | 1 | equemene | HPL_fprintf( TEST->outfp, "\n " );
|
974 | 1 | equemene | for( i = 16; i < *NRFS; i++ ) |
975 | 1 | equemene | { |
976 | 1 | equemene | if( RF[i] == HPL_LEFT_LOOKING )
|
977 | 1 | equemene | HPL_fprintf( TEST->outfp, " Left " );
|
978 | 1 | equemene | else if( RF[i] == HPL_CROUT ) |
979 | 1 | equemene | HPL_fprintf( TEST->outfp, " Crout " );
|
980 | 1 | equemene | else if( RF[i] == HPL_RIGHT_LOOKING ) |
981 | 1 | equemene | HPL_fprintf( TEST->outfp, " Right " );
|
982 | 1 | equemene | } |
983 | 1 | equemene | } |
984 | 1 | equemene | } |
985 | 1 | equemene | /*
|
986 | 1 | equemene | * Broadcast topology
|
987 | 1 | equemene | */
|
988 | 1 | equemene | HPL_fprintf( TEST->outfp, "\nBCAST :" );
|
989 | 1 | equemene | for( i = 0; i < Mmin( 8, *NTPS ); i++ ) |
990 | 1 | equemene | { |
991 | 1 | equemene | if( TP[i] == HPL_1RING )
|
992 | 1 | equemene | HPL_fprintf( TEST->outfp, " 1ring " );
|
993 | 1 | equemene | else if( TP[i] == HPL_1RING_M ) |
994 | 1 | equemene | HPL_fprintf( TEST->outfp, " 1ringM " );
|
995 | 1 | equemene | else if( TP[i] == HPL_2RING ) |
996 | 1 | equemene | HPL_fprintf( TEST->outfp, " 2ring " );
|
997 | 1 | equemene | else if( TP[i] == HPL_2RING_M ) |
998 | 1 | equemene | HPL_fprintf( TEST->outfp, " 2ringM " );
|
999 | 1 | equemene | else if( TP[i] == HPL_BLONG ) |
1000 | 1 | equemene | HPL_fprintf( TEST->outfp, " Blong " );
|
1001 | 1 | equemene | else if( TP[i] == HPL_BLONG_M ) |
1002 | 1 | equemene | HPL_fprintf( TEST->outfp, " BlongM " );
|
1003 | 1 | equemene | } |
1004 | 1 | equemene | if( *NTPS > 8 ) |
1005 | 1 | equemene | { |
1006 | 1 | equemene | HPL_fprintf( TEST->outfp, "\n " );
|
1007 | 1 | equemene | for( i = 8; i < Mmin( 16, *NTPS ); i++ ) |
1008 | 1 | equemene | { |
1009 | 1 | equemene | if( TP[i] == HPL_1RING )
|
1010 | 1 | equemene | HPL_fprintf( TEST->outfp, " 1ring " );
|
1011 | 1 | equemene | else if( TP[i] == HPL_1RING_M ) |
1012 | 1 | equemene | HPL_fprintf( TEST->outfp, " 1ringM " );
|
1013 | 1 | equemene | else if( TP[i] == HPL_2RING ) |
1014 | 1 | equemene | HPL_fprintf( TEST->outfp, " 2ring " );
|
1015 | 1 | equemene | else if( TP[i] == HPL_2RING_M ) |
1016 | 1 | equemene | HPL_fprintf( TEST->outfp, " 2ringM " );
|
1017 | 1 | equemene | else if( TP[i] == HPL_BLONG ) |
1018 | 1 | equemene | HPL_fprintf( TEST->outfp, " Blong " );
|
1019 | 1 | equemene | else if( TP[i] == HPL_BLONG_M ) |
1020 | 1 | equemene | HPL_fprintf( TEST->outfp, " BlongM " );
|
1021 | 1 | equemene | } |
1022 | 1 | equemene | if( *NTPS > 16 ) |
1023 | 1 | equemene | { |
1024 | 1 | equemene | HPL_fprintf( TEST->outfp, "\n " );
|
1025 | 1 | equemene | for( i = 16; i < *NTPS; i++ ) |
1026 | 1 | equemene | { |
1027 | 1 | equemene | if( TP[i] == HPL_1RING )
|
1028 | 1 | equemene | HPL_fprintf( TEST->outfp, " 1ring " );
|
1029 | 1 | equemene | else if( TP[i] == HPL_1RING_M ) |
1030 | 1 | equemene | HPL_fprintf( TEST->outfp, " 1ringM " );
|
1031 | 1 | equemene | else if( TP[i] == HPL_2RING ) |
1032 | 1 | equemene | HPL_fprintf( TEST->outfp, " 2ring " );
|
1033 | 1 | equemene | else if( TP[i] == HPL_2RING_M ) |
1034 | 1 | equemene | HPL_fprintf( TEST->outfp, " 2ringM " );
|
1035 | 1 | equemene | else if( TP[i] == HPL_BLONG ) |
1036 | 1 | equemene | HPL_fprintf( TEST->outfp, " Blong " );
|
1037 | 1 | equemene | else if( TP[i] == HPL_BLONG_M ) |
1038 | 1 | equemene | HPL_fprintf( TEST->outfp, " BlongM " );
|
1039 | 1 | equemene | } |
1040 | 1 | equemene | } |
1041 | 1 | equemene | } |
1042 | 1 | equemene | /*
|
1043 | 1 | equemene | * Lookahead depths
|
1044 | 1 | equemene | */
|
1045 | 1 | equemene | HPL_fprintf( TEST->outfp, "\nDEPTH :" );
|
1046 | 1 | equemene | for( i = 0; i < Mmin( 8, *NDHS ); i++ ) |
1047 | 1 | equemene | HPL_fprintf( TEST->outfp, "%8d ", DH[i] );
|
1048 | 1 | equemene | if( *NDHS > 8 ) |
1049 | 1 | equemene | { |
1050 | 1 | equemene | HPL_fprintf( TEST->outfp, "\n " );
|
1051 | 1 | equemene | for( i = 8; i < Mmin( 16, *NDHS ); i++ ) |
1052 | 1 | equemene | HPL_fprintf( TEST->outfp, "%8d ", DH[i] );
|
1053 | 1 | equemene | if( *NDHS > 16 ) |
1054 | 1 | equemene | { |
1055 | 1 | equemene | HPL_fprintf( TEST->outfp, "\n " );
|
1056 | 1 | equemene | for( i = 16; i < *NDHS; i++ ) |
1057 | 1 | equemene | HPL_fprintf( TEST->outfp, "%8d ", DH[i] );
|
1058 | 1 | equemene | } |
1059 | 1 | equemene | } |
1060 | 1 | equemene | /*
|
1061 | 1 | equemene | * Swapping algorithm
|
1062 | 1 | equemene | */
|
1063 | 1 | equemene | HPL_fprintf( TEST->outfp, "\nSWAP :" );
|
1064 | 1 | equemene | if( *FSWAP == HPL_SWAP00 )
|
1065 | 1 | equemene | HPL_fprintf( TEST->outfp, " Binary-exchange" );
|
1066 | 1 | equemene | else if( *FSWAP == HPL_SWAP01 ) |
1067 | 1 | equemene | HPL_fprintf( TEST->outfp, " Spread-roll (long)" );
|
1068 | 1 | equemene | else if( *FSWAP == HPL_SW_MIX ) |
1069 | 1 | equemene | HPL_fprintf( TEST->outfp, " Mix (threshold = %d)", *TSWAP );
|
1070 | 1 | equemene | /*
|
1071 | 1 | equemene | * L1 storage form
|
1072 | 1 | equemene | */
|
1073 | 1 | equemene | HPL_fprintf( TEST->outfp, "\nL1 :" );
|
1074 | 1 | equemene | if( *L1NOTRAN != 0 ) |
1075 | 1 | equemene | HPL_fprintf( TEST->outfp, " no-transposed form" );
|
1076 | 1 | equemene | else
|
1077 | 1 | equemene | HPL_fprintf( TEST->outfp, " transposed form" );
|
1078 | 1 | equemene | /*
|
1079 | 1 | equemene | * U storage form
|
1080 | 1 | equemene | */
|
1081 | 1 | equemene | HPL_fprintf( TEST->outfp, "\nU :" );
|
1082 | 1 | equemene | if( *UNOTRAN != 0 ) |
1083 | 1 | equemene | HPL_fprintf( TEST->outfp, " no-transposed form" );
|
1084 | 1 | equemene | else
|
1085 | 1 | equemene | HPL_fprintf( TEST->outfp, " transposed form" );
|
1086 | 1 | equemene | /*
|
1087 | 1 | equemene | * Equilibration
|
1088 | 1 | equemene | */
|
1089 | 1 | equemene | HPL_fprintf( TEST->outfp, "\nEQUIL :" );
|
1090 | 1 | equemene | if( *EQUIL != 0 ) |
1091 | 1 | equemene | HPL_fprintf( TEST->outfp, " yes" );
|
1092 | 1 | equemene | else
|
1093 | 1 | equemene | HPL_fprintf( TEST->outfp, " no" );
|
1094 | 1 | equemene | /*
|
1095 | 1 | equemene | * Alignment
|
1096 | 1 | equemene | */
|
1097 | 1 | equemene | HPL_fprintf( TEST->outfp, "\nALIGN : %d double precision words",
|
1098 | 1 | equemene | *ALIGN ); |
1099 | 1 | equemene | |
1100 | 1 | equemene | HPL_fprintf( TEST->outfp, "\n\n" );
|
1101 | 1 | equemene | /*
|
1102 | 1 | equemene | * For testing only
|
1103 | 1 | equemene | */
|
1104 | 1 | equemene | if( TEST->thrsh > HPL_rzero )
|
1105 | 1 | equemene | { |
1106 | 1 | equemene | HPL_fprintf( TEST->outfp, "%s%s\n\n",
|
1107 | 1 | equemene | "----------------------------------------",
|
1108 | 1 | equemene | "----------------------------------------" );
|
1109 | 1 | equemene | HPL_fprintf( TEST->outfp, "%s\n",
|
1110 | 1 | equemene | "- The matrix A is randomly generated for each test." );
|
1111 | 1 | equemene | HPL_fprintf( TEST->outfp, "%s\n",
|
1112 | 1 | equemene | "- The following scaled residual check will be computed:" );
|
1113 | 1 | equemene | HPL_fprintf( TEST->outfp, "%s\n",
|
1114 | 1 | equemene | " ||Ax-b||_oo / ( eps * ( || x ||_oo * || A ||_oo + || b ||_oo ) * N )" );
|
1115 | 1 | equemene | HPL_fprintf( TEST->outfp, "%s %21.6e\n",
|
1116 | 1 | equemene | "- The relative machine precision (eps) is taken to be ",
|
1117 | 1 | equemene | TEST->epsil ); |
1118 | 1 | equemene | HPL_fprintf( TEST->outfp, "%s %11.1f\n\n",
|
1119 | 1 | equemene | "- Computational tests pass if scaled residuals are less than ",
|
1120 | 1 | equemene | TEST->thrsh ); |
1121 | 1 | equemene | } |
1122 | 1 | equemene | } |
1123 | 1 | equemene | /*
|
1124 | 1 | equemene | * End of HPL_pdinfo
|
1125 | 1 | equemene | */
|
1126 | 1 | equemene | } |