Statistiques
| Révision :

root / testing / ptest / HPL_pddriver.c

Historique | Voir | Annoter | Télécharger (11,84 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
int main
54 1 equemene
(
55 1 equemene
   int                        ARGC,
56 1 equemene
   char                       * * ARGV
57 1 equemene
)
58 1 equemene
#else
59 1 equemene
int main( ARGC, ARGV )
60 1 equemene
/*
61 1 equemene
 * .. Scalar Arguments ..
62 1 equemene
 */
63 1 equemene
   int                        ARGC;
64 1 equemene
/*
65 1 equemene
 * .. Array Arguments ..
66 1 equemene
 */
67 1 equemene
   char                       * * ARGV;
68 1 equemene
#endif
69 1 equemene
{
70 1 equemene
/*
71 1 equemene
 * Purpose
72 1 equemene
 * =======
73 1 equemene
 *
74 1 equemene
 * main is the main driver program for testing the HPL routines.
75 1 equemene
 * This  program is  driven  by  a short data file named  "HPL.dat".
76 1 equemene
 *
77 1 equemene
 * ---------------------------------------------------------------------
78 1 equemene
 */
79 1 equemene
/*
80 1 equemene
 * .. Local Variables ..
81 1 equemene
 */
82 1 equemene
   int                        nval  [HPL_MAX_PARAM],
83 1 equemene
                              nbval [HPL_MAX_PARAM],
84 1 equemene
                              pval  [HPL_MAX_PARAM],
85 1 equemene
                              qval  [HPL_MAX_PARAM],
86 1 equemene
                              nbmval[HPL_MAX_PARAM],
87 1 equemene
                              ndvval[HPL_MAX_PARAM],
88 1 equemene
                              ndhval[HPL_MAX_PARAM];
89 1 equemene
90 1 equemene
   HPL_T_FACT                 pfaval[HPL_MAX_PARAM],
91 1 equemene
                              rfaval[HPL_MAX_PARAM];
92 1 equemene
93 1 equemene
   HPL_T_TOP                  topval[HPL_MAX_PARAM];
94 1 equemene
95 1 equemene
   HPL_T_grid                 grid;
96 1 equemene
   HPL_T_palg                 algo;
97 1 equemene
   HPL_T_test                 test;
98 1 equemene
   int                        L1notran, Unotran, align, equil, in, inb,
99 1 equemene
                              inbm, indh, indv, ipfa, ipq, irfa, itop,
100 1 equemene
                              mycol, myrow, ns, nbs, nbms, ndhs, ndvs,
101 1 equemene
                              npcol, npfs, npqs, nprow, nrfs, ntps,
102 1 equemene
                              rank, size, tswap;
103 1 equemene
   HPL_T_ORDER                pmapping;
104 1 equemene
   HPL_T_FACT                 rpfa;
105 1 equemene
   HPL_T_SWAP                 fswap;
106 1 equemene
/* ..
107 1 equemene
 * .. Executable Statements ..
108 1 equemene
 */
109 1 equemene
   MPI_Init( &ARGC, &ARGV );
110 1 equemene
#ifdef HPL_CALL_VSIPL
111 1 equemene
   vsip_init((void*)0);
112 1 equemene
#endif
113 1 equemene
   MPI_Comm_rank( MPI_COMM_WORLD, &rank );
114 1 equemene
   MPI_Comm_size( MPI_COMM_WORLD, &size );
115 1 equemene
/*
116 1 equemene
 * Read and check validity of test parameters from input file
117 1 equemene
 *
118 1 equemene
 * HPL Version 1.0, Linpack benchmark input file
119 1 equemene
 * Your message here
120 1 equemene
 * HPL.out      output file name (if any)
121 1 equemene
 * 6            device out (6=stdout,7=stderr,file)
122 1 equemene
 * 4            # of problems sizes (N)
123 1 equemene
 * 29 30 34 35  Ns
124 1 equemene
 * 4            # of NBs
125 1 equemene
 * 1 2 3 4      NBs
126 1 equemene
 * 0            PMAP process mapping (0=Row-,1=Column-major)
127 1 equemene
 * 3            # of process grids (P x Q)
128 1 equemene
 * 2 1 4        Ps
129 1 equemene
 * 2 4 1        Qs
130 1 equemene
 * 16.0         threshold
131 1 equemene
 * 3            # of panel fact
132 1 equemene
 * 0 1 2        PFACTs (0=left, 1=Crout, 2=Right)
133 1 equemene
 * 2            # of recursive stopping criterium
134 1 equemene
 * 2 4          NBMINs (>= 1)
135 1 equemene
 * 1            # of panels in recursion
136 1 equemene
 * 2            NDIVs
137 1 equemene
 * 3            # of recursive panel fact.
138 1 equemene
 * 0 1 2        RFACTs (0=left, 1=Crout, 2=Right)
139 1 equemene
 * 1            # of broadcast
140 1 equemene
 * 0            BCASTs (0=1rg,1=1rM,2=2rg,3=2rM,4=Lng,5=LnM)
141 1 equemene
 * 1            # of lookahead depth
142 1 equemene
 * 0            DEPTHs (>=0)
143 1 equemene
 * 2            SWAP (0=bin-exch,1=long,2=mix)
144 1 equemene
 * 4            swapping threshold
145 1 equemene
 * 0            L1 in (0=transposed,1=no-transposed) form
146 1 equemene
 * 0            U  in (0=transposed,1=no-transposed) form
147 1 equemene
 * 1            Equilibration (0=no,1=yes)
148 1 equemene
 * 8            memory alignment in double (> 0)
149 1 equemene
 */
150 1 equemene
   HPL_pdinfo( &test, &ns, nval, &nbs, nbval, &pmapping, &npqs, pval, qval,
151 1 equemene
               &npfs, pfaval, &nbms, nbmval, &ndvs, ndvval, &nrfs, rfaval,
152 1 equemene
               &ntps, topval, &ndhs, ndhval, &fswap, &tswap, &L1notran,
153 1 equemene
               &Unotran, &equil, &align );
154 1 equemene
/*
155 1 equemene
 * Loop over different process grids - Define process grid. Go to bottom
156 1 equemene
 * of process grid loop if this case does not use my process.
157 1 equemene
 */
158 1 equemene
   for( ipq = 0; ipq < npqs; ipq++ )
159 1 equemene
   {
160 1 equemene
      (void) HPL_grid_init( MPI_COMM_WORLD, pmapping, pval[ipq], qval[ipq],
161 1 equemene
                            &grid );
162 1 equemene
      (void) HPL_grid_info( &grid, &nprow, &npcol, &myrow, &mycol );
163 1 equemene
164 1 equemene
      if( ( myrow < 0 ) || ( myrow >= nprow ) ||
165 1 equemene
          ( mycol < 0 ) || ( mycol >= npcol ) ) goto label_end_of_npqs;
166 1 equemene
167 1 equemene
      for( in = 0; in < ns; in++ )
168 1 equemene
      {                            /* Loop over various problem sizes */
169 1 equemene
       for( inb = 0; inb < nbs; inb++ )
170 1 equemene
       {                        /* Loop over various blocking factors */
171 1 equemene
        for( indh = 0; indh < ndhs; indh++ )
172 1 equemene
        {                       /* Loop over various lookahead depths */
173 1 equemene
         for( itop = 0; itop < ntps; itop++ )
174 1 equemene
         {                  /* Loop over various broadcast topologies */
175 1 equemene
          for( irfa = 0; irfa < nrfs; irfa++ )
176 1 equemene
          {             /* Loop over various recursive factorizations */
177 1 equemene
           for( ipfa = 0; ipfa < npfs; ipfa++ )
178 1 equemene
           {                /* Loop over various panel factorizations */
179 1 equemene
            for( inbm = 0; inbm < nbms; inbm++ )
180 1 equemene
            {        /* Loop over various recursive stopping criteria */
181 1 equemene
             for( indv = 0; indv < ndvs; indv++ )
182 1 equemene
             {          /* Loop over various # of panels in recursion */
183 1 equemene
/*
184 1 equemene
 * Set up the algorithm parameters
185 1 equemene
 */
186 1 equemene
              algo.btopo = topval[itop]; algo.depth = ndhval[indh];
187 1 equemene
              algo.nbmin = nbmval[inbm]; algo.nbdiv = ndvval[indv];
188 1 equemene
189 1 equemene
              algo.pfact = rpfa = pfaval[ipfa];
190 1 equemene
191 1 equemene
              if( L1notran != 0 )
192 1 equemene
              {
193 1 equemene
                 if( rpfa == HPL_LEFT_LOOKING ) algo.pffun = HPL_pdpanllN;
194 1 equemene
                 else if( rpfa == HPL_CROUT   ) algo.pffun = HPL_pdpancrN;
195 1 equemene
                 else                           algo.pffun = HPL_pdpanrlN;
196 1 equemene
197 1 equemene
                 algo.rfact = rpfa = rfaval[irfa];
198 1 equemene
                 if( rpfa == HPL_LEFT_LOOKING ) algo.rffun = HPL_pdrpanllN;
199 1 equemene
                 else if( rpfa == HPL_CROUT   ) algo.rffun = HPL_pdrpancrN;
200 1 equemene
                 else                           algo.rffun = HPL_pdrpanrlN;
201 1 equemene
202 1 equemene
                 if( Unotran != 0 ) algo.upfun = HPL_pdupdateNN;
203 1 equemene
                 else               algo.upfun = HPL_pdupdateNT;
204 1 equemene
              }
205 1 equemene
              else
206 1 equemene
              {
207 1 equemene
                 if( rpfa == HPL_LEFT_LOOKING ) algo.pffun = HPL_pdpanllT;
208 1 equemene
                 else if( rpfa == HPL_CROUT   ) algo.pffun = HPL_pdpancrT;
209 1 equemene
                 else                           algo.pffun = HPL_pdpanrlT;
210 1 equemene
211 1 equemene
                 algo.rfact = rpfa = rfaval[irfa];
212 1 equemene
                 if( rpfa == HPL_LEFT_LOOKING ) algo.rffun = HPL_pdrpanllT;
213 1 equemene
                 else if( rpfa == HPL_CROUT   ) algo.rffun = HPL_pdrpancrT;
214 1 equemene
                 else                           algo.rffun = HPL_pdrpanrlT;
215 1 equemene
216 1 equemene
                 if( Unotran != 0 ) algo.upfun = HPL_pdupdateTN;
217 1 equemene
                 else               algo.upfun = HPL_pdupdateTT;
218 1 equemene
              }
219 1 equemene
220 1 equemene
              algo.fswap = fswap; algo.fsthr = tswap;
221 1 equemene
              algo.equil = equil; algo.align = align;
222 1 equemene
223 1 equemene
              HPL_pdtest( &test, &grid, &algo, nval[in], nbval[inb] );
224 1 equemene
225 1 equemene
             }
226 1 equemene
            }
227 1 equemene
           }
228 1 equemene
          }
229 1 equemene
         }
230 1 equemene
        }
231 1 equemene
       }
232 1 equemene
      }
233 1 equemene
      (void) HPL_grid_exit( &grid );
234 1 equemene
label_end_of_npqs: ;
235 1 equemene
   }
236 1 equemene
/*
237 1 equemene
 * Print ending messages, close output file, exit.
238 1 equemene
 */
239 1 equemene
   if( rank == 0 )
240 1 equemene
   {
241 1 equemene
      test.ktest = test.kpass + test.kfail + test.kskip;
242 1 equemene
#ifndef HPL_DETAILED_TIMING
243 1 equemene
      HPL_fprintf( test.outfp, "%s%s\n",
244 1 equemene
                   "========================================",
245 1 equemene
                   "========================================" );
246 1 equemene
#else
247 1 equemene
      if( test.thrsh > HPL_rzero )
248 1 equemene
         HPL_fprintf( test.outfp, "%s%s\n",
249 1 equemene
                      "========================================",
250 1 equemene
                      "========================================" );
251 1 equemene
#endif
252 1 equemene
253 1 equemene
      HPL_fprintf( test.outfp, "\n%s %6d %s\n", "Finished", test.ktest,
254 1 equemene
                   "tests with the following results:" );
255 1 equemene
      if( test.thrsh > HPL_rzero )
256 1 equemene
      {
257 1 equemene
         HPL_fprintf( test.outfp, "         %6d %s\n", test.kpass,
258 1 equemene
                      "tests completed and passed residual checks," );
259 1 equemene
         HPL_fprintf( test.outfp, "         %6d %s\n", test.kfail,
260 1 equemene
                      "tests completed and failed residual checks," );
261 1 equemene
         HPL_fprintf( test.outfp, "         %6d %s\n", test.kskip,
262 1 equemene
                      "tests skipped because of illegal input values." );
263 1 equemene
      }
264 1 equemene
      else
265 1 equemene
      {
266 1 equemene
         HPL_fprintf( test.outfp, "         %6d %s\n", test.kpass,
267 1 equemene
                      "tests completed without checking," );
268 1 equemene
         HPL_fprintf( test.outfp, "         %6d %s\n", test.kskip,
269 1 equemene
                      "tests skipped because of illegal input values." );
270 1 equemene
      }
271 1 equemene
272 1 equemene
      HPL_fprintf( test.outfp, "%s%s\n",
273 1 equemene
                   "----------------------------------------",
274 1 equemene
                   "----------------------------------------" );
275 1 equemene
      HPL_fprintf( test.outfp, "\nEnd of Tests.\n" );
276 1 equemene
      HPL_fprintf( test.outfp, "%s%s\n",
277 1 equemene
                   "========================================",
278 1 equemene
                   "========================================" );
279 1 equemene
280 1 equemene
      if( ( test.outfp != stdout ) && ( test.outfp != stderr ) )
281 1 equemene
         (void) fclose( test.outfp );
282 1 equemene
   }
283 1 equemene
#ifdef HPL_CALL_VSIPL
284 1 equemene
   vsip_finalize((void*)0);
285 1 equemene
#endif
286 1 equemene
   MPI_Finalize();
287 1 equemene
   exit( 0 );
288 1 equemene
289 1 equemene
   return( 0 );
290 1 equemene
/*
291 1 equemene
 * End of main
292 1 equemene
 */
293 1 equemene
}