Statistiques
| Révision :

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
}