~ubuntu-branches/ubuntu/vivid/atlas/vivid

« back to all changes in this revision

Viewing changes to bin/l3blastst.c

  • Committer: Bazaar Package Importer
  • Author(s): Camm Maguire
  • Date: 2002-04-13 10:07:52 UTC
  • Revision ID: james.westby@ubuntu.com-20020413100752-va9zm0rd4gpurdkq
Tags: upstream-3.2.1ln
ImportĀ upstreamĀ versionĀ 3.2.1ln

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *             Automatically Tuned Linear Algebra Software v3.2
 
3
 *                      (C) Copyright 1998 Jeff Horner
 
4
 *
 
5
 * Code contributers : Jeff Horner, R. Clint Whaley
 
6
 *
 
7
 * Redistribution and use in source and binary forms, with or without
 
8
 * modification, are permitted provided that the following conditions
 
9
 * are met:
 
10
 *   1. Redistributions of source code must retain the above copyright
 
11
 *      notice, this list of conditions and the following disclaimer.
 
12
 *   2. Redistributions in binary form must reproduce the above copyright
 
13
 *      notice, this list of conditions, and the following disclaimer in the
 
14
 *      documentation and/or other materials provided with the distribution.
 
15
 *   3. The name of the University of Tennessee, the ATLAS group,
 
16
 *      or the names of its contributers may not be used to endorse
 
17
 *      or promote products derived from this software without specific
 
18
 *      written permission.
 
19
 *
 
20
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 
21
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 
22
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 
23
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE
 
24
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 
25
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 
26
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 
27
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 
28
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 
29
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 
30
 * POSSIBILITY OF SUCH DAMAGE.
 
31
 *
 
32
 */
 
33
/*
 
34
 * =====================================================================
 
35
 * Include files
 
36
 * =====================================================================
 
37
 */
 
38
#include <stdlib.h>
 
39
#include <stdio.h>
 
40
#include <string.h>
 
41
#include <assert.h>
 
42
#ifdef GCCWIN
 
43
   ___main(){} __main(){} MAIN__(){} _MAIN_(){}
 
44
   #ifndef isdigit
 
45
      #define isdigit(ch_) ( ((ch_)=='0')||((ch_)=='1')||((ch_)=='2')|| \
 
46
                             ((ch_)=='3')||((ch_)=='4')||((ch_)=='5')|| \
 
47
                             ((ch_)=='6')||((ch_)=='7')||((ch_)=='8')|| \
 
48
                             ((ch_)=='9') )
 
49
   #endif
 
50
#else
 
51
   #include <ctype.h>
 
52
#endif
 
53
 
 
54
#include "atlas_misc.h"
 
55
#include "atlas_tst.h"
 
56
/*
 
57
 * =====================================================================
 
58
 * #define macro constants
 
59
 * =====================================================================
 
60
 */
 
61
#define    MEGA                     1000000.0
 
62
#if defined( SREAL ) || defined( SCPLX )
 
63
#define    THRESH                        50.0f
 
64
#else
 
65
#define    THRESH                        50.0
 
66
#endif
 
67
 
 
68
#define    ATLAS_DEBUG
 
69
/*
 
70
 * =====================================================================
 
71
 * # macro functions
 
72
 * =====================================================================
 
73
 *
 
74
 * The following and mutually exclusive  macros  allow to select various
 
75
 * BLAS implementations to test the ATLAS implementation against:
 
76
 *
 
77
 *    USE_F77_BLAS     : Fortran 77 BLAS interface,
 
78
 *    USE_L3_REFERENCE : C ATLAS reference implementation,
 
79
 *
 
80
 * If none of these macros is defined at compile time, the  ATLAS imple-
 
81
 * mentation is to be tested against itself,  after all this is the only
 
82
 * version we are sure to have available.
 
83
 *
 
84
 * By default the mono-threaded  ATLAS  routines are tested. To test the
 
85
 * multi-threaded ATLAS routines, define the following macro:
 
86
 *    USE_L3_PTHREADS  : multi-threaded ATLAS implementation.
 
87
 */
 
88
#define USE_F77_BLAS
 
89
 
 
90
#ifdef ATL_USEPTHREADS
 
91
#define USE_L3_PTHREADS
 
92
#endif
 
93
 
 
94
/*
 
95
 * =====================================================================
 
96
 */
 
97
#if   defined( USE_F77_BLAS ) /* Trusted BLAS version to test against */
 
98
#define  TP3      Mjoin( PATL,   f77 )
 
99
#elif defined( USE_L3_REFERENCE )
 
100
#include "atlas_reflevel3.h"
 
101
#define  TP3      Mjoin( PATL,   ref )
 
102
#else /* defined( USE_L3_ATLAS ) */  /* use ATLAS itself !! (default) */
 
103
#include "atlas_level3.h"
 
104
#define  TP3      PATL
 
105
#endif
 
106
 
 
107
#define trusted_gemm(         TA, TB, M, N, K, al, A, lA, B, lB, be, C, lC) \
 
108
Mjoin( TP3, gemm  )(          TA, TB, M, N, K, al, A, lA, B, lB, be, C, lC)
 
109
#ifdef TCPLX
 
110
#define trusted_hemm( SI, UP,         M, N,    al, A, lA, B, lB, be, C, lC) \
 
111
Mjoin( TP3, hemm  )(  SI, UP,         M, N,    al, A, lA, B, lB, be, C, lC)
 
112
#define trusted_herk(     UP, TA,        N, K, al, A, lA,        be, C, lC) \
 
113
Mjoin( TP3, herk  )(      UP, TA,        N, K, al, A, lA,        be, C, lC)
 
114
#define trusted_her2k(    UP, TA,        N, K, al, A, lA, B, lB, be, C, lC) \
 
115
Mjoin( TP3, her2k )(      UP, TA,        N, K, al, A, lA, B, lB, be, C, lC)
 
116
#endif
 
117
#define trusted_symm( SI, UP,         M, N,    al, A, lA, B, lB, be, C, lC) \
 
118
Mjoin( TP3, symm  )(  SI, UP,         M, N,    al, A, lA, B, lB, be, C, lC)
 
119
#define trusted_syrk(     UP, TA,        N, K, al, A, lA,        be, C, lC) \
 
120
Mjoin( TP3, syrk  )(      UP, TA,        N, K, al, A, lA,        be, C, lC)
 
121
#define trusted_syr2k(    UP, TA,        N, K, al, A, lA, B, lB, be, C, lC) \
 
122
Mjoin( TP3, syr2k )(      UP, TA,        N, K, al, A, lA, B, lB, be, C, lC)
 
123
#define trusted_trmm( SI, UP, TA, DI, M, N,    al, A, lA,            B, lB) \
 
124
Mjoin( TP3, trmm  )(  SI, UP, TA, DI, M, N,    al, A, lA,            B, lB)
 
125
#define trusted_trsm( SI, UP, TA, DI, M, N,    al, A, lA,            B, lB) \
 
126
Mjoin( TP3, trsm  )(  SI, UP, TA, DI, M, N,    al, A, lA,            B, lB)
 
127
 
 
128
/*
 
129
 * ATLAS version of the BLAS to test.
 
130
 */
 
131
#if   defined( USE_L3_PTHREADS )
 
132
#include "atlas_pthreads.h"
 
133
#include "atlas_ptlvl3.h"
 
134
#define  AP3      Mjoin( PATL,   pt  )
 
135
#else
 
136
#include "atlas_level3.h"
 
137
#define  AP3      PATL
 
138
#endif
 
139
 
 
140
#define test_gemm(            TA, TB, M, N, K, al, A, lA, B, lB, be, C, lC) \
 
141
Mjoin( AP3, gemm  )(          TA, TB, M, N, K, al, A, lA, B, lB, be, C, lC)
 
142
#ifdef TCPLX
 
143
#define test_hemm(    SI, UP,         M, N,    al, A, lA, B, lB, be, C, lC) \
 
144
Mjoin( AP3, hemm  )(  SI, UP,         M, N,    al, A, lA, B, lB, be, C, lC)
 
145
#define test_herk(        UP, TA,        N, K, al, A, lA,        be, C, lC) \
 
146
Mjoin( AP3, herk  )(      UP, TA,        N, K, al, A, lA,        be, C, lC)
 
147
#define test_her2k(       UP, TA,        N, K, al, A, lA, B, lB, be, C, lC) \
 
148
Mjoin( AP3, her2k )(      UP, TA,        N, K, al, A, lA, B, lB, be, C, lC)
 
149
#endif
 
150
#define test_symm(    SI, UP,         M, N,    al, A, lA, B, lB, be, C, lC) \
 
151
Mjoin( AP3, symm  )(  SI, UP,         M, N,    al, A, lA, B, lB, be, C, lC)
 
152
#define test_syrk(        UP, TA,        N, K, al, A, lA,        be, C, lC) \
 
153
Mjoin( AP3, syrk  )(      UP, TA,        N, K, al, A, lA,        be, C, lC)
 
154
#define test_syr2k(       UP, TA,        N, K, al, A, lA, B, lB, be, C, lC) \
 
155
Mjoin( AP3, syr2k )(      UP, TA,        N, K, al, A, lA, B, lB, be, C, lC)
 
156
#define test_trmm(    SI, UP, TA, DI, M, N,    al, A, lA,            B, lB) \
 
157
Mjoin( AP3, trmm  )(  SI, UP, TA, DI, M, N,    al, A, lA,            B, lB)
 
158
#define test_trsm(    SI, UP, TA, DI, M, N,    al, A, lA,            B, lB) \
 
159
Mjoin( AP3, trsm  )(  SI, UP, TA, DI, M, N,    al, A, lA,            B, lB)
 
160
 
 
161
/*
 
162
 * =====================================================================
 
163
 * macro functions
 
164
 * =====================================================================
 
165
 */
 
166
#ifdef TCPLX
 
167
#define Mabs1(X) (Mabs(*X) + Mabs(*(X+1)))
 
168
#else
 
169
#define Mabs1(X) (Mabs(X))
 
170
#endif
 
171
 
 
172
#ifdef  ATL_NTHREADS
 
173
#define LCSIZE          ATL_NTHREADS * L2SIZE
 
174
#else
 
175
#define LCSIZE          L2SIZE
 
176
#endif
 
177
/*
 
178
 * =====================================================================
 
179
 * typedef definitions
 
180
 * =====================================================================
 
181
 */
 
182
#ifdef TREAL
 
183
enum LVL3_ROUT { GEMM=0, SYMM, SYRK, SYR2K, TRMM, TRSM, ALLROUTS };
 
184
#else
 
185
enum LVL3_ROUT
 
186
{ GEMM=0, HEMM, HERK, HER2K, SYMM, SYRK, SYR2K, TRMM, TRSM, ALLROUTS };
 
187
#endif
 
188
/*
 
189
 * =====================================================================
 
190
 * Prototypes for the testing routines
 
191
 * =====================================================================
 
192
 */
 
193
double     opbl3
 
194
(  const enum LVL3_ROUT,           const int,      const int,
 
195
   const int );
 
196
void       trddom
 
197
(  const enum ATLAS_UPLO,          const int,      TYPE *,
 
198
   const int );
 
199
 
 
200
TYPE       gemmtst
 
201
(  const enum LVL3_ROUT,           const int,      const enum ATLAS_TRANS,
 
202
   const enum ATLAS_TRANS,         const int,      const int,
 
203
   const int,      const SCALAR,   const int,      const int,
 
204
   const SCALAR,   const int,      const TYPE,     double *,
 
205
   double *,       double *,       double * );
 
206
TYPE       symmtst
 
207
(  const enum LVL3_ROUT,           const int,      const enum ATLAS_SIDE,
 
208
   const enum ATLAS_UPLO,          const int,      const int,
 
209
   const SCALAR,   const int,      const int,      const SCALAR,
 
210
   const int,      const TYPE,     double *,       double *,
 
211
   double *,       double * );
 
212
TYPE       syr2ktst
 
213
(  const enum LVL3_ROUT,           const int,      const enum ATLAS_UPLO,
 
214
   const enum ATLAS_TRANS,         const int,      const int,
 
215
   const SCALAR,   const int,      const int,      const SCALAR,
 
216
   const int,      const TYPE,     double *,       double *,
 
217
   double *,       double * );
 
218
TYPE       syrktst
 
219
(  const enum LVL3_ROUT,           const int,      const enum ATLAS_UPLO,
 
220
   const enum ATLAS_TRANS,         const int,      const int,
 
221
   const SCALAR,   const int,      const SCALAR,   const int,
 
222
   const TYPE,     double *,       double *,       double *,
 
223
   double * );
 
224
TYPE       trmmtst
 
225
(  const enum LVL3_ROUT,           const int,      const enum ATLAS_SIDE,
 
226
   const enum ATLAS_UPLO,          const enum ATLAS_TRANS,
 
227
   const enum ATLAS_DIAG,          const int,      const int,
 
228
   const SCALAR,   const int,      const int,      const TYPE,
 
229
   double *,       double *,       double *,       double * );
 
230
TYPE       trsmtst
 
231
(  const enum LVL3_ROUT,           const int,      const enum ATLAS_SIDE,
 
232
   const enum ATLAS_UPLO,          const enum ATLAS_TRANS,
 
233
   const enum ATLAS_DIAG,          const int,      const int,
 
234
   const SCALAR,   const int,      const int,      const TYPE,
 
235
   double *,       double *,       double *,       double * );
 
236
 
 
237
int        gemmcase
 
238
(  const enum LVL3_ROUT,           const int,      const int,
 
239
   const enum ATLAS_TRANS,         const enum ATLAS_TRANS,
 
240
   const int,      const int,      const int,      const SCALAR,
 
241
   const int,      const int,      const SCALAR,   const int,
 
242
   const TYPE,     double *,       double *,       double *,
 
243
   double * );
 
244
int        symmcase
 
245
(  const enum LVL3_ROUT,           const int,      const int,
 
246
   const enum ATLAS_SIDE,          const enum ATLAS_UPLO,
 
247
   const int,      const int,      const SCALAR,   const int,
 
248
   const int,      const SCALAR,   const int,      const TYPE,
 
249
   double *,       double *,       double *,       double * );
 
250
int        syr2kcase
 
251
(  const enum LVL3_ROUT,           const int,      const int,
 
252
   const enum ATLAS_UPLO,          const enum ATLAS_TRANS,
 
253
   const int,      const int,      const SCALAR,   const int,
 
254
   const int,      const SCALAR,   const int,      const TYPE,
 
255
   double *,       double *,       double *,       double * );
 
256
int        syrkcase
 
257
(  const enum LVL3_ROUT,           const int,      const int,
 
258
   const enum ATLAS_UPLO,          const enum ATLAS_TRANS,
 
259
   const int,      const int,      const SCALAR,   const int,
 
260
   const SCALAR,   const int,      const TYPE,     double *,
 
261
   double *,       double *,       double * );
 
262
int        trxmcase
 
263
(  const enum LVL3_ROUT,           const int,      const int,
 
264
   const enum ATLAS_SIDE,          const enum ATLAS_UPLO,
 
265
   const enum ATLAS_TRANS,         const enum ATLAS_DIAG,
 
266
   const int,      const int,      const SCALAR,   const int,
 
267
   const int,      const TYPE,     double *,       double *,
 
268
   double *,       double * );
 
269
 
 
270
void       RungemmCase
 
271
(  const enum LVL3_ROUT,           const int,      const int,
 
272
   const int,      const int,      const enum ATLAS_TRANS *,
 
273
   const int,      const enum ATLAS_TRANS *,       int,
 
274
   int,            int,            int,            int,
 
275
   int,            int,            int,            int,
 
276
   const int,      const TYPE *,   const int,      const TYPE *,
 
277
   const TYPE,     int *,          int * );
 
278
void      RunsymmCase
 
279
(  const enum LVL3_ROUT,           const int,      const int,
 
280
   const int,      const int,      const enum ATLAS_SIDE *,
 
281
   const int,      const enum ATLAS_UPLO *,        int,
 
282
   int,            int,            int,            int,
 
283
   int,            const int,      const TYPE *,   const int,
 
284
   const TYPE *,   const TYPE,     int *,          int * );
 
285
void      Runsyr2kCase
 
286
(  const enum LVL3_ROUT,           const int,      const int,
 
287
   const int,      const int,      const enum ATLAS_UPLO *,
 
288
   const int,      const enum ATLAS_TRANS *,       int,
 
289
   int,            int,            int,            int,
 
290
   int,            const int,      const TYPE *,   const int,
 
291
   const TYPE *,   const TYPE,     int *,          int * );
 
292
void      RunsyrkCase
 
293
(  const enum LVL3_ROUT,           const int,      const int,
 
294
   const int,      const int,      const enum ATLAS_UPLO *,
 
295
   const int,      const enum ATLAS_TRANS *,       int,
 
296
   int,            int,            int,            int,
 
297
   int,            const int,      const TYPE *,   const int,
 
298
   const TYPE *,   const TYPE,     int *,          int * );
 
299
void      RuntrxmCase
 
300
(  const enum LVL3_ROUT,           const int,      const int,
 
301
   const int,      const int,      const enum ATLAS_SIDE *,
 
302
   const int,      const enum ATLAS_UPLO *,        const int,
 
303
   const enum ATLAS_TRANS *,       const int,      const enum ATLAS_DIAG *,
 
304
   int,            int,            int,            int,
 
305
   int,            int,            const int,      const TYPE *,
 
306
   const TYPE,     int *,          int * );
 
307
 
 
308
void       RunCases
 
309
(  const int,      const int,      const int,      const int,
 
310
   const enum ATLAS_SIDE *,        const int,      const enum ATLAS_UPLO *,
 
311
   const int,      const enum ATLAS_TRANS *,       const int,
 
312
   const enum ATLAS_TRANS *,       const int,      const enum ATLAS_DIAG *,
 
313
   const int,      const int,      const int,      const int,
 
314
   const int,      const int,      const int,      const int,
 
315
   const int,      const int,      const TYPE *,   const int,
 
316
   const TYPE *,   const int,      const enum LVL3_ROUT * );
 
317
 
 
318
void       PrintUsage
 
319
(  char * nam );
 
320
 
 
321
void       GetFlags
 
322
(  int,            char **,        int *,          enum LVL3_ROUT **,
 
323
   int *,          int *,          int *,          int *,
 
324
   enum ATLAS_SIDE **,             int *,          enum ATLAS_UPLO **,
 
325
   int *,          enum ATLAS_TRANS **,            int *,
 
326
   enum ATLAS_TRANS **,            int *,          enum ATLAS_DIAG **,
 
327
   int *,          int *,          int *,          int *,
 
328
   int *,          int *,          int *,          int *,
 
329
   int *,          int *,          TYPE **,        int *,
 
330
   TYPE ** );
 
331
 
 
332
int        main
 
333
(  int,            char ** );
 
334
/*
 
335
 * =====================================================================
 
336
 */
 
337
double opbl3
 
338
(
 
339
   const enum LVL3_ROUT       ROUT,
 
340
   const int                  M,
 
341
   const int                  N,
 
342
   const int                  K
 
343
)
 
344
{
 
345
   double                     adds = 0.0, em, en, ek, muls = 0.0;
 
346
/*
 
347
 * On entry,  M,  N,  and K contain parameter values used by the Level 3
 
348
 * BLAS.  The output matrix is always M x N or N x N if symmetric, but K
 
349
 * has different uses in different contexts. For example, in the matrix-
 
350
 * matrix multiply routine,  we  have C = A * B where  C is M x N,  A is
 
351
 * M x K, and B is K x N. In xSYMM, xHEMM, xTRMM, and xTRSM, K indicates
 
352
 * whether the matrix A is applied on the left or right.  If K <= 0, the
 
353
 * matrix is applied on the left, and if K > 0, on  the  right.
 
354
 */
 
355
   if( M <= 0 ) return( 0.0 );
 
356
 
 
357
   em = (double)(M); en = (double)(N); ek = (double)(K);
 
358
 
 
359
   if(      ROUT == GEMM ) { muls = em * ek * en; adds = em * ek * en; }
 
360
#ifdef TREAL
 
361
   else if( ROUT == SYMM )
 
362
#else
 
363
   else if( ( ROUT == SYMM ) || ( ROUT == HEMM ) )
 
364
#endif
 
365
   {                 /* If K <= 0, assume A multiplies B on the left. */
 
366
      if( K <= 0 ) { muls = em * em * en; adds = em * em * en; }
 
367
      else         { muls = em * en * en; adds = em * en * en; }
 
368
   }
 
369
   else if( ROUT == TRMM )
 
370
   {                 /* If K <= 0, assume A multiplies B on the left. */
 
371
      if( K <= 0 )
 
372
      {
 
373
         muls = en * em * ( em + 1.0 ) / 2.0;
 
374
         adds = en * em * ( em - 1.0 ) / 2.0;
 
375
      }
 
376
      else
 
377
      {
 
378
         muls = em * en * ( en + 1.0 ) / 2.0;
 
379
         adds = em * en * ( en - 1.0 ) / 2.0;
 
380
      }
 
381
   }
 
382
#ifdef TREAL
 
383
   else if( ROUT == SYRK )
 
384
#else
 
385
   else if( ( ROUT == SYRK ) || ( ROUT == HERK ) )
 
386
#endif
 
387
   {
 
388
      muls = ek * em * ( em + 1.0 ) / 2.0;
 
389
      adds = ek * em * ( em + 1.0 ) / 2.0;
 
390
   }
 
391
#ifdef TREAL
 
392
   else if( ROUT == SYR2K )
 
393
#else
 
394
   else if( ( ROUT == SYR2K ) || ( ROUT == HER2K ) )
 
395
#endif
 
396
   { muls = ek * em * em; adds = ek * em * em + em; }
 
397
   else if( ROUT == TRSM )
 
398
   {                 /* If K <= 0, assume A multiplies B on the left. */
 
399
      if( K <= 0 )
 
400
      {
 
401
         muls = en * em * ( em + 1.0 ) / 2.0;
 
402
         adds = en * em * ( em - 1.0 ) / 2.0;
 
403
      }
 
404
      else
 
405
      {
 
406
         muls = em * en * ( en + 1.0 ) / 2.0;
 
407
         adds = em * en * ( en - 1.0 ) / 2.0;
 
408
      }
 
409
   }
 
410
#ifdef TREAL
 
411
   return(       muls +       adds );
 
412
#else
 
413
   return( 6.0 * muls + 2.0 * adds );
 
414
#endif
 
415
}
 
416
 
 
417
void trddom
 
418
(
 
419
   const enum ATLAS_UPLO      UPLO,
 
420
   const int                  N,
 
421
   TYPE                       * A,
 
422
   const int                  LDA
 
423
)
 
424
{
 
425
/*
 
426
 * Scale strictly lower (resp. upper) part of triangular matrix by 1 / N
 
427
 * to make it diagonally dominant.
 
428
 */
 
429
   int                        i, iaij, j, jaj, lda2 = ( LDA SHIFT ),
 
430
                              ldap12 = (( LDA + 1 ) SHIFT);
 
431
   TYPE                       alpha;
 
432
 
 
433
   if( N <= 0 ) return;
 
434
 
 
435
   alpha = ATL_rone / (TYPE)(N);
 
436
 
 
437
   if( UPLO == AtlasUpper )
 
438
   {
 
439
      for( j = 0, jaj = 0; j < N; j++, jaj += lda2 )
 
440
      {
 
441
         for( i = 0, iaij = jaj; i < j; i++, iaij += (1 SHIFT) )
 
442
         {
 
443
            A[iaij  ] *= alpha;
 
444
#ifdef TCPLX
 
445
            A[iaij+1] *= alpha;
 
446
#endif
 
447
         }
 
448
         if( A[iaij  ] >= ATL_rzero ) A[iaij  ] += ATL_rone;
 
449
         else                         A[iaij  ] -= ATL_rone;
 
450
#ifdef TCPLX
 
451
         if( A[iaij+1] >= ATL_rzero ) A[iaij+1] += ATL_rone;
 
452
         else                         A[iaij+1] -= ATL_rone;
 
453
#endif
 
454
      }
 
455
   }
 
456
   else
 
457
   {
 
458
      for( j = N-1, jaj = (N-1)*ldap12; j >= 0; j--, jaj -= ldap12 )
 
459
      {
 
460
         if( A[jaj  ] >= ATL_rzero ) A[jaj  ] += ATL_rone;
 
461
         else                        A[jaj  ] -= ATL_rone;
 
462
#ifdef TCPLX
 
463
         if( A[jaj+1] >= ATL_rzero ) A[jaj+1] += ATL_rone;
 
464
         else                        A[jaj+1] -= ATL_rone;
 
465
#endif
 
466
         for( i = j+1, iaij = jaj+(1 SHIFT); i < N; i++, iaij += (1 SHIFT) )
 
467
         {
 
468
            A[iaij  ] *= alpha;
 
469
#ifdef TCPLX
 
470
            A[iaij+1] *= alpha;
 
471
#endif
 
472
         }
 
473
      }
 
474
   }
 
475
}
 
476
/*
 
477
 * =====================================================================
 
478
 * tst functions
 
479
 * =====================================================================
 
480
 */
 
481
TYPE gemmtst
 
482
(
 
483
   const enum LVL3_ROUT       ROUT,
 
484
   const int                  TEST,
 
485
   const enum ATLAS_TRANS     TRANSA,
 
486
   const enum ATLAS_TRANS     TRANSB,
 
487
   const int                  M,
 
488
   const int                  N,
 
489
   const int                  K,
 
490
   const SCALAR               ALPHA,
 
491
   const int                  LDA,
 
492
   const int                  LDB,
 
493
   const SCALAR               BETA,
 
494
   const int                  LDC,
 
495
   const TYPE                 EPSILON,
 
496
   double                     * TTRUST0,
 
497
   double                     * TTEST0,
 
498
   double                     * MFTRUST0,
 
499
   double                     * MFTEST0
 
500
)
 
501
{
 
502
   double                     l2ret, ops, t0, ttest, ttrust;
 
503
   TYPE                       normA, normB, normC, normD, resid;
 
504
   TYPE                       * A  = NULL, * B = NULL, * C = NULL, * C0,
 
505
                              * a, * b, * c;
 
506
   int                        mA, mB, nA, nB, Aseed, Bseed, Cseed;
 
507
 
 
508
   *TTRUST0 = *TTEST0 = *MFTEST0 = *MFTRUST0 = 0.0;
 
509
   if( ( M == 0 ) || ( N == 0 ) ) { return( ATL_rzero ); }
 
510
 
 
511
   if( TRANSA == AtlasNoTrans ) { mA = M; nA = K; }
 
512
   else                         { mA = K; nA = M; }
 
513
   if( TRANSB == AtlasNoTrans ) { mB = K; nB = N; }
 
514
   else                         { mB = N; nB = K; }
 
515
 
 
516
   ops = opbl3( ROUT, M, N, K );
 
517
/*
 
518
 * Allocate L2 cache space, A, X, Y and Y0
 
519
 */
 
520
   l2ret = ATL_flushcache( L2SIZE );
 
521
   A  = (TYPE *)malloc( ATL_MulBySize( LDA ) * nA     );
 
522
   B  = (TYPE *)malloc( ATL_MulBySize( LDB ) * nB     );
 
523
   C  = (TYPE *)malloc( ATL_MulBySize( LDC ) * N  * 2 );
 
524
 
 
525
   if( ( A == NULL ) || ( B == NULL ) || ( C == NULL ) )
 
526
   {
 
527
      l2ret = ATL_flushcache( 0 );
 
528
      if( A ) free( A );
 
529
      if( B ) free( B );
 
530
      if( C ) free( C );
 
531
      return( ATL_rnone );
 
532
   }
 
533
 
 
534
   C0 = C + LDC * ( N SHIFT );
 
535
/*
 
536
 * Generate random operands
 
537
 */
 
538
   Aseed = mA * nA + 513 *  7 + 90;
 
539
   Bseed = mB * nB + 127 * 50 + 77;
 
540
   Cseed = M  * N  + 101 *  2 + 53;
 
541
 
 
542
   Mjoin( PATL, gegen )( mA, nA, A,  LDA, Aseed );
 
543
   Mjoin( PATL, gegen )( mB, nB, B,  LDB, Bseed );
 
544
   Mjoin( PATL, gegen )( M,  N,  C,  LDC, Cseed );
 
545
   Mjoin( PATL, gegen )( M,  N,  C0, LDC, Cseed );
 
546
/*
 
547
 * Compute the norm of C for later use in testing
 
548
 */
 
549
   if( TEST )
 
550
   {
 
551
      normC = Mjoin( PATL, genrm1 )( M, N, C, LDC );
 
552
      if( Mabs1( BETA ) > ATL_rone ) normC *= Mabs1( BETA  );
 
553
      if( normC == ATL_rzero ) normC = ATL_rone;
 
554
   }
 
555
   else { normC = ATL_rone; }
 
556
/*
 
557
 * Start cold cache timing operations for the trusted routine
 
558
 */
 
559
   a = A; b = B; c = C0;
 
560
 
 
561
   l2ret  = ATL_flushcache( -1 );
 
562
   t0     = time00();
 
563
   trusted_gemm( TRANSA, TRANSB, M, N, K, ALPHA, a, LDA, b, LDB, BETA, c, LDC );
 
564
   ttrust = time00() - t0;
 
565
   if( ttrust > 0.0 )
 
566
   { *TTRUST0 = ttrust; *MFTRUST0 = ops / ( ttrust * MEGA ); }
 
567
/*
 
568
 * Start cold cache timing operations for the tested routine
 
569
 */
 
570
   a = A; b = B; c = C;
 
571
 
 
572
   l2ret  = ATL_flushcache( -1 );
 
573
   t0     = time00();
 
574
   test_gemm(    TRANSA, TRANSB, M, N, K, ALPHA, a, LDA, b, LDB, BETA, c, LDC );
 
575
   ttest  = time00() - t0;
 
576
   if( ttest  > 0.0 )
 
577
   { *TTEST0  = ttest;  *MFTEST0  = ops / ( ttest  * MEGA ); }
 
578
/*
 
579
 * if timing only, I am done ... so leave.
 
580
 */
 
581
   l2ret  = ATL_flushcache( 0 );
 
582
 
 
583
   if( !( TEST ) ) { free( A ); free( B ); free( C ); return( ATL_rzero ); }
 
584
/*
 
585
 * else perform error check
 
586
 */
 
587
   normA = Mjoin( PATL, genrm1 )( mA, nA, A, LDA );
 
588
   if( Mabs1( ALPHA ) > ATL_rone ) normA *= Mabs1( ALPHA );
 
589
   if( normA == ATL_rzero ) normA = ATL_rone;
 
590
   free( A  );
 
591
 
 
592
   normB = Mjoin( PATL, genrm1 )( mB, nB, B, LDB );
 
593
   if( normB == ATL_rzero ) normB = ATL_rone;
 
594
   free( B  );
 
595
/*
 
596
 * Ensure the difference of the output operands is relatively tiny enough
 
597
 */
 
598
   normD = Mjoin( PATL, gediffnrm1 )( M, N, C, LDC, C0, LDC );
 
599
   resid = normD / ( Mmax( normA, ATL_rone ) * Mmax( normB, ATL_rone ) *
 
600
                     Mmax( normC, ATL_rone ) * EPSILON *
 
601
                     Mmax( Mmax( M, N ), K ) );
 
602
 
 
603
   if( ( resid > THRESH ) || ( resid != resid ) )
 
604
   {
 
605
      (void) fprintf( stderr,
 
606
      "ERROR:  resid=%f, normD=%f, normA=%f, normB=%f, normC=%f, eps=%e\n",
 
607
      resid, normD, normA, normB, normC, EPSILON );
 
608
#ifdef ATLAS_DEBUG
 
609
      Mjoin( PATL, geprint )( "C_trusted", M, N, C0, LDC );
 
610
      Mjoin( PATL, geprint )( "C_test",    M, N, C,  LDC );
 
611
#endif
 
612
   }
 
613
 
 
614
   free( C  );
 
615
 
 
616
   return( resid );
 
617
}
 
618
 
 
619
TYPE symmtst
 
620
(
 
621
   const enum LVL3_ROUT       ROUT,
 
622
   const int                  TEST,
 
623
   const enum ATLAS_SIDE      SIDE,
 
624
   const enum ATLAS_UPLO      UPLO,
 
625
   const int                  M,
 
626
   const int                  N,
 
627
   const SCALAR               ALPHA,
 
628
   const int                  LDA,
 
629
   const int                  LDB,
 
630
   const SCALAR               BETA,
 
631
   const int                  LDC,
 
632
   const TYPE                 EPSILON,
 
633
   double                     * TTRUST0,
 
634
   double                     * TTEST0,
 
635
   double                     * MFTRUST0,
 
636
   double                     * MFTEST0
 
637
)
 
638
{
 
639
   double                     l2ret, ops, t0, ttest, ttrust;
 
640
   TYPE                       normA, normB, normC, normD, resid;
 
641
   TYPE                       * A  = NULL, * B = NULL, * C = NULL, * C0,
 
642
                              * a, * b, * c;
 
643
   int                        nA, Aseed, Bseed, Cseed;
 
644
 
 
645
   *TTRUST0 = *TTEST0 = *MFTEST0 = *MFTRUST0 = 0.0;
 
646
   if( N == 0 ) { return( ATL_rzero ); }
 
647
 
 
648
   if( SIDE == AtlasLeft ) { ops = opbl3( ROUT, M, N, -1 ); nA = M; }
 
649
   else                    { ops = opbl3( ROUT, M, N,  1 ); nA = N; }
 
650
/*
 
651
 * Allocate L2 cache space, A, X, Y and Y0
 
652
 */
 
653
   l2ret = ATL_flushcache( L2SIZE );
 
654
   A  = (TYPE *)malloc( ATL_MulBySize( LDA ) * nA     );
 
655
   B  = (TYPE *)malloc( ATL_MulBySize( LDB ) * N      );
 
656
   C  = (TYPE *)malloc( ATL_MulBySize( LDC ) * N  * 2 );
 
657
 
 
658
   if( ( A == NULL ) || ( B == NULL ) || ( C == NULL ) )
 
659
   {
 
660
      l2ret = ATL_flushcache( 0 );
 
661
      if( A ) free( A );
 
662
      if( B ) free( B );
 
663
      if( C ) free( C );
 
664
      return( ATL_rnone );
 
665
   }
 
666
 
 
667
   C0 = C + LDC * ( N SHIFT );
 
668
/*
 
669
 * Generate random operands
 
670
 */
 
671
   Aseed = nA * nA + 513 *  7 + 90;
 
672
   Bseed = M  * N  + 127 * 50 + 77;
 
673
   Cseed = M  * N  + 101 *  2 + 53;
 
674
 
 
675
   Mjoin( PATL, gegen )( nA, nA, A,  LDA, Aseed );
 
676
   Mjoin( PATL, gegen )( M,  N,  B,  LDB, Bseed );
 
677
   Mjoin( PATL, gegen )( M,  N,  C,  LDC, Cseed );
 
678
   Mjoin( PATL, gegen )( M,  N,  C0, LDC, Cseed );
 
679
/*
 
680
 * Compute the norm of C for later use in testing
 
681
 */
 
682
   if( TEST )
 
683
   {
 
684
      normC = Mjoin( PATL, genrm1 )( M, N, C, LDC );
 
685
      if( Mabs1( BETA ) > ATL_rone ) normC *= Mabs1( BETA  );
 
686
      if( normC == ATL_rzero ) normC = ATL_rone;
 
687
   }
 
688
   else { normC = ATL_rone; }
 
689
/*
 
690
 * Start cold cache timing operations for the trusted routine
 
691
 */
 
692
   a = A; b = B; c = C0;
 
693
 
 
694
#ifdef TREAL
 
695
   l2ret = ATL_flushcache( -1 );
 
696
   t0     = time00();
 
697
   trusted_symm( SIDE, UPLO, M, N, ALPHA, a, LDA, b, LDB, BETA, c, LDC );
 
698
   ttrust = time00() - t0;
 
699
   if( ttrust > 0.0 )
 
700
   { *TTRUST0 = ttrust; *MFTRUST0 = ops / ( ttrust * MEGA ); }
 
701
#else
 
702
   if( ROUT == SYMM )
 
703
   {
 
704
      l2ret = ATL_flushcache( -1 );
 
705
      t0     = time00();
 
706
      trusted_symm( SIDE, UPLO, M, N, ALPHA, a, LDA, b, LDB, BETA, c, LDC );
 
707
      ttrust = time00() - t0;
 
708
      if( ttrust > 0.0 )
 
709
      { *TTRUST0 = ttrust; *MFTRUST0 = ops / ( ttrust * MEGA ); }
 
710
   }
 
711
   else /* if( ROUT == HEMM ) */
 
712
   {
 
713
      l2ret = ATL_flushcache( -1 );
 
714
      t0     = time00();
 
715
      trusted_hemm( SIDE, UPLO, M, N, ALPHA, a, LDA, b, LDB, BETA, c, LDC );
 
716
      ttrust = time00() - t0;
 
717
      if( ttrust > 0.0 )
 
718
      { *TTRUST0 = ttrust; *MFTRUST0 = ops / ( ttrust * MEGA ); }
 
719
   }
 
720
#endif
 
721
/*
 
722
 * Start cold cache timing operations for the tested routine
 
723
 */
 
724
   a = A; b = B; c = C;
 
725
 
 
726
#ifdef TREAL
 
727
   l2ret = ATL_flushcache( -1 );
 
728
   t0     = time00();
 
729
   test_symm(    SIDE, UPLO, M, N, ALPHA, a, LDA, b, LDB, BETA, c, LDC );
 
730
   ttest  = time00() - t0;
 
731
   if( ttest  > 0.0 )
 
732
   { *TTEST0  = ttest;  *MFTEST0  = ops / ( ttest  * MEGA ); }
 
733
#else
 
734
   if( ROUT == SYMM )
 
735
   {
 
736
      l2ret = ATL_flushcache( -1 );
 
737
      t0     = time00();
 
738
      test_symm( SIDE, UPLO, M, N, ALPHA, a, LDA, b, LDB, BETA, c, LDC );
 
739
      ttest  = time00() - t0;
 
740
      if( ttest  > 0.0 )
 
741
      { *TTEST0  = ttest;  *MFTEST0  = ops / ( ttest  * MEGA ); }
 
742
   }
 
743
   else /* if( ROUT == HEMM ) */
 
744
   {
 
745
      l2ret = ATL_flushcache( -1 );
 
746
      t0     = time00();
 
747
      test_hemm( SIDE, UPLO, M, N, ALPHA, a, LDA, b, LDB, BETA, c, LDC );
 
748
      ttest  = time00() - t0;
 
749
      if( ttest  > 0.0 )
 
750
      { *TTEST0  = ttest;  *MFTEST0  = ops / ( ttest  * MEGA ); }
 
751
   }
 
752
#endif
 
753
/*
 
754
 * if timing only, I am done ... so leave.
 
755
 */
 
756
   l2ret  = ATL_flushcache( 0 );
 
757
 
 
758
   if( !( TEST ) ) { free( A ); free( B ); free( C ); return( ATL_rzero ); }
 
759
/*
 
760
 * else perform error check
 
761
 */
 
762
#ifdef TREAL
 
763
   normA = Mjoin( PATL, synrm )( UPLO, nA, A, LDA );
 
764
#else
 
765
   if( ROUT == SYMM ) normA = Mjoin( PATL, synrm )( UPLO, nA, A, LDA );
 
766
   else               normA = Mjoin( PATL, henrm )( UPLO, nA, A, LDA );
 
767
#endif
 
768
   if( Mabs1( ALPHA ) > ATL_rone ) normA *= Mabs1( ALPHA );
 
769
   if( normA == ATL_rzero ) normA = ATL_rone;
 
770
   free( A  );
 
771
 
 
772
   normB = Mjoin( PATL, genrm1 )( M, N, B, LDB );
 
773
   if( normB == ATL_rzero ) normB = ATL_rone;
 
774
   free( B  );
 
775
/*
 
776
 * Ensure the difference of the output operands is relatively tiny enough
 
777
 */
 
778
   normD = Mjoin( PATL, gediffnrm1 )( M, N, C, LDC, C0, LDC );
 
779
   resid = normD / ( Mmax( normA, ATL_rone ) * Mmax( normB, ATL_rone ) *
 
780
                     Mmax( normC, ATL_rone ) * EPSILON * Mmax( M, N ) );
 
781
 
 
782
   if( ( resid > THRESH ) || ( resid != resid ) )
 
783
   {
 
784
      (void) fprintf( stderr,
 
785
      "ERROR:  resid=%f, normD=%f, normA=%f, normB=%f, normC=%f, eps=%e\n",
 
786
      resid, normD, normA, normB, normC, EPSILON );
 
787
#ifdef ATLAS_DEBUG
 
788
      Mjoin( PATL, geprint )( "C_trusted", M, N, C0, LDC );
 
789
      Mjoin( PATL, geprint )( "C_test",    M, N, C,  LDC );
 
790
#endif
 
791
   }
 
792
 
 
793
   free( C  );
 
794
 
 
795
   return( resid );
 
796
}
 
797
 
 
798
TYPE syr2ktst
 
799
(
 
800
   const enum LVL3_ROUT       ROUT,
 
801
   const int                  TEST,
 
802
   const enum ATLAS_UPLO      UPLO,
 
803
   const enum ATLAS_TRANS     TRANS,
 
804
   const int                  N,
 
805
   const int                  K,
 
806
   const SCALAR               ALPHA,
 
807
   const int                  LDA,
 
808
   const int                  LDB,
 
809
   const SCALAR               BETA,
 
810
   const int                  LDC,
 
811
   const TYPE                 EPSILON,
 
812
   double                     * TTRUST0,
 
813
   double                     * TTEST0,
 
814
   double                     * MFTRUST0,
 
815
   double                     * MFTEST0
 
816
)
 
817
{
 
818
   double                     l2ret, ops, t0, ttest, ttrust;
 
819
   TYPE                       normA, normB, normC, normD, resid;
 
820
   TYPE                       * A = NULL, * B = NULL, * C = NULL, * C0,
 
821
                              * a, * b, * c;
 
822
   int                        mAB, nAB, Aseed, Bseed, Cseed;
 
823
   enum ATLAS_TRANS           ta;
 
824
 
 
825
   *TTRUST0 = *TTEST0 = *MFTEST0 = *MFTRUST0 = 0.0;
 
826
   if( N == 0 ) { return( ATL_rzero ); }
 
827
 
 
828
   if( TRANS == AtlasNoTrans )
 
829
   { ta = TRANS; mAB = N; nAB = K; }
 
830
   else
 
831
   { ta = ( ROUT == SYR2K ? AtlasTrans : AtlasConjTrans ); mAB = K; nAB = N; }
 
832
 
 
833
   ops = opbl3( ROUT, N, 0, K );
 
834
/*
 
835
 * Allocate L2 cache space, A, C and C0
 
836
 */
 
837
   l2ret = ATL_flushcache( L2SIZE );
 
838
   A = (TYPE *)malloc( ATL_MulBySize( LDA ) * nAB    );
 
839
   B = (TYPE *)malloc( ATL_MulBySize( LDB ) * nAB    );
 
840
   C = (TYPE *)malloc( ATL_MulBySize( LDC ) * N  * 2 );
 
841
 
 
842
   if( ( A == NULL ) || ( B == NULL ) || ( C == NULL ) )
 
843
   {
 
844
      l2ret = ATL_flushcache( 0 );
 
845
      if( A ) free( A );
 
846
      if( B ) free( B );
 
847
      if( C ) free( C );
 
848
      return( ATL_rnone );
 
849
   }
 
850
 
 
851
   C0 = C + LDC * ( N SHIFT );
 
852
/*
 
853
 * Generate random operands
 
854
 */
 
855
   Aseed = mAB * nAB + 513 *  7 + 90;
 
856
   Bseed = mAB * nAB + 127 * 50 + 77;
 
857
   Cseed = N   * N   + 101 *  2 + 53;
 
858
 
 
859
   Mjoin( PATL, gegen )( mAB, nAB, A,  LDA, Aseed );
 
860
   Mjoin( PATL, gegen )( mAB, nAB, B,  LDB, Bseed );
 
861
   Mjoin( PATL, gegen )( N,   N,   C,  LDC, Cseed );
 
862
   Mjoin( PATL, gegen )( N,   N,   C0, LDC, Cseed );
 
863
/*
 
864
 * Compute the norm of C for later use in testing
 
865
 */
 
866
   if( TEST )
 
867
   {
 
868
#ifdef TREAL
 
869
      normC = Mjoin( PATL, synrm )( UPLO, N, C, LDC );
 
870
      if( Mabs1( BETA ) > ATL_rone ) normC *= Mabs1( BETA  );
 
871
      if( normC == ATL_rzero ) normC = ATL_rone;
 
872
#else
 
873
      if( ROUT == SYR2K )
 
874
      {
 
875
         normC = Mjoin( PATL, synrm )( UPLO, N, C, LDC );
 
876
         if( Mabs1( BETA ) > ATL_rone ) normC *= Mabs1( BETA  );
 
877
         if( normC == ATL_rzero ) normC = ATL_rone;
 
878
      }
 
879
      else
 
880
      {
 
881
         normC = Mjoin( PATL, henrm )( UPLO, N, C, LDC );
 
882
         if( Mabs( BETA[0] ) > ATL_rone ) normC *= Mabs( BETA[0] );
 
883
         if( normC == ATL_rzero ) normC = ATL_rone;
 
884
      }
 
885
#endif
 
886
   }
 
887
   else { normC = ATL_rone; }
 
888
/*
 
889
 * Start cold cache timing operations for the trusted routine
 
890
 */
 
891
   a = A; b = B; c = C0;
 
892
#ifdef TREAL
 
893
   l2ret = ATL_flushcache( -1 );
 
894
   t0     = time00();
 
895
   trusted_syr2k( UPLO, ta, N, K, ALPHA, a, LDA, b, LDB, BETA, c, LDC );
 
896
   ttrust = time00() - t0;
 
897
#else
 
898
   if( ROUT == SYR2K )
 
899
   {
 
900
      l2ret = ATL_flushcache( -1 );
 
901
      t0     = time00();
 
902
      trusted_syr2k( UPLO, ta, N, K, ALPHA, a, LDA, b, LDB, BETA, c, LDC );
 
903
      ttrust = time00() - t0;
 
904
   }
 
905
   else /* if( ROUT == HER2K ) */
 
906
   {
 
907
      l2ret = ATL_flushcache( -1 );
 
908
      t0     = time00();
 
909
      trusted_her2k( UPLO, ta, N, K, ALPHA, a, LDA, b, LDB, (TYPE)(BETA[0]),
 
910
                     c, LDC );
 
911
      ttrust = time00() - t0;
 
912
   }
 
913
#endif
 
914
   if( ttrust > 0.0 )
 
915
   { *TTRUST0 = ttrust; *MFTRUST0 = ops / ( ttrust * MEGA ); }
 
916
/*
 
917
 * Start cold cache timing operations for the tested routine
 
918
 */
 
919
   a = A; b = B; c = C;
 
920
#ifdef TREAL
 
921
   l2ret = ATL_flushcache( -1 );
 
922
   t0     = time00();
 
923
   test_syr2k(    UPLO, TRANS, N, K, ALPHA, a, LDA, b, LDB, BETA, c, LDC );
 
924
   ttest  = time00() - t0;
 
925
#else
 
926
   if( ROUT == SYR2K )
 
927
   {
 
928
      l2ret = ATL_flushcache( -1 );
 
929
      t0     = time00();
 
930
      test_syr2k( UPLO, ta, N, K, ALPHA, a, LDA, b, LDB, BETA, c, LDC );
 
931
      ttest  = time00() - t0;
 
932
   }
 
933
   else /* if( ROUT == HERK ) */
 
934
   {
 
935
      l2ret = ATL_flushcache( -1 );
 
936
      t0     = time00();
 
937
      test_her2k( UPLO, ta, N, K, ALPHA, a, LDA, b, LDB, (TYPE)(BETA[0]),
 
938
                  c, LDC );
 
939
      ttest  = time00() - t0;
 
940
   }
 
941
#endif
 
942
   if( ttest  > 0.0 )
 
943
   { *TTEST0  = ttest;  *MFTEST0  = ops / ( ttest  * MEGA ); }
 
944
/*
 
945
 * if timing only, I am done ... so leave.
 
946
 */
 
947
   l2ret  = ATL_flushcache( 0 );
 
948
 
 
949
   if( !( TEST ) ) { free( A ); free( C ); return( ATL_rzero ); }
 
950
/*
 
951
 * else perform error check
 
952
 */
 
953
   normA = Mjoin( PATL, genrm1 )( mAB, nAB, A, LDA );
 
954
   if( Mabs1( ALPHA ) > ATL_rone ) normA *= Mabs1( ALPHA );
 
955
   if( normA == ATL_rzero ) normA = ATL_rone;
 
956
   free( A  );
 
957
 
 
958
   normB = Mjoin( PATL, genrm1 )( mAB, nAB, B, LDB );
 
959
   if( normB == ATL_rzero ) normB = ATL_rone;
 
960
   free( B  );
 
961
/*
 
962
 * Ensure the difference of the output operands is relatively tiny enough
 
963
 */
 
964
   normD = Mjoin( PATL, gediffnrm1 )( N, N, C, LDC, C0, LDC );
 
965
   resid = normD / ( Mmax( normC, ATL_rone ) * Mmax( normA, ATL_rone ) *
 
966
                     Mmax( normB, ATL_rone ) * EPSILON * Mmax( N, K ) );
 
967
 
 
968
   if( ( resid > THRESH ) || ( resid != resid ) )
 
969
   {
 
970
      (void) fprintf( stderr,
 
971
      "ERROR:    resid=%f, normD=%f, normA=%f, normC=%f, eps=%e\n",
 
972
      resid, normD, normA, normC, EPSILON );
 
973
#ifdef ATLAS_DEBUG
 
974
      Mjoin( PATL, geprint )( "C_trusted", N, N, C0, LDC );
 
975
      Mjoin( PATL, geprint )( "C_test",    N, N, C,  LDC );
 
976
#endif
 
977
   }
 
978
 
 
979
   free( C  );
 
980
 
 
981
   return( resid );
 
982
}
 
983
 
 
984
TYPE syrktst
 
985
(
 
986
   const enum LVL3_ROUT       ROUT,
 
987
   const int                  TEST,
 
988
   const enum ATLAS_UPLO      UPLO,
 
989
   const enum ATLAS_TRANS     TRANS,
 
990
   const int                  N,
 
991
   const int                  K,
 
992
   const SCALAR               ALPHA,
 
993
   const int                  LDA,
 
994
   const SCALAR               BETA,
 
995
   const int                  LDC,
 
996
   const TYPE                 EPSILON,
 
997
   double                     * TTRUST0,
 
998
   double                     * TTEST0,
 
999
   double                     * MFTRUST0,
 
1000
   double                     * MFTEST0
 
1001
)
 
1002
{
 
1003
   double                     l2ret, ops, t0, ttest, ttrust;
 
1004
   TYPE                       normA, normC, normD, resid;
 
1005
   TYPE                       * A = NULL, * C = NULL, * C0, * a, * c;
 
1006
   int                        mA, nA, Aseed, Cseed;
 
1007
   enum ATLAS_TRANS           ta;
 
1008
 
 
1009
   *TTRUST0 = *TTEST0 = *MFTEST0 = *MFTRUST0 = 0.0;
 
1010
   if( N == 0 ) { return( ATL_rzero ); }
 
1011
 
 
1012
   if( TRANS == AtlasNoTrans )
 
1013
   { ta = TRANS; mA = N; nA = K; }
 
1014
   else
 
1015
   { ta = ( ROUT == SYRK ? AtlasTrans : AtlasConjTrans ); mA = K; nA = N; }
 
1016
 
 
1017
   ops = opbl3( ROUT, N, 0, K );
 
1018
/*
 
1019
 * Allocate L2 cache space, A, C and C0
 
1020
 */
 
1021
   l2ret = ATL_flushcache( L2SIZE );
 
1022
   A = (TYPE *)malloc( ATL_MulBySize( LDA ) * nA     );
 
1023
   C = (TYPE *)malloc( ATL_MulBySize( LDC ) * N  * 2 );
 
1024
 
 
1025
   if( ( A == NULL ) || ( C == NULL ) )
 
1026
   {
 
1027
      l2ret = ATL_flushcache( 0 );
 
1028
      if( A ) free( A );
 
1029
      if( C ) free( C );
 
1030
      return( ATL_rnone );
 
1031
   }
 
1032
 
 
1033
   C0 = C + LDC * ( N SHIFT );
 
1034
/*
 
1035
 * Generate random operands
 
1036
 */
 
1037
   Aseed = mA * nA + 513 *  7 + 90;
 
1038
   Cseed = N  * N  + 101 *  2 + 53;
 
1039
 
 
1040
   Mjoin( PATL, gegen )( mA, nA, A,  LDA, Aseed );
 
1041
   Mjoin( PATL, gegen )( N,  N,  C,  LDC, Cseed );
 
1042
   Mjoin( PATL, gegen )( N,  N,  C0, LDC, Cseed );
 
1043
/*
 
1044
 * Compute the norm of C for later use in testing
 
1045
 */
 
1046
   if( TEST )
 
1047
   {
 
1048
#ifdef TREAL
 
1049
      normC = Mjoin( PATL, synrm )( UPLO, N, C, LDC );
 
1050
      if( Mabs1( BETA ) > ATL_rone ) normC *= Mabs1( BETA  );
 
1051
      if( normC == ATL_rzero ) normC = ATL_rone;
 
1052
#else
 
1053
      if( ROUT == SYRK )
 
1054
      {
 
1055
         normC = Mjoin( PATL, synrm )( UPLO, N, C, LDC );
 
1056
         if( Mabs1( BETA ) > ATL_rone ) normC *= Mabs1( BETA  );
 
1057
         if( normC == ATL_rzero ) normC = ATL_rone;
 
1058
      }
 
1059
      else
 
1060
      {
 
1061
         normC = Mjoin( PATL, henrm )( UPLO, N, C, LDC );
 
1062
         if( Mabs( BETA[0] ) > ATL_rone ) normC *= Mabs( BETA[0] );
 
1063
         if( normC == ATL_rzero ) normC = ATL_rone;
 
1064
      }
 
1065
#endif
 
1066
   }
 
1067
   else { normC = ATL_rone; }
 
1068
/*
 
1069
 * Start cold cache timing operations for the trusted routine
 
1070
 */
 
1071
   a = A; c = C0;
 
1072
#ifdef TREAL
 
1073
   l2ret  = ATL_flushcache( -1 );
 
1074
   t0     = time00();
 
1075
   trusted_syrk( UPLO, ta, N, K, ALPHA, a, LDA, BETA, c, LDC );
 
1076
   ttrust = time00() - t0;
 
1077
#else
 
1078
   if( ROUT == SYRK )
 
1079
   {
 
1080
      l2ret  = ATL_flushcache( -1 );
 
1081
      t0     = time00();
 
1082
      trusted_syrk( UPLO, ta, N, K, ALPHA, a, LDA, BETA, c, LDC );
 
1083
      ttrust = time00() - t0;
 
1084
   }
 
1085
   else /* if( ROUT == HERK ) */
 
1086
   {
 
1087
      l2ret  = ATL_flushcache( -1 );
 
1088
      t0     = time00();
 
1089
      trusted_herk( UPLO, ta, N, K, (TYPE)(ALPHA[0]), a, LDA, (TYPE)(BETA[0]),
 
1090
                    c, LDC );
 
1091
      ttrust = time00() - t0;
 
1092
   }
 
1093
#endif
 
1094
   if( ttrust > 0.0 )
 
1095
   { *TTRUST0 = ttrust; *MFTRUST0 = ops / ( ttrust * MEGA ); }
 
1096
/*
 
1097
 * Start cold cache timing operations for the tested routine
 
1098
 */
 
1099
   a = A; c = C;
 
1100
#ifdef TREAL
 
1101
   l2ret  = ATL_flushcache( -1 );
 
1102
   t0     = time00();
 
1103
   test_syrk(    UPLO, TRANS, N, K, ALPHA, a, LDA, BETA, c, LDC );
 
1104
   ttest  = time00() - t0;
 
1105
#else
 
1106
   if( ROUT == SYRK )
 
1107
   {
 
1108
      l2ret  = ATL_flushcache( -1 );
 
1109
      t0     = time00();
 
1110
      test_syrk( UPLO, ta, N, K, ALPHA, a, LDA, BETA, c, LDC );
 
1111
      ttest  = time00() - t0;
 
1112
   }
 
1113
   else /* if( ROUT == HERK ) */
 
1114
   {
 
1115
      l2ret  = ATL_flushcache( -1 );
 
1116
      t0     = time00();
 
1117
      test_herk( UPLO, ta, N, K, (TYPE)(ALPHA[0]), a, LDA, (TYPE)(BETA[0]),
 
1118
                 c, LDC );
 
1119
      ttest  = time00() - t0;
 
1120
   }
 
1121
#endif
 
1122
   if( ttest  > 0.0 )
 
1123
   { *TTEST0  = ttest;  *MFTEST0  = ops / ( ttest  * MEGA ); }
 
1124
/*
 
1125
 * if timing only, I am done ... so leave.
 
1126
 */
 
1127
   l2ret  = ATL_flushcache( 0 );
 
1128
 
 
1129
   if( !( TEST ) ) { free( A ); free( C ); return( ATL_rzero ); }
 
1130
/*
 
1131
 * else perform error check
 
1132
 */
 
1133
   normA = Mjoin( PATL, genrm1 )( mA, nA, A, LDA );
 
1134
#ifdef TREAL
 
1135
   if( Mabs1( ALPHA ) > ATL_rone ) normA *= Mabs1( ALPHA );
 
1136
#else
 
1137
   if( ROUT == SYRK )
 
1138
   { if( Mabs1( ALPHA ) > ATL_rone ) normA *= Mabs1( ALPHA ); }
 
1139
   else
 
1140
   { if( Mabs( ALPHA[0] ) > ATL_rone ) normA *= Mabs( ALPHA[0] ); }
 
1141
#endif
 
1142
   if( normA == ATL_rzero ) normA = ATL_rone;
 
1143
   free( A  );
 
1144
/*
 
1145
 * Ensure the difference of the output operands is relatively tiny enough
 
1146
 */
 
1147
   normD = Mjoin( PATL, gediffnrm1 )( N, N, C, LDC, C0, LDC );
 
1148
   resid = normD / ( Mmax( normC, ATL_rone ) * Mmax( normA, ATL_rone ) *
 
1149
                     EPSILON * Mmax( N, K ) );
 
1150
 
 
1151
   if( ( resid > THRESH ) || ( resid != resid ) )
 
1152
   {
 
1153
      (void) fprintf( stderr,
 
1154
      "ERROR:    resid=%f, normD=%f, normA=%f, normC=%f, eps=%e\n",
 
1155
      resid, normD, normA, normC, EPSILON );
 
1156
#ifdef ATLAS_DEBUG
 
1157
      Mjoin( PATL, geprint )( "C_trusted", N, N, C0, LDC );
 
1158
      Mjoin( PATL, geprint )( "C_test",    N, N, C,  LDC );
 
1159
#endif
 
1160
   }
 
1161
 
 
1162
   free( C  );
 
1163
 
 
1164
   return( resid );
 
1165
}
 
1166
 
 
1167
TYPE trmmtst
 
1168
(
 
1169
   const enum LVL3_ROUT       ROUT,
 
1170
   const int                  TEST,
 
1171
   const enum ATLAS_SIDE      SIDE,
 
1172
   const enum ATLAS_UPLO      UPLO,
 
1173
   const enum ATLAS_TRANS     TRANS,
 
1174
   const enum ATLAS_DIAG      DIAG,
 
1175
   const int                  M,
 
1176
   const int                  N,
 
1177
   const SCALAR               ALPHA,
 
1178
   const int                  LDA,
 
1179
   const int                  LDB,
 
1180
   const TYPE                 EPSILON,
 
1181
   double                     * TTRUST0,
 
1182
   double                     * TTEST0,
 
1183
   double                     * MFTRUST0,
 
1184
   double                     * MFTEST0
 
1185
)
 
1186
{
 
1187
   double                     l2ret, ops, t0, ttest, ttrust;
 
1188
   TYPE                       normA, normB, normD, resid;
 
1189
   TYPE                       * A = NULL, * B = NULL, * B0, * a, * b;
 
1190
   int                        nA, Aseed, Bseed;
 
1191
 
 
1192
   *TTRUST0 = *TTEST0 = *MFTEST0 = *MFTRUST0 = 0.0;
 
1193
   if( ( M == 0 ) || ( N == 0 ) ) { return( ATL_rzero ); }
 
1194
 
 
1195
   if( SIDE == AtlasLeft ) { nA = M; ops = opbl3( ROUT, M, N, -1 ); }
 
1196
   else                    { nA = N; ops = opbl3( ROUT, M, N,  1 ); }
 
1197
/*
 
1198
 * Allocate L2 cache space, A, X and X0
 
1199
 */
 
1200
   l2ret = ATL_flushcache( L2SIZE );
 
1201
   A = (TYPE *)malloc( ATL_MulBySize( LDA ) * nA    );
 
1202
   B = (TYPE *)malloc( ATL_MulBySize( LDB ) * N * 2 );
 
1203
 
 
1204
   if( ( A == NULL ) || ( B == NULL ) )
 
1205
   {
 
1206
      l2ret  = ATL_flushcache( 0 );
 
1207
      if( A ) free( A );
 
1208
      if( B ) free( B );
 
1209
      return( ATL_rnone );
 
1210
   }
 
1211
 
 
1212
   B0 = B + LDB * ( N SHIFT );
 
1213
/*
 
1214
 * Generate random operands
 
1215
 */
 
1216
   Aseed = nA * nA + 513 *  7 + 90;
 
1217
   Bseed = M  * N  + 127 * 50 + 77;
 
1218
 
 
1219
   Mjoin( PATL, gegen )( nA, nA, A,  LDA, Aseed );
 
1220
   Mjoin( PATL, gegen )( M,  N,  B,  LDB, Bseed );
 
1221
   Mjoin( PATL, gegen )( M,  N,  B0, LDB, Bseed );
 
1222
/*
 
1223
 * Compute the norm of B for later use in testing
 
1224
 */
 
1225
   if( TEST )
 
1226
   {
 
1227
      normB = Mjoin( PATL, genrm1 )( M, N, B, LDB );
 
1228
      if( Mabs1( ALPHA ) > ATL_rone ) normB *= Mabs1( ALPHA );
 
1229
      if( normB == ATL_rzero ) normB = ATL_rone;
 
1230
   }
 
1231
   else { normB = ATL_rone; }
 
1232
/*
 
1233
 * Start cold cache timing operations for the trusted routine
 
1234
 */
 
1235
   a = A; b = B0;
 
1236
 
 
1237
   l2ret  = ATL_flushcache( -1 );
 
1238
   t0     = time00();
 
1239
   trusted_trmm( SIDE, UPLO, TRANS, DIAG, M, N, ALPHA, a, LDA, b, LDB );
 
1240
   ttrust = time00() - t0;
 
1241
   if( ttrust > 0.0 )
 
1242
   { *TTRUST0 = ttrust; *MFTRUST0 = ops / ( ttrust * MEGA ); }
 
1243
/*
 
1244
 * Start cold cache timing operations for the tested routine
 
1245
 */
 
1246
   a = A; b = B;
 
1247
 
 
1248
   l2ret = ATL_flushcache( -1 );
 
1249
   t0    = time00();
 
1250
   test_trmm(    SIDE, UPLO, TRANS, DIAG, M, N, ALPHA, a, LDA, b, LDB );
 
1251
   ttest  = time00() - t0;
 
1252
   if( ttest  > 0.0 )
 
1253
   { *TTEST0  = ttest;  *MFTEST0  = ops / ( ttest  * MEGA ); }
 
1254
/*
 
1255
 * if timing only, I am done ... so leave.
 
1256
 */
 
1257
   l2ret  = ATL_flushcache( 0 );
 
1258
 
 
1259
   if( !( TEST ) ) { free( A ); free( B ); return( ATL_rzero ); }
 
1260
/*
 
1261
 * else perform error check
 
1262
 */
 
1263
   normA = Mjoin( PATL, trnrm1 )( UPLO, DIAG, nA, A, LDA );
 
1264
   if( normA == ATL_rzero ) normA = ATL_rone;
 
1265
   free( A  );
 
1266
/*
 
1267
 * Ensure the difference of the output operands is relatively tiny enough
 
1268
 */
 
1269
   normD = Mjoin( PATL, gediffnrm1 )( M, N, B, LDB, B0, LDB );
 
1270
   resid = normD / ( Mmax( normA, ATL_rone ) * Mmax( normB, ATL_rone ) *
 
1271
                     EPSILON * Mmax( M, N ) );
 
1272
 
 
1273
   if( ( resid > THRESH ) || ( resid != resid ) )
 
1274
   {
 
1275
      (void) fprintf( stderr,
 
1276
      "ERROR:  resid=%f, normD=%f, normA=%f, normB=%f, eps=%e\n",
 
1277
      resid, normD, normA, normB, EPSILON );
 
1278
#ifdef ATLAS_DEBUG
 
1279
      Mjoin( PATL, geprint )( "B_trusted", M, N, B0, LDB );
 
1280
      Mjoin( PATL, geprint )( "B_test",    M, N, B,  LDB );
 
1281
#endif
 
1282
   }
 
1283
 
 
1284
   free( B );
 
1285
 
 
1286
   return( resid );
 
1287
}
 
1288
 
 
1289
TYPE trsmtst
 
1290
(
 
1291
   const enum LVL3_ROUT       ROUT,
 
1292
   const int                  TEST,
 
1293
   const enum ATLAS_SIDE      SIDE,
 
1294
   const enum ATLAS_UPLO      UPLO,
 
1295
   const enum ATLAS_TRANS     TRANS,
 
1296
   const enum ATLAS_DIAG      DIAG,
 
1297
   const int                  M,
 
1298
   const int                  N,
 
1299
   const SCALAR               ALPHA,
 
1300
   const int                  LDA,
 
1301
   const int                  LDB,
 
1302
   const TYPE                 EPSILON,
 
1303
   double                     * TTRUST0,
 
1304
   double                     * TTEST0,
 
1305
   double                     * MFTRUST0,
 
1306
   double                     * MFTEST0
 
1307
)
 
1308
{
 
1309
   double                     l2ret, ops, t0, ttest, ttrust;
 
1310
   TYPE                       normA, normB, normD, resid;
 
1311
   TYPE                       * A = NULL, * B = NULL, * B0, * a, * b;
 
1312
   int                        nA, Aseed, Bseed;
 
1313
 
 
1314
   *TTRUST0 = *TTEST0 = *MFTEST0 = *MFTRUST0 = 0.0;
 
1315
   if( ( M == 0 ) || ( N == 0 ) ) { return( ATL_rzero ); }
 
1316
 
 
1317
   if( SIDE == AtlasLeft ) { nA = M; ops = opbl3( ROUT, M, N, -1 ); }
 
1318
   else                    { nA = N; ops = opbl3( ROUT, M, N,  1 ); }
 
1319
/*
 
1320
 * Allocate L2 cache space, A, X and X0
 
1321
 */
 
1322
   l2ret = ATL_flushcache( L2SIZE );
 
1323
   A  = (TYPE *)malloc( ATL_MulBySize( LDA ) * nA    );
 
1324
   B  = (TYPE *)malloc( ATL_MulBySize( LDB ) * N * 2 );
 
1325
 
 
1326
   if( ( A == NULL ) || ( B == NULL ) )
 
1327
   {
 
1328
      l2ret = ATL_flushcache( 0 );
 
1329
      if( A ) free( A );
 
1330
      if( B ) free( B );
 
1331
      return( ATL_rnone );
 
1332
   }
 
1333
 
 
1334
   B0 = B + LDB * ( N SHIFT );
 
1335
/*
 
1336
 * Generate random operands
 
1337
 */
 
1338
   Aseed = nA * nA + 513 *  7 + 90;
 
1339
   Bseed = M  * N  + 127 * 50 + 77;
 
1340
 
 
1341
   Mjoin( PATL, gegen )( nA, nA, A,  LDA, Aseed ); trddom( UPLO, nA, A, LDA );
 
1342
   Mjoin( PATL, gegen )( M,  N,  B,  LDB, Bseed );
 
1343
   Mjoin( PATL, gegen )( M,  N,  B0, LDB, Bseed );
 
1344
/*
 
1345
 * Compute the norm of B for later use in testing
 
1346
 */
 
1347
   if( TEST )
 
1348
   {
 
1349
      normB = Mjoin( PATL, genrm1 )( M, N, B, LDB );
 
1350
      if( Mabs1( ALPHA ) > ATL_rone ) normB *= Mabs1( ALPHA );
 
1351
      if( normB == ATL_rzero ) normB = ATL_rone;
 
1352
   }
 
1353
   else { normB = ATL_rone; }
 
1354
/*
 
1355
 * Start cold cache timing operations for the trusted routine
 
1356
 */
 
1357
   a = A; b = B0;
 
1358
 
 
1359
   l2ret  = ATL_flushcache( -1 );
 
1360
   t0     = time00();
 
1361
   trusted_trsm( SIDE, UPLO, TRANS, DIAG, M, N, ALPHA, a, LDA, b, LDB );
 
1362
   ttrust = time00() - t0;
 
1363
   if( ttrust > 0.0 )
 
1364
   { *TTRUST0 = ttrust; *MFTRUST0 = ops / ( ttrust * MEGA ); }
 
1365
/*
 
1366
 * Start cold cache timing operations for the tested routine
 
1367
 */
 
1368
   a = A; b = B;
 
1369
 
 
1370
   l2ret  = ATL_flushcache( -1 );
 
1371
   t0     = time00();
 
1372
   test_trsm(    SIDE, UPLO, TRANS, DIAG, M, N, ALPHA, a, LDA, b, LDB );
 
1373
   ttest  = time00() - t0;
 
1374
   if( ttest  > 0.0 )
 
1375
   { *TTEST0  = ttest;  *MFTEST0  = ops / ( ttest  * MEGA ); }
 
1376
/*
 
1377
 * if timing only, I am done ... so leave.
 
1378
 */
 
1379
   l2ret = ATL_flushcache( 0 );
 
1380
 
 
1381
   if( !( TEST ) ) { free( A ); free( B ); return( ATL_rzero ); }
 
1382
/*
 
1383
 * else perform error check
 
1384
 */
 
1385
   normA = Mjoin( PATL, trnrm1 )( UPLO, DIAG, nA, A, LDA );
 
1386
   if( normA == ATL_rzero ) normA = ATL_rone;
 
1387
   free( A  );
 
1388
/*
 
1389
 * Ensure the difference of the output operands is relatively tiny enough
 
1390
 */
 
1391
   normD = Mjoin( PATL, gediffnrm1 )( M, N, B, LDB, B0, LDB );
 
1392
   resid = normD / ( Mmax( normA, ATL_rone ) * Mmax( normB, ATL_rone ) *
 
1393
                     EPSILON * Mmax( M, N ) );
 
1394
 
 
1395
   if( ( resid > THRESH ) || ( resid != resid ) )
 
1396
   {
 
1397
      (void) fprintf( stderr,
 
1398
      "ERROR:  resid=%f, normD=%f, normA=%f, normB=%f, eps=%e\n",
 
1399
      resid, normD, normA, normB, EPSILON );
 
1400
#ifdef ATLAS_DEBUG
 
1401
      Mjoin( PATL, geprint )( "B_trusted", M, N, B0, LDB );
 
1402
      Mjoin( PATL, geprint )( "B_test",    M, N, B,  LDB );
 
1403
#endif
 
1404
   }
 
1405
 
 
1406
   free( B );
 
1407
 
 
1408
   return( resid );
 
1409
}
 
1410
/*
 
1411
 * =====================================================================
 
1412
 * case functions
 
1413
 * =====================================================================
 
1414
 */
 
1415
int gemmcase
 
1416
(
 
1417
   const enum LVL3_ROUT       ROUT,
 
1418
   const int                  TEST,
 
1419
   const int                  MFLOP,
 
1420
   const enum ATLAS_TRANS     TRANSA,
 
1421
   const enum ATLAS_TRANS     TRANSB,
 
1422
   const int                  M,
 
1423
   const int                  N,
 
1424
   const int                  K,
 
1425
   const SCALAR               ALPHA,
 
1426
   const int                  LDA,
 
1427
   const int                  LDB,
 
1428
   const SCALAR               BETA,
 
1429
   const int                  LDC,
 
1430
   const TYPE                 EPSILON,
 
1431
   double                     * TTRUST0,
 
1432
   double                     * TTEST0,
 
1433
   double                     * MFTRUST0,
 
1434
   double                     * MFTEST0
 
1435
)
 
1436
{
 
1437
   double                     flops, ttrust, ttest, mftrust, mftest, t0;
 
1438
   TYPE                       resid = ATL_rzero;
 
1439
#ifdef TREAL
 
1440
   TYPE                       bet,  beta,    nbeta;
 
1441
#else
 
1442
   TYPE                       *bet, beta[2], nbeta[2];
 
1443
#endif
 
1444
   TYPE                       * a, * stA, *b, * stB, * c, * stC, * A,
 
1445
                              * A0 = NULL, * B, * B0 = NULL, * C, * C0 = NULL;
 
1446
   unsigned long              ir, reps;
 
1447
   int                        inca, incb, incc, lA, lB, lC, mA, nA, mB, nB,
 
1448
                              passed, Aseed, Bseed, Cseed;
 
1449
 
 
1450
   if( ( MEGA * MFLOP <= ( flops = opbl3( ROUT, M, N, K ) ) ) || ( TEST ) )
 
1451
   {
 
1452
      resid = gemmtst( ROUT, TEST, TRANSA, TRANSB, M, N, K, ALPHA, LDA, LDB,
 
1453
                       BETA, LDC, EPSILON, TTRUST0, TTEST0, MFTRUST0, MFTEST0 );
 
1454
      if( resid > THRESH ) (void) fprintf( stderr, "   resid=%f\n", resid );
 
1455
   }
 
1456
   if( resid < ATL_rzero ) passed = -1;
 
1457
   else                    passed = ( resid < THRESH );
 
1458
 
 
1459
   if( MEGA * MFLOP <= flops ) return( passed );
 
1460
 
 
1461
   if( TRANSA == AtlasNoTrans ) { mA = M; nA = K; } else { mA = K; nA = M; }
 
1462
   if( TRANSB == AtlasNoTrans ) { mB = K; nB = N; } else { mB = N; nB = K; }
 
1463
 
 
1464
   inca = LDA  * ( nA SHIFT );
 
1465
   incb = LDB  * ( nB SHIFT );
 
1466
   incc = LDC  * ( N  SHIFT );
 
1467
 
 
1468
   lA = inca  * ( ( ATL_DivBySize( LCSIZE ) + mA*nA - 1 ) / ( mA * nA ) );
 
1469
   lB = incb  * ( ( ATL_DivBySize( LCSIZE ) + mB*nB - 1 ) / ( mB * nB ) );
 
1470
   lC = incc  * ( ( ATL_DivBySize( LCSIZE ) + M * N - 1 ) / ( M  * N  ) );
 
1471
 
 
1472
   A0 = (TYPE *)malloc( ATL_MulBySize( lA ) );
 
1473
   B0 = (TYPE *)malloc( ATL_MulBySize( lB ) );
 
1474
   C0 = (TYPE *)malloc( ATL_MulBySize( lC ) );
 
1475
 
 
1476
   if( ( A0 == NULL ) || ( B0 == NULL ) || ( C0 == NULL ) )
 
1477
   {
 
1478
      if( A0 ) free( A0 );
 
1479
      if( B0 ) free( B0 );
 
1480
      if( C0 ) free( C0 );
 
1481
      return( -1 );
 
1482
   }
 
1483
 
 
1484
   A = A0; stA = A0 + ( lA SHIFT );
 
1485
   B = B0; stB = B0 + ( lB SHIFT );
 
1486
   C = C0; stC = C0 + ( lC SHIFT );
 
1487
 
 
1488
#ifdef TREAL
 
1489
   beta   =  BETA;
 
1490
   nbeta  = -BETA;
 
1491
#else
 
1492
   *beta  =    *BETA; beta [1] =  BETA[1];
 
1493
   *nbeta = -(*BETA); nbeta[1] = -BETA[1];
 
1494
#endif
 
1495
 
 
1496
   Aseed = mA * nA + 513 *  7 + 90;
 
1497
   Bseed = mB * nB + 127 * 50 + 77;
 
1498
   Cseed = M  * N  + 101 *  2 + 53;
 
1499
 
 
1500
   reps  = ( MEGA * MFLOP ) / flops;
 
1501
/*
 
1502
 * Generate the random data and time the trusted routine
 
1503
 */
 
1504
   bet = beta; a = A; b = B; c = C;
 
1505
 
 
1506
   Mjoin( PATL, gegen )( lA, 1, A0, lA, Aseed );
 
1507
   Mjoin( PATL, gegen )( lB, 1, B0, lB, Bseed );
 
1508
   Mjoin( PATL, gegen )( lC, 1, C0, lC, Cseed );
 
1509
 
 
1510
   t0 = time00();
 
1511
   for( ir = reps; ir; ir-- )
 
1512
   {
 
1513
      trusted_gemm( TRANSA, TRANSB, M, N, K, ALPHA, a, LDA, b, LDB,
 
1514
                    (SCALAR)(bet), c, LDC );
 
1515
      a += inca; if( a == stA ) { a = A; }
 
1516
      b += incb; if( b == stB ) { b = B; }
 
1517
      c += incc;
 
1518
      if( c == stC ) { c = C; if( bet == beta ) bet = nbeta; else bet = beta; }
 
1519
   }
 
1520
   ttrust = time00() - t0;
 
1521
   if( ttrust > 0.0 ) mftrust = ( reps * flops ) / ( MEGA * ttrust );
 
1522
   else               mftrust = 0.0;
 
1523
   ttrust /= reps; *TTRUST0 = ttrust; *MFTRUST0 = mftrust;
 
1524
/*
 
1525
 * Generate the random data and time the tested routine
 
1526
 */
 
1527
   bet = beta; a = A; b = B; c = C;
 
1528
 
 
1529
   Mjoin( PATL, gegen )( lA, 1, A0, lA, Aseed );
 
1530
   Mjoin( PATL, gegen )( lB, 1, B0, lB, Bseed );
 
1531
   Mjoin( PATL, gegen )( lC, 1, C0, lC, Cseed );
 
1532
 
 
1533
   t0 = time00();
 
1534
   for( ir = reps; ir; ir-- )
 
1535
   {
 
1536
      test_gemm(    TRANSA, TRANSB, M, N, K, ALPHA, a, LDA, b, LDB,
 
1537
                    (SCALAR)(bet), c, LDC );
 
1538
      a += inca; if( a == stA ) { a = A; }
 
1539
      b += incb; if( b == stB ) { b = B; }
 
1540
      c += incc;
 
1541
      if( c == stC ) { c = C; if( bet == beta ) bet = nbeta; else bet = beta; }
 
1542
   }
 
1543
   ttest = time00() - t0;
 
1544
   if( ttest  > 0.0 ) mftest  = ( reps * flops ) / ( MEGA * ttest  );
 
1545
   else               mftest  = 0.0;
 
1546
   ttest  /= reps; *TTEST0  = ttest;  *MFTEST0  = mftest;
 
1547
/*
 
1548
 * release the memory and exit
 
1549
 */
 
1550
   free( C0 );
 
1551
   free( B0 );
 
1552
   free( A0 );
 
1553
 
 
1554
   return( passed );
 
1555
}
 
1556
 
 
1557
int symmcase
 
1558
(
 
1559
   const enum LVL3_ROUT       ROUT,
 
1560
   const int                  TEST,
 
1561
   const int                  MFLOP,
 
1562
   const enum ATLAS_SIDE      SIDE,
 
1563
   const enum ATLAS_UPLO      UPLO,
 
1564
   const int                  M,
 
1565
   const int                  N,
 
1566
   const SCALAR               ALPHA,
 
1567
   const int                  LDA,
 
1568
   const int                  LDB,
 
1569
   const SCALAR               BETA,
 
1570
   const int                  LDC,
 
1571
   const TYPE                 EPSILON,
 
1572
   double                     * TTRUST0,
 
1573
   double                     * TTEST0,
 
1574
   double                     * MFTRUST0,
 
1575
   double                     * MFTEST0
 
1576
)
 
1577
{
 
1578
   double                     flops, ttrust, ttest, mftrust, mftest, t0;
 
1579
   TYPE                       resid = ATL_rzero;
 
1580
#ifdef TREAL
 
1581
   TYPE                       bet,  beta,    nbeta;
 
1582
#else
 
1583
   TYPE                       *bet, beta[2], nbeta[2];
 
1584
#endif
 
1585
   TYPE                       * a, * stA, *b, * stB, * c, * stC, * A,
 
1586
                              * A0 = NULL, * B, * B0 = NULL, * C, * C0 = NULL;
 
1587
   unsigned long              ir, reps;
 
1588
   int                        inca, incb, incc, lA, lB, lC, nA, passed, Aseed,
 
1589
                              Bseed, Cseed;
 
1590
 
 
1591
   flops = opbl3( ROUT, M, N, ( SIDE == AtlasLeft ? -1 : 1 ) );
 
1592
 
 
1593
   if( ( MEGA * MFLOP <= flops ) || ( TEST ) )
 
1594
   {
 
1595
      resid = symmtst( ROUT, TEST, SIDE, UPLO, M, N, ALPHA, LDA, LDB, BETA,
 
1596
                       LDC, EPSILON, TTRUST0, TTEST0, MFTRUST0, MFTEST0 );
 
1597
      if( resid > THRESH ) (void) fprintf( stderr, "   resid=%f\n", resid );
 
1598
   }
 
1599
   if( resid < ATL_rzero ) passed = -1;
 
1600
   else                    passed = ( resid < THRESH );
 
1601
 
 
1602
   if( MEGA * MFLOP <= flops ) return( passed );
 
1603
 
 
1604
   if( SIDE == AtlasLeft ) { nA = M; } else { nA = N; }
 
1605
 
 
1606
   inca = LDA  * ( nA SHIFT );
 
1607
   incb = LDB  * ( N  SHIFT );
 
1608
   incc = LDC  * ( N  SHIFT );
 
1609
 
 
1610
   lA = inca  * ( ( ATL_DivBySize( LCSIZE ) + nA*nA - 1 ) / ( nA * nA ) );
 
1611
   lB = incb  * ( ( ATL_DivBySize( LCSIZE ) + M * N - 1 ) / ( M  * N  ) );
 
1612
   lC = incc  * ( ( ATL_DivBySize( LCSIZE ) + M * N - 1 ) / ( M  * N  ) );
 
1613
 
 
1614
   A0 = (TYPE *)malloc( ATL_MulBySize( lA ) );
 
1615
   B0 = (TYPE *)malloc( ATL_MulBySize( lB ) );
 
1616
   C0 = (TYPE *)malloc( ATL_MulBySize( lC ) );
 
1617
 
 
1618
   if( ( A0 == NULL ) || ( B0 == NULL ) || ( C0 == NULL ) )
 
1619
   {
 
1620
      if( A0 ) free( A0 );
 
1621
      if( B0 ) free( B0 );
 
1622
      if( C0 ) free( C0 );
 
1623
      return( -1 );
 
1624
   }
 
1625
 
 
1626
   A = A0; stA = A0 + ( lA SHIFT );
 
1627
   B = B0; stB = B0 + ( lB SHIFT );
 
1628
   C = C0; stC = C0 + ( lC SHIFT );
 
1629
 
 
1630
#ifdef TREAL
 
1631
   beta   =  BETA;
 
1632
   nbeta  = -BETA;
 
1633
#else
 
1634
   *beta  =    *BETA; beta [1] =  BETA[1];
 
1635
   *nbeta = -(*BETA); nbeta[1] = -BETA[1];
 
1636
#endif
 
1637
 
 
1638
   Aseed = nA * nA + 513 *  7 + 90;
 
1639
   Bseed = M  * N  + 127 * 50 + 77;
 
1640
   Cseed = M  * N  + 101 *  2 + 53;
 
1641
 
 
1642
   reps  = ( MEGA * MFLOP ) / flops;
 
1643
/*
 
1644
 * Generate the random data and time the trusted routine
 
1645
 */
 
1646
   bet = beta; a = A; b = B; c = C;
 
1647
 
 
1648
   Mjoin( PATL, gegen )( lA, 1, A0, lA, Aseed );
 
1649
   Mjoin( PATL, gegen )( lB, 1, B0, lB, Bseed );
 
1650
   Mjoin( PATL, gegen )( lC, 1, C0, lC, Cseed );
 
1651
 
 
1652
#ifdef TREAL
 
1653
   t0 = time00();
 
1654
   for( ir = reps; ir; ir-- )
 
1655
   {
 
1656
      trusted_symm( SIDE, UPLO, M, N, ALPHA, a, LDA, b, LDB, (SCALAR)(bet),
 
1657
                    c, LDC );
 
1658
      a += inca; if( a == stA ) { a = A; }
 
1659
      b += incb; if( b == stB ) { b = B; }
 
1660
      c += incc;
 
1661
      if( c == stC ) { c = C; if( bet == beta ) bet = nbeta; else bet = beta; }
 
1662
   }
 
1663
   ttrust = time00() - t0;
 
1664
#else
 
1665
   if( ROUT == SYMM )
 
1666
   {
 
1667
      t0 = time00();
 
1668
      for( ir = reps; ir; ir-- )
 
1669
      {
 
1670
         trusted_symm( SIDE, UPLO, M, N, ALPHA, a, LDA, b, LDB, (SCALAR)(bet),
 
1671
                       c, LDC );
 
1672
         a += inca; if( a == stA ) { a = A; }
 
1673
         b += incb; if( b == stB ) { b = B; }
 
1674
         c += incc;
 
1675
         if( c == stC )
 
1676
         { c = C; if( bet == beta ) bet = nbeta; else bet = beta; }
 
1677
      }
 
1678
      ttrust = time00() - t0;
 
1679
   }
 
1680
   else /* if( ROUT == HEMM ) */
 
1681
   {
 
1682
      t0 = time00();
 
1683
      for( ir = reps; ir; ir-- )
 
1684
      {
 
1685
         trusted_hemm( SIDE, UPLO, M, N, ALPHA, a, LDA, b, LDB, (SCALAR)(bet),
 
1686
                       c, LDC );
 
1687
         a += inca; if( a == stA ) { a = A; }
 
1688
         b += incb; if( b == stB ) { b = B; }
 
1689
         c += incc;
 
1690
         if( c == stC )
 
1691
         { c = C; if( bet == beta ) bet = nbeta; else bet = beta; }
 
1692
      }
 
1693
      ttrust = time00() - t0;
 
1694
   }
 
1695
#endif
 
1696
   if( ttrust > 0.0 ) mftrust = ( reps * flops ) / ( MEGA * ttrust );
 
1697
   else               mftrust = 0.0;
 
1698
   ttrust /= reps; *TTRUST0 = ttrust; *MFTRUST0 = mftrust;
 
1699
/*
 
1700
 * Generate the random data and time the tested routine
 
1701
 */
 
1702
   bet = beta; a = A; b = B; c = C;
 
1703
 
 
1704
   Mjoin( PATL, gegen )( lA, 1, A0, lA, Aseed );
 
1705
   Mjoin( PATL, gegen )( lB, 1, B0, lB, Bseed );
 
1706
   Mjoin( PATL, gegen )( lC, 1, C0, lC, Cseed );
 
1707
 
 
1708
#ifdef TREAL
 
1709
   t0 = time00();
 
1710
   for( ir = reps; ir; ir-- )
 
1711
   {
 
1712
      test_symm(    SIDE, UPLO, M, N, ALPHA, a, LDA, b, LDB, (SCALAR)(bet),
 
1713
                    c, LDC );
 
1714
      a += inca; if( a == stA ) { a = A; }
 
1715
      b += incb; if( b == stB ) { b = B; }
 
1716
      c += incc;
 
1717
      if( c == stC ) { c = C; if( bet == beta ) bet = nbeta; else bet = beta; }
 
1718
   }
 
1719
   ttest = time00() - t0;
 
1720
#else
 
1721
   if( ROUT == SYMM )
 
1722
   {
 
1723
      t0 = time00();
 
1724
      for( ir = reps; ir; ir-- )
 
1725
      {
 
1726
         test_symm(    SIDE, UPLO, M, N, ALPHA, a, LDA, b, LDB, (SCALAR)(bet),
 
1727
                       c, LDC );
 
1728
         a += inca; if( a == stA ) { a = A; }
 
1729
         b += incb; if( b == stB ) { b = B; }
 
1730
         c += incc;
 
1731
         if( c == stC )
 
1732
         { c = C; if( bet == beta ) bet = nbeta; else bet = beta; }
 
1733
      }
 
1734
      ttest = time00() - t0;
 
1735
   }
 
1736
   else /* if( ROUT == HEMM ) */
 
1737
   {
 
1738
      t0 = time00();
 
1739
      for( ir = reps; ir; ir-- )
 
1740
      {
 
1741
         test_hemm(    SIDE, UPLO, M, N, ALPHA, a, LDA, b, LDB, (SCALAR)(bet),
 
1742
                       c, LDC );
 
1743
         a += inca; if( a == stA ) { a = A; }
 
1744
         b += incb; if( b == stB ) { b = B; }
 
1745
         c += incc;
 
1746
         if( c == stC )
 
1747
         { c = C; if( bet == beta ) bet = nbeta; else bet = beta; }
 
1748
      }
 
1749
      ttest = time00() - t0;
 
1750
   }
 
1751
#endif
 
1752
   if( ttest  > 0.0 ) mftest  = ( reps * flops ) / ( MEGA * ttest  );
 
1753
   else               mftest  = 0.0;
 
1754
   ttest  /= reps; *TTEST0  = ttest;  *MFTEST0  = mftest;
 
1755
/*
 
1756
 * release the memory and exit
 
1757
 */
 
1758
   free( C0 );
 
1759
   free( B0 );
 
1760
   free( A0 );
 
1761
 
 
1762
   return( passed );
 
1763
}
 
1764
 
 
1765
int syr2kcase
 
1766
(
 
1767
   const enum LVL3_ROUT       ROUT,
 
1768
   const int                  TEST,
 
1769
   const int                  MFLOP,
 
1770
   const enum ATLAS_UPLO      UPLO,
 
1771
   const enum ATLAS_TRANS     TRANS,
 
1772
   const int                  N,
 
1773
   const int                  K,
 
1774
   const SCALAR               ALPHA,
 
1775
   const int                  LDA,
 
1776
   const int                  LDB,
 
1777
   const SCALAR               BETA,
 
1778
   const int                  LDC,
 
1779
   const TYPE                 EPSILON,
 
1780
   double                     * TTRUST0,
 
1781
   double                     * TTEST0,
 
1782
   double                     * MFTRUST0,
 
1783
   double                     * MFTEST0
 
1784
)
 
1785
{
 
1786
   double                     flops, ttrust, ttest, mftrust, mftest, t0;
 
1787
   TYPE                       resid = ATL_rzero;
 
1788
#ifdef TREAL
 
1789
   TYPE                       bet,  beta,    nbeta;
 
1790
#else
 
1791
   TYPE                       *bet, beta[2], nbeta[2];
 
1792
#endif
 
1793
   TYPE                       * a, * stA, *b, * stB, * c, * stC, * A,
 
1794
                              * A0 = NULL, * B, * B0 = NULL, * C, * C0 = NULL;
 
1795
   unsigned long              ir, reps;
 
1796
   int                        inca, incb, incc, lA, lB, lC, mAB, nAB, passed,
 
1797
                              Aseed, Bseed, Cseed;
 
1798
   enum ATLAS_TRANS           ta;
 
1799
 
 
1800
   if( ( MEGA * MFLOP <= ( flops = opbl3( ROUT, N, 0, K ) ) ) || ( TEST ) )
 
1801
   {
 
1802
      resid = syr2ktst( ROUT, TEST, UPLO, TRANS, N, K, ALPHA, LDA, LDB, BETA,
 
1803
                        LDC, EPSILON, TTRUST0, TTEST0, MFTRUST0, MFTEST0 );
 
1804
      if( resid > THRESH ) (void) fprintf( stderr, "   resid=%f\n", resid );
 
1805
   }
 
1806
   if( resid < ATL_rzero ) passed = -1;
 
1807
   else                    passed = ( resid < THRESH );
 
1808
 
 
1809
   if( MEGA * MFLOP <= flops ) return( passed );
 
1810
 
 
1811
   if( TRANS == AtlasNoTrans )
 
1812
   { ta = TRANS; mAB = N; nAB = K; }
 
1813
   else
 
1814
   { ta = ( ROUT == SYR2K ? AtlasTrans : AtlasConjTrans ); mAB = K; nAB = N; }
 
1815
 
 
1816
   inca = LDA  * ( nAB SHIFT );
 
1817
   incb = LDB  * ( nAB SHIFT );
 
1818
   incc = LDC  * ( N   SHIFT );
 
1819
 
 
1820
   lA = inca  * ( ( ATL_DivBySize( LCSIZE ) + mAB*nAB - 1 ) / ( mAB * nAB ) );
 
1821
   lB = incb  * ( ( ATL_DivBySize( LCSIZE ) + mAB*nAB - 1 ) / ( mAB * nAB ) );
 
1822
   lC = incc  * ( ( ATL_DivBySize( LCSIZE ) + N * N   - 1 ) / ( N   * N   ) );
 
1823
 
 
1824
   A0 = (TYPE *)malloc( ATL_MulBySize( lA ) );
 
1825
   B0 = (TYPE *)malloc( ATL_MulBySize( lB ) );
 
1826
   C0 = (TYPE *)malloc( ATL_MulBySize( lC ) );
 
1827
 
 
1828
   if( ( A0 == NULL ) || ( B0 == NULL ) || ( C0 == NULL ) )
 
1829
   {
 
1830
      if( A0 ) free( A0 );
 
1831
      if( B0 ) free( B0 );
 
1832
      if( C0 ) free( C0 );
 
1833
      return( -1 );
 
1834
   }
 
1835
 
 
1836
   A = A0; stA = A0 + ( lA SHIFT );
 
1837
   B = B0; stB = B0 + ( lB SHIFT );
 
1838
   C = C0; stC = C0 + ( lC SHIFT );
 
1839
 
 
1840
#ifdef TREAL
 
1841
   beta   =  BETA;
 
1842
   nbeta  = -BETA;
 
1843
#else
 
1844
   *beta  =    *BETA; beta [1] =  BETA[1];
 
1845
   *nbeta = -(*BETA); nbeta[1] = -BETA[1];
 
1846
#endif
 
1847
 
 
1848
   Aseed = mAB * nAB + 513 *  7 + 90;
 
1849
   Bseed = mAB * nAB + 127 * 50 + 77;
 
1850
   Cseed = N   * N   + 101 *  2 + 53;
 
1851
 
 
1852
   reps  = ( MEGA * MFLOP ) / flops;
 
1853
/*
 
1854
 * Generate the random data and time the trusted routine
 
1855
 */
 
1856
   bet = beta; a = A; b = B; c = C;
 
1857
 
 
1858
   Mjoin( PATL, gegen )( lA, 1, A0, lA, Aseed );
 
1859
   Mjoin( PATL, gegen )( lB, 1, B0, lB, Bseed );
 
1860
   Mjoin( PATL, gegen )( lC, 1, C0, lC, Cseed );
 
1861
 
 
1862
#ifdef TREAL
 
1863
   t0 = time00();
 
1864
   for( ir = reps; ir; ir-- )
 
1865
   {
 
1866
      trusted_syr2k( UPLO, ta, N, K, ALPHA, a, LDA, b, LDB, (SCALAR)(bet),
 
1867
                     c, LDC );
 
1868
      a += inca; if( a == stA ) { a = A; }
 
1869
      b += incb; if( b == stB ) { b = B; }
 
1870
      c += incc;
 
1871
      if( c == stC ) { c = C; if( bet == beta ) bet = nbeta; else bet = beta; }
 
1872
   }
 
1873
   ttrust = time00() - t0;
 
1874
#else
 
1875
   if( ROUT == SYR2K )
 
1876
   {
 
1877
      t0 = time00();
 
1878
      for( ir = reps; ir; ir-- )
 
1879
      {
 
1880
         trusted_syr2k( UPLO, ta, N, K, ALPHA, a, LDA, b, LDB, (SCALAR)(bet),
 
1881
                        c, LDC );
 
1882
         a += inca; if( a == stA ) { a = A; }
 
1883
         b += incb; if( b == stB ) { b = B; }
 
1884
         c += incc;
 
1885
         if( c == stC )
 
1886
         { c = C; if( bet == beta ) bet = nbeta; else bet = beta; }
 
1887
      }
 
1888
      ttrust = time00() - t0;
 
1889
   }
 
1890
   else /* if( ROUT == HER2K ) */
 
1891
   {
 
1892
      t0 = time00();
 
1893
      for( ir = reps; ir; ir-- )
 
1894
      {
 
1895
         trusted_her2k( UPLO, ta, N, K, ALPHA, a, LDA, b, LDB, (TYPE)(bet[0]),
 
1896
                        c, LDC );
 
1897
         a += inca; if( a == stA ) { a = A; }
 
1898
         b += incb; if( b == stB ) { b = B; }
 
1899
         c += incc;
 
1900
         if( c == stC )
 
1901
         { c = C; if( bet == beta ) bet = nbeta; else bet = beta; }
 
1902
      }
 
1903
      ttrust = time00() - t0;
 
1904
   }
 
1905
#endif
 
1906
   if( ttrust > 0.0 ) mftrust = ( reps * flops ) / ( MEGA * ttrust );
 
1907
   else               mftrust = 0.0;
 
1908
   ttrust /= reps; *TTRUST0 = ttrust; *MFTRUST0 = mftrust;
 
1909
/*
 
1910
 * Generate the random data and time the tested routine
 
1911
 */
 
1912
   bet = beta; a = A; b = B; c = C;
 
1913
 
 
1914
   Mjoin( PATL, gegen )( lA, 1, A0, lA, Aseed );
 
1915
   Mjoin( PATL, gegen )( lB, 1, B0, lB, Bseed );
 
1916
   Mjoin( PATL, gegen )( lC, 1, C0, lC, Cseed );
 
1917
 
 
1918
#ifdef TREAL
 
1919
   t0 = time00();
 
1920
   for( ir = reps; ir; ir-- )
 
1921
   {
 
1922
      test_syr2k(    UPLO, ta, N, K, ALPHA, a, LDA, b, LDB, (SCALAR)(bet),
 
1923
                     c, LDC );
 
1924
      a += inca; if( a == stA ) { a = A; }
 
1925
      b += incb; if( b == stB ) { b = B; }
 
1926
      c += incc;
 
1927
      if( c == stC ) { c = C; if( bet == beta ) bet = nbeta; else bet = beta; }
 
1928
   }
 
1929
   ttest = time00() - t0;
 
1930
#else
 
1931
   if( ROUT == SYR2K )
 
1932
   {
 
1933
      t0 = time00();
 
1934
      for( ir = reps; ir; ir-- )
 
1935
      {
 
1936
         test_syr2k(    UPLO, ta, N, K, ALPHA, a, LDA, b, LDB, (SCALAR)(bet),
 
1937
                        c, LDC );
 
1938
         a += inca; if( a == stA ) { a = A; }
 
1939
         b += incb; if( b == stB ) { b = B; }
 
1940
         c += incc;
 
1941
         if( c == stC )
 
1942
         { c = C; if( bet == beta ) bet = nbeta; else bet = beta; }
 
1943
      }
 
1944
      ttest = time00() - t0;
 
1945
   }
 
1946
   else /* if( ROUT == HER2K ) */
 
1947
   {
 
1948
      t0 = time00();
 
1949
      for( ir = reps; ir; ir-- )
 
1950
      {
 
1951
         test_her2k(    UPLO, ta, N, K, ALPHA, a, LDA, b, LDB, (TYPE)(bet[0]),
 
1952
                        c, LDC );
 
1953
         a += inca; if( a == stA ) { a = A; }
 
1954
         b += incb; if( b == stB ) { b = B; }
 
1955
         c += incc;
 
1956
         if( c == stC )
 
1957
         { c = C; if( bet == beta ) bet = nbeta; else bet = beta; }
 
1958
      }
 
1959
      ttest = time00() - t0;
 
1960
   }
 
1961
#endif
 
1962
   if( ttest  > 0.0 ) mftest  = ( reps * flops ) / ( MEGA * ttest  );
 
1963
   else               mftest  = 0.0;
 
1964
   ttest  /= reps; *TTEST0  = ttest;  *MFTEST0  = mftest;
 
1965
/*
 
1966
 * release the memory and exit
 
1967
 */
 
1968
   free( C0 );
 
1969
   free( B0 );
 
1970
   free( A0 );
 
1971
 
 
1972
   return( passed );
 
1973
}
 
1974
 
 
1975
int syrkcase
 
1976
(
 
1977
   const enum LVL3_ROUT       ROUT,
 
1978
   const int                  TEST,
 
1979
   const int                  MFLOP,
 
1980
   const enum ATLAS_UPLO      UPLO,
 
1981
   const enum ATLAS_TRANS     TRANS,
 
1982
   const int                  N,
 
1983
   const int                  K,
 
1984
   const SCALAR               ALPHA,
 
1985
   const int                  LDA,
 
1986
   const SCALAR               BETA,
 
1987
   const int                  LDC,
 
1988
   const TYPE                 EPSILON,
 
1989
   double                     * TTRUST0,
 
1990
   double                     * TTEST0,
 
1991
   double                     * MFTRUST0,
 
1992
   double                     * MFTEST0
 
1993
)
 
1994
{
 
1995
   double                     flops, ttrust, ttest, mftrust, mftest, t0;
 
1996
   TYPE                       resid = ATL_rzero;
 
1997
#ifdef TREAL
 
1998
   TYPE                       bet,  beta,    nbeta;
 
1999
#else
 
2000
   TYPE                       *bet, beta[2], nbeta[2];
 
2001
#endif
 
2002
   TYPE                       * a, * stA, * c, * stC, * A, * A0 = NULL,
 
2003
                              * C, * C0 = NULL;
 
2004
   unsigned long              ir, reps;
 
2005
   int                        inca, incc, lA, lC, mA, nA, passed, Aseed, Cseed;
 
2006
   enum ATLAS_TRANS           ta;
 
2007
 
 
2008
   if( ( MEGA * MFLOP <= ( flops = opbl3( ROUT, N, 0, K ) ) ) || ( TEST ) )
 
2009
   {
 
2010
      resid = syrktst( ROUT, TEST, UPLO, TRANS, N, K, ALPHA, LDA, BETA,
 
2011
                       LDC, EPSILON, TTRUST0, TTEST0, MFTRUST0, MFTEST0 );
 
2012
      if( resid > THRESH ) (void) fprintf( stderr, "   resid=%f\n", resid );
 
2013
   }
 
2014
   if( resid < ATL_rzero ) passed = -1;
 
2015
   else                    passed = ( resid < THRESH );
 
2016
 
 
2017
   if( MEGA * MFLOP <= flops ) return( passed );
 
2018
 
 
2019
   if( TRANS == AtlasNoTrans )
 
2020
   { ta = TRANS; mA = N; nA = K; }
 
2021
   else
 
2022
   { ta = ( ROUT == SYRK ? AtlasTrans : AtlasConjTrans ); mA = K; nA = N; }
 
2023
 
 
2024
   inca = LDA  * ( nA SHIFT );
 
2025
   incc = LDC  * ( N  SHIFT );
 
2026
 
 
2027
   lA = inca  * ( ( ATL_DivBySize( LCSIZE ) + mA*nA - 1 ) / ( mA * nA ) );
 
2028
   lC = incc  * ( ( ATL_DivBySize( LCSIZE ) + N * N - 1 ) / ( N   * N ) );
 
2029
 
 
2030
   A0 = (TYPE *)malloc( ATL_MulBySize( lA ) );
 
2031
   C0 = (TYPE *)malloc( ATL_MulBySize( lC ) );
 
2032
 
 
2033
   if( ( A0 == NULL ) || ( C0 == NULL ) )
 
2034
   { if( A0 ) free( A0 ); if( C0 ) free( C0 ); return( -1 ); }
 
2035
 
 
2036
   A = A0; stA = A0 + ( lA SHIFT );
 
2037
   C = C0; stC = C0 + ( lC SHIFT );
 
2038
 
 
2039
#ifdef TREAL
 
2040
   beta   =  BETA;
 
2041
   nbeta  = -BETA;
 
2042
#else
 
2043
   *beta  =    *BETA; beta [1] =  BETA[1];
 
2044
   *nbeta = -(*BETA); nbeta[1] = -BETA[1];
 
2045
#endif
 
2046
 
 
2047
   Aseed = mA * nA + 513 *  7 + 90;
 
2048
   Cseed = N  * N  + 101 *  2 + 53;
 
2049
 
 
2050
   reps  = ( MEGA * MFLOP ) / flops;
 
2051
/*
 
2052
 * Generate the random data and time the trusted routine
 
2053
 */
 
2054
   bet = beta; a = A; c = C;
 
2055
 
 
2056
   Mjoin( PATL, gegen )( lA, 1, A0, lA, Aseed );
 
2057
   Mjoin( PATL, gegen )( lC, 1, C0, lC, Cseed );
 
2058
 
 
2059
#ifdef TREAL
 
2060
   t0 = time00();
 
2061
   for( ir = reps; ir; ir-- )
 
2062
   {
 
2063
      trusted_syrk( UPLO, ta, N, K, ALPHA, a, LDA, (SCALAR)(bet), c, LDC );
 
2064
      a += inca; if( a == stA ) { a = A; }
 
2065
      c += incc;
 
2066
      if( c == stC ) { c = C; if( bet == beta ) bet = nbeta; else bet = beta; }
 
2067
   }
 
2068
   ttrust = time00() - t0;
 
2069
#else
 
2070
   if( ROUT == SYRK )
 
2071
   {
 
2072
      t0 = time00();
 
2073
      for( ir = reps; ir; ir-- )
 
2074
      {
 
2075
         trusted_syrk( UPLO, ta, N, K, ALPHA, a, LDA, (SCALAR)(bet), c, LDC );
 
2076
         a += inca; if( a == stA ) { a = A; }
 
2077
         c += incc;
 
2078
         if( c == stC )
 
2079
         { c = C; if( bet == beta ) bet = nbeta; else bet = beta; }
 
2080
      }
 
2081
      ttrust = time00() - t0;
 
2082
   }
 
2083
   else /* if( ROUT == HERK ) */
 
2084
   {
 
2085
      t0 = time00();
 
2086
      for( ir = reps; ir; ir-- )
 
2087
      {
 
2088
         trusted_herk( UPLO, ta, N, K, (TYPE)(ALPHA[0]), a, LDA,
 
2089
                       (TYPE)(bet[0]), c, LDC );
 
2090
         a += inca; if( a == stA ) { a = A; }
 
2091
         c += incc;
 
2092
         if( c == stC )
 
2093
         { c = C; if( bet == beta ) bet = nbeta; else bet = beta; }
 
2094
      }
 
2095
      ttrust = time00() - t0;
 
2096
   }
 
2097
#endif
 
2098
   if( ttrust > 0.0 ) mftrust = ( reps * flops ) / ( MEGA * ttrust );
 
2099
   else               mftrust = 0.0;
 
2100
   ttrust /= reps; *TTRUST0 = ttrust; *MFTRUST0 = mftrust;
 
2101
/*
 
2102
 * Generate the random data and time the tested routine
 
2103
 */
 
2104
   bet = beta; a = A; c = C;
 
2105
 
 
2106
   Mjoin( PATL, gegen )( lA, 1, A0, lA, Aseed );
 
2107
   Mjoin( PATL, gegen )( lC, 1, C0, lC, Cseed );
 
2108
 
 
2109
#ifdef TREAL
 
2110
   t0 = time00();
 
2111
   for( ir = reps; ir; ir-- )
 
2112
   {
 
2113
      test_syrk(    UPLO, ta, N, K, ALPHA, a, LDA, (SCALAR)(bet), c, LDC );
 
2114
      a += inca; if( a == stA ) { a = A; }
 
2115
      c += incc;
 
2116
      if( c == stC ) { c = C; if( bet == beta ) bet = nbeta; else bet = beta; }
 
2117
   }
 
2118
   ttest = time00() - t0;
 
2119
#else
 
2120
   if( ROUT == SYRK )
 
2121
   {
 
2122
      t0 = time00();
 
2123
      for( ir = reps; ir; ir-- )
 
2124
      {
 
2125
         test_syrk(    UPLO, ta, N, K, ALPHA, a, LDA, (SCALAR)(bet), c, LDC );
 
2126
         a += inca; if( a == stA ) { a = A; }
 
2127
         c += incc;
 
2128
         if( c == stC )
 
2129
         { c = C; if( bet == beta ) bet = nbeta; else bet = beta; }
 
2130
      }
 
2131
      ttest = time00() - t0;
 
2132
   }
 
2133
   else /* if( ROUT == HERK ) */
 
2134
   {
 
2135
      t0 = time00();
 
2136
      for( ir = reps; ir; ir-- )
 
2137
      {
 
2138
         test_herk(    UPLO, ta, N, K, (TYPE)(ALPHA[0]), a, LDA,
 
2139
                       (TYPE)(bet[0]), c, LDC );
 
2140
         a += inca; if( a == stA ) { a = A; }
 
2141
         c += incc;
 
2142
         if( c == stC )
 
2143
         { c = C; if( bet == beta ) bet = nbeta; else bet = beta; }
 
2144
      }
 
2145
      ttest = time00() - t0;
 
2146
   }
 
2147
#endif
 
2148
   if( ttest  > 0.0 ) mftest  = ( reps * flops ) / ( MEGA * ttest  );
 
2149
   else               mftest  = 0.0;
 
2150
   ttest  /= reps; *TTEST0  = ttest;  *MFTEST0  = mftest;
 
2151
/*
 
2152
 * release the memory and exit
 
2153
 */
 
2154
   free( C0 );
 
2155
   free( A0 );
 
2156
 
 
2157
   return( passed );
 
2158
}
 
2159
 
 
2160
int trxmcase
 
2161
(
 
2162
   const enum LVL3_ROUT       ROUT,
 
2163
   const int                  TEST,
 
2164
   const int                  MFLOP,
 
2165
   const enum ATLAS_SIDE      SIDE,
 
2166
   const enum ATLAS_UPLO      UPLO,
 
2167
   const enum ATLAS_TRANS     TRANS,
 
2168
   const enum ATLAS_DIAG      DIAG,
 
2169
   const int                  M,
 
2170
   const int                  N,
 
2171
   const SCALAR               ALPHA,
 
2172
   const int                  LDA,
 
2173
   const int                  LDB,
 
2174
   const TYPE                 EPSILON,
 
2175
   double                     * TTRUST0,
 
2176
   double                     * TTEST0,
 
2177
   double                     * MFTRUST0,
 
2178
   double                     * MFTEST0
 
2179
)
 
2180
{
 
2181
   double                     flops, ttrust, ttest, mftrust, mftest, t0;
 
2182
   TYPE                       resid = ATL_rzero;
 
2183
   TYPE                       * a, * stA, * b, * stB, * A, * A0 = NULL,
 
2184
                              * B, * B0 = NULL;
 
2185
   unsigned long              ir, reps;
 
2186
   int                        inca, incb, lA, lB, nA, passed, Aseed, Bseed;
 
2187
 
 
2188
   flops = opbl3( ROUT, M, N, ( SIDE == AtlasLeft ? -1 : 1 ) );
 
2189
 
 
2190
   if( ( MEGA * MFLOP <= flops ) || ( TEST ) )
 
2191
   {
 
2192
      if( ROUT == TRMM )
 
2193
      {
 
2194
         resid = trmmtst( ROUT, TEST, SIDE, UPLO, TRANS, DIAG, M, N, ALPHA,
 
2195
                          LDA, LDB, EPSILON, TTRUST0, TTEST0, MFTRUST0,
 
2196
                          MFTEST0 );
 
2197
      }
 
2198
      else
 
2199
      {
 
2200
         resid = trsmtst( ROUT, TEST, SIDE, UPLO, TRANS, DIAG, M, N, ALPHA,
 
2201
                          LDA, LDB, EPSILON, TTRUST0, TTEST0, MFTRUST0,
 
2202
                          MFTEST0 );
 
2203
      }
 
2204
      if( resid > THRESH ) (void) fprintf( stderr, "   resid=%f\n", resid );
 
2205
   }
 
2206
   if( resid < ATL_rzero ) passed = -1;
 
2207
   else                    passed = ( resid < THRESH );
 
2208
 
 
2209
   if( MEGA * MFLOP <= flops ) return( passed );
 
2210
 
 
2211
   if( SIDE == AtlasLeft ) { nA = M; } else { nA = N; }
 
2212
 
 
2213
   inca = LDA * ( nA SHIFT );
 
2214
   incb = LDB * ( N  SHIFT );
 
2215
 
 
2216
   lA = inca * ( ( ATL_DivBySize( LCSIZE ) + nA*nA - 1 ) / ( nA * nA ) );
 
2217
   lB = incb * ( ( ATL_DivBySize( LCSIZE ) + M * N - 1 ) / ( M   * N ) );
 
2218
 
 
2219
   A0 = (TYPE *)malloc( ATL_MulBySize( lA ) );
 
2220
   B0 = (TYPE *)malloc( ATL_MulBySize( lB ) );
 
2221
 
 
2222
   if( ( A0 == NULL ) || ( B0 == NULL ) )
 
2223
   { if( A0 ) free( A0 ); if( B0 ) free( B0 ); return( -1 ); }
 
2224
 
 
2225
   A = A0; stA = A0 + ( lA SHIFT );
 
2226
   B = B0; stB = B0 + ( lB SHIFT );
 
2227
 
 
2228
   Aseed = nA * nA + 513 *  7 + 90;
 
2229
   Bseed = M  * N  + 101 *  2 + 53;
 
2230
 
 
2231
   reps  = ( MEGA * MFLOP ) / flops;
 
2232
/*
 
2233
 * Generate the random data and time the trusted routine
 
2234
 */
 
2235
   a = A; b = B;
 
2236
 
 
2237
   Mjoin( PATL, gegen )( lA, 1, A0, lA, Aseed );
 
2238
   Mjoin( PATL, gegen )( lB, 1, B0, lB, Bseed );
 
2239
 
 
2240
   if( ROUT == TRMM )
 
2241
   {
 
2242
      t0 = time00();
 
2243
      for( ir = reps; ir; ir-- )
 
2244
      {
 
2245
         trusted_trmm( SIDE, UPLO, TRANS, DIAG, M, N, ALPHA, a, LDA, b, LDB );
 
2246
         a += inca; if( a == stA ) { a = A; }
 
2247
         b += incb; if( b == stB ) { b = B; }
 
2248
      }
 
2249
      ttrust = time00() - t0;
 
2250
   }
 
2251
   else /* if( ROUT == TRSM ) */
 
2252
   {
 
2253
      do { trddom( UPLO, nA, a, LDA ); a += inca; } while( a != stA ); a = A;
 
2254
 
 
2255
      t0 = time00();
 
2256
      for( ir = reps; ir; ir-- )
 
2257
      {
 
2258
         trusted_trsm( SIDE, UPLO, TRANS, DIAG, M, N, ALPHA, a, LDA, b, LDB );
 
2259
         a += inca; if( a == stA ) { a = A; }
 
2260
         b += incb; if( b == stB ) { b = B; }
 
2261
      }
 
2262
      ttrust = time00() - t0;
 
2263
   }
 
2264
   if( ttrust > 0.0 ) mftrust = ( reps * flops ) / ( MEGA * ttrust );
 
2265
   else               mftrust = 0.0;
 
2266
   ttrust /= reps; *TTRUST0 = ttrust; *MFTRUST0 = mftrust;
 
2267
/*
 
2268
 * Generate the random data and time the tested routine
 
2269
 */
 
2270
   a = A; b = B;
 
2271
 
 
2272
   Mjoin( PATL, gegen )( lA, 1, A0, lA, Aseed );
 
2273
   Mjoin( PATL, gegen )( lB, 1, B0, lB, Bseed );
 
2274
 
 
2275
   if( ROUT == TRMM )
 
2276
   {
 
2277
      t0 = time00();
 
2278
      for( ir = reps; ir; ir-- )
 
2279
      {
 
2280
         test_trmm(    SIDE, UPLO, TRANS, DIAG, M, N, ALPHA, a, LDA, b, LDB );
 
2281
         a += inca; if( a == stA ) { a = A; }
 
2282
         b += incb; if( b == stB ) { b = B; }
 
2283
      }
 
2284
      ttest = time00() - t0;
 
2285
   }
 
2286
   else /* if( ROUT == TRSM ) */
 
2287
   {
 
2288
      do { trddom( UPLO, nA, a, LDA ); a += inca; } while( a != stA ); a = A;
 
2289
 
 
2290
      t0 = time00();
 
2291
      for( ir = reps; ir; ir-- )
 
2292
      {
 
2293
         test_trsm(    SIDE, UPLO, TRANS, DIAG, M, N, ALPHA, a, LDA, b, LDB );
 
2294
         a += inca; if( a == stA ) { a = A; }
 
2295
         b += incb; if( b == stB ) { b = B; }
 
2296
      }
 
2297
      ttest = time00() - t0;
 
2298
   }
 
2299
   if( ttest  > 0.0 ) mftest  = ( reps * flops ) / ( MEGA * ttest  );
 
2300
   else               mftest  = 0.0;
 
2301
   ttest  /= reps; *TTEST0  = ttest;  *MFTEST0  = mftest;
 
2302
/*
 
2303
 * release the memory and exit
 
2304
 */
 
2305
   free( B0 );
 
2306
   free( A0 );
 
2307
 
 
2308
   return( passed );
 
2309
}
 
2310
/*
 
2311
 * =====================================================================
 
2312
 * Run functions
 
2313
 * =====================================================================
 
2314
 */
 
2315
void RungemmCase
 
2316
(
 
2317
   const enum LVL3_ROUT       ROUT,
 
2318
   const int                  TEST,
 
2319
   const int                  MFLOP,
 
2320
   const int                  LDA_IS_M,
 
2321
   const int                  NTRANA,
 
2322
   const enum ATLAS_TRANS     * TRANSA,
 
2323
   const int                  NTRANB,
 
2324
   const enum ATLAS_TRANS     * TRANSB,
 
2325
   int                        M0,
 
2326
   int                        MN,
 
2327
   int                        MINC,
 
2328
   int                        N0,
 
2329
   int                        NN,
 
2330
   int                        NINC,
 
2331
   int                        K0,
 
2332
   int                        KN,
 
2333
   int                        KINC,
 
2334
   const int                  NALPHA,
 
2335
   const TYPE                 * ALPHAS,
 
2336
   const int                  NBETA,
 
2337
   const TYPE                 * BETAS,
 
2338
   const TYPE                 EPSILON,
 
2339
   int                        * NPASSED,
 
2340
   int                        * NTESTS
 
2341
)
 
2342
{
 
2343
   double                     t0, mftrust, mftest, ttrust, ttest;
 
2344
   char                       * pass, * form;
 
2345
   int                        al, be, ires, k, kk, lda, ldb, ldc, m, mm, n,
 
2346
                              nn, ta, tb, ksame=0, msame=0;
 
2347
   char                       ctrana, ctranb;
 
2348
 
 
2349
   if( M0 == -1 ) { msame = 1; M0 = MN = MINC = NN; }
 
2350
   if( K0 == -1 ) { ksame = 1; K0 = KN = KINC = NN; }
 
2351
 
 
2352
#ifdef TREAL
 
2353
   (void) fprintf( stdout, "\n%s%s%s\n",
 
2354
                   "--------------------------------- ", "GEMM",
 
2355
                   " ----------------------------------" );
 
2356
   (void) fprintf( stdout, "%s%s",
 
2357
                   "TST# A B    M    N    K ALPHA  LDA  LDB  BETA",
 
2358
                   "  LDC  TIME MFLOP SpUp  TEST\n" );
 
2359
   (void) fprintf( stdout, "%s%s",
 
2360
                   "==== = = ==== ==== ==== ===== ==== ==== =====",
 
2361
                   " ==== ===== ===== ==== =====\n" );
 
2362
form = "%4d %c %c %4d %4d %4d %5.1f %4d %4d %5.1f %4d %5.2f %5.1f %4.2f %5s\n";
 
2363
#else
 
2364
   (void) fprintf( stdout, "\n%s%s%s\n",
 
2365
                   "----------------------------------- ", "GEMM",
 
2366
                   " ---------------------------------------" );
 
2367
   (void) fprintf( stdout, "%s%s",
 
2368
                   "TST# A B    M    N    K     ALPHA  LDA  LDB",
 
2369
                   "      BETA  LDC TIME MFLOP SpUp  TEST\n" );
 
2370
   (void) fprintf( stdout, "%s%s",
 
2371
                   "==== = = ==== ==== ==== ==== ==== ==== ====",
 
2372
                   " ==== ==== ==== ==== ===== ==== =====\n" );
 
2373
   form =
 
2374
"%4d %c %c %4d %4d %4d %4.1f %4.1f %4d %4d %4.1f %4.1f %4d %4.1f %5.1f %4.2f %5s\n";
 
2375
#endif
 
2376
 
 
2377
   for( mm = M0; mm <= MN; mm += MINC )
 
2378
   {
 
2379
      for( nn = N0; nn <= NN; nn += NINC )
 
2380
      {
 
2381
         n = nn; if( msame ) { m = nn; } else { m = mm; }
 
2382
         if( LDA_IS_M ) ldc = Mmax( 1, m ); else ldc = MN;
 
2383
 
 
2384
         for( kk = K0; kk <= KN; kk += KINC )
 
2385
         {
 
2386
            if( ksame ) { k = nn; } else { k = kk; }
 
2387
 
 
2388
            for( ta = 0; ta < NTRANA; ta++ )
 
2389
            {
 
2390
               if(      TRANSA[ta] == AtlasNoTrans   ) ctrana = 'N';
 
2391
               else if( TRANSA[ta] == AtlasTrans     ) ctrana = 'T';
 
2392
               else                                    ctrana = 'C';
 
2393
 
 
2394
               if(      TRANSA[ta] == AtlasNoTrans   )
 
2395
               { if( LDA_IS_M ) lda = Mmax( 1, m ); else lda = MN; }
 
2396
               else
 
2397
               { if( LDA_IS_M ) lda = Mmax( 1, k ); else lda = KN; }
 
2398
 
 
2399
               for( tb = 0; tb < NTRANB; tb++ )
 
2400
               {
 
2401
                  if(      TRANSB[tb] == AtlasNoTrans   ) ctranb = 'N';
 
2402
                  else if( TRANSB[tb] == AtlasTrans     ) ctranb = 'T';
 
2403
                  else                                    ctranb = 'C';
 
2404
 
 
2405
                  if(      TRANSB[tb] == AtlasNoTrans   )
 
2406
                  { if( LDA_IS_M ) ldb = Mmax( 1, k ); else ldb = KN; }
 
2407
                  else
 
2408
                  { if( LDA_IS_M ) ldb = Mmax( 1, n ); else ldb = NN; }
 
2409
 
 
2410
                  for( al = 0; al < NALPHA; al++ )
 
2411
                  {
 
2412
                     for( be = 0; be < NBETA; be++ )
 
2413
                     {
 
2414
#ifdef TREAL
 
2415
                        ires = gemmcase( ROUT, TEST, MFLOP, TRANSA[ta],
 
2416
                                         TRANSB[tb], m, n, k, ALPHAS[al], lda,
 
2417
                                         ldb, BETAS[be], ldc, EPSILON, &ttrust,
 
2418
                                         &ttest, &mftrust, &mftest );
 
2419
#else
 
2420
                        ires = gemmcase( ROUT, TEST, MFLOP, TRANSA[ta],
 
2421
                                         TRANSB[tb], m, n, k, ALPHAS+2*al, lda,
 
2422
                                         ldb, BETAS+2*be, ldc, EPSILON, &ttrust,
 
2423
                                         &ttest, &mftrust, &mftest );
 
2424
#endif
 
2425
                        if(     !( TEST ) ) pass = "SKIP ";
 
2426
                        else if( ires < 0 ) pass = "NoMEM";
 
2427
                        else if( ires     ) pass = "PASS ";
 
2428
                        else                pass = "FAIL ";
 
2429
 
 
2430
                        if( ires > 0 ) (*NPASSED)++;
 
2431
 
 
2432
                        if( ( mftrust > 0.0 ) && ( mftest > 0.0 ) )
 
2433
                           t0 = mftest / mftrust;
 
2434
                        else t0 = 0.0;
 
2435
#ifdef TREAL
 
2436
                        (void) fprintf( stdout, form, *NTESTS, ctrana, ctranb,
 
2437
                                        m, n, k, ALPHAS[al], lda, ldb,
 
2438
                                        BETAS[be], ldc, ttrust, mftrust, 1.0,
 
2439
                                        "-----" );
 
2440
                        (void) fprintf( stdout, form, *NTESTS, ctrana, ctranb,
 
2441
                                        m, n, k, ALPHAS[al], lda, ldb,
 
2442
                                        BETAS[be], ldc, ttest,  mftest,  t0,
 
2443
                                        pass );
 
2444
#else
 
2445
                        (void) fprintf( stdout, form, *NTESTS, ctrana, ctranb,
 
2446
                                        m, n, k,  ALPHAS[2*al], ALPHAS[2*al+1],
 
2447
                                        lda, ldb, BETAS [2*be], BETAS [2*be+1],
 
2448
                                        ldc, ttrust, mftrust, 1.0, "-----" );
 
2449
                        (void) fprintf( stdout, form, *NTESTS, ctrana, ctranb,
 
2450
                                        m, n, k,  ALPHAS[2*al], ALPHAS[2*al+1],
 
2451
                                        lda, ldb, BETAS [2*be], BETAS [2*be+1],
 
2452
                                        ldc, ttest,  mftest,  t0,  pass );
 
2453
#endif
 
2454
                        (*NTESTS)++;
 
2455
                     }
 
2456
                  }
 
2457
               }
 
2458
            }
 
2459
         }
 
2460
      }
 
2461
   }
 
2462
}
 
2463
 
 
2464
void RunsymmCase
 
2465
(
 
2466
   const enum LVL3_ROUT       ROUT,
 
2467
   const int                  TEST,
 
2468
   const int                  MFLOP,
 
2469
   const int                  LDA_IS_M,
 
2470
   const int                  NSIDE,
 
2471
   const enum ATLAS_SIDE      * SIDES,
 
2472
   const int                  NUPLO,
 
2473
   const enum ATLAS_UPLO      * UPLOS,
 
2474
   int                        M0,
 
2475
   int                        MN,
 
2476
   int                        MINC,
 
2477
   int                        N0,
 
2478
   int                        NN,
 
2479
   int                        NINC,
 
2480
   const int                  NALPHA,
 
2481
   const TYPE                 * ALPHAS,
 
2482
   const int                  NBETA,
 
2483
   const TYPE                 * BETAS,
 
2484
   const TYPE                 EPSILON,
 
2485
   int                        * NPASSED,
 
2486
   int                        * NTESTS
 
2487
)
 
2488
{
 
2489
   double                     t0, mftrust, mftest, ttrust, ttest;
 
2490
   char                       * pass, * form;
 
2491
   int                        al, be, ires, lda, ldb, ldc, m, msame=0, mm, n,
 
2492
                              nn, si, up;
 
2493
   char                       cside, cuplo;
 
2494
 
 
2495
   if( M0 == -1 ) { msame = 1; M0 = MN = MINC = NN; }
 
2496
 
 
2497
#ifdef TREAL
 
2498
   (void) fprintf( stdout, "\n%s%s%s\n",
 
2499
                   "-------------------------------- ", "SYMM",
 
2500
                   " --------------------------------" );
 
2501
   (void) fprintf( stdout, "%s%s",
 
2502
                   "TST# S U    M    N ALPHA  LDA  LDB  BETA  LDC",
 
2503
                   "   TIME MFLOP  SpUp  TEST\n" );
 
2504
   (void) fprintf( stdout, "%s%s",
 
2505
                   "==== = = ==== ==== ===== ==== ==== ===== ====",
 
2506
                   " ====== ===== ===== =====\n" );
 
2507
   form = "%4d %c %c %4d %4d %5.1f %4d %4d %5.1f %4d %6.2f %5.1f %5.2f %5s\n";
 
2508
#else
 
2509
   if( ROUT == SYMM )
 
2510
   {
 
2511
      (void) fprintf( stdout, "\n%s%s%s\n",
 
2512
                      "------------------------------------ ", "SYMM",
 
2513
                      " ------------------------------------" );
 
2514
      (void) fprintf( stdout, "%s%s",
 
2515
                      "TST# S U    M    N     ALPHA  LDA  LDB      BETA",
 
2516
                      "  LDC   TIME MFLOP  SpUp  TEST\n" );
 
2517
      (void) fprintf( stdout, "%s%s",
 
2518
                      "==== = = ==== ==== ==== ==== ==== ==== ==== ====",
 
2519
                      " ==== ====== ===== ===== =====\n" );
 
2520
      form =
 
2521
"%4d %c %c %4d %4d %4.1f %4.1f %4d %4d %4.1f %4.1f %4d %6.2f %5.1f %5.2f %5s\n";
 
2522
   }
 
2523
   else
 
2524
   {
 
2525
      (void) fprintf( stdout, "\n%s%s%s\n",
 
2526
                      "------------------------------------ ", "HEMM",
 
2527
                      " ------------------------------------" );
 
2528
      (void) fprintf( stdout, "%s%s",
 
2529
                      "TST# S U    M    N     ALPHA  LDA  LDB      BETA",
 
2530
                      "  LDC   TIME MFLOP  SpUp  TEST\n" );
 
2531
      (void) fprintf( stdout, "%s%s",
 
2532
                      "==== = = ==== ==== ==== ==== ==== ==== ==== ====",
 
2533
                      " ==== ====== ===== ===== =====\n" );
 
2534
      form =
 
2535
"%4d %c %c %4d %4d %4.1f %4.1f %4d %4d %4.1f %4.1f %4d %6.2f %5.1f %5.2f %5s\n";
 
2536
   }
 
2537
#endif
 
2538
   for( mm = M0; mm <= MN; mm += MINC )
 
2539
   {
 
2540
      for( nn = N0; nn <= NN; nn += NINC )
 
2541
      {
 
2542
         n = nn; if( msame ) { m = nn; } else { m = mm; }
 
2543
         if( LDA_IS_M ) { ldb = ldc = Mmax( 1, m ); } else { ldb = ldc = MN; }
 
2544
 
 
2545
         for( si = 0; si < NSIDE; si++ )
 
2546
         {
 
2547
            if( SIDES[si] == AtlasLeft )
 
2548
            { cside = 'L'; if( LDA_IS_M ) lda = Mmax( 1, m ); else lda = MN; }
 
2549
            else
 
2550
            { cside = 'R'; if( LDA_IS_M ) lda = Mmax( 1, n ); else lda = NN; }
 
2551
 
 
2552
            for( up = 0; up < NUPLO; up++ )
 
2553
            {
 
2554
               if( UPLOS[up] == AtlasLower ) cuplo = 'L';
 
2555
               else                          cuplo = 'U';
 
2556
 
 
2557
               for( al = 0; al < NALPHA; al++ )
 
2558
               {
 
2559
                  for( be = 0; be < NBETA; be++ )
 
2560
                  {
 
2561
#ifdef TREAL
 
2562
                     ires = symmcase( ROUT, TEST, MFLOP, SIDES[si], UPLOS[up],
 
2563
                                      m, n, ALPHAS[al], lda, ldb, BETAS[be],
 
2564
                                      ldc, EPSILON, &ttrust, &ttest, &mftrust,
 
2565
                                      &mftest );
 
2566
#else
 
2567
                     ires = symmcase( ROUT, TEST, MFLOP, SIDES[si], UPLOS[up],
 
2568
                                      m, n, ALPHAS+2*al, lda, ldb, BETAS+2*be,
 
2569
                                      ldc, EPSILON, &ttrust, &ttest, &mftrust,
 
2570
                                      &mftest );
 
2571
#endif
 
2572
                     if(     !( TEST ) ) pass = "SKIP ";
 
2573
                     else if( ires < 0 ) pass = "NoMEM";
 
2574
                     else if( ires     ) pass = "PASS ";
 
2575
                     else                pass = "FAIL ";
 
2576
 
 
2577
                     if( ires > 0 ) (*NPASSED)++;
 
2578
 
 
2579
                     if( ( mftrust > 0.0 ) && ( mftest > 0.0 ) )
 
2580
                        t0 = mftest / mftrust;
 
2581
                     else t0 = 0.0;
 
2582
#ifdef TREAL
 
2583
                     (void) fprintf( stdout, form, *NTESTS, cside, cuplo, m, n,
 
2584
                                     ALPHAS[al], lda, ldb, BETAS[be], ldc,
 
2585
                                     ttrust, mftrust, 1.0, "-----" );
 
2586
                     (void) fprintf( stdout, form, *NTESTS, cside, cuplo, m, n,
 
2587
                                     ALPHAS[al], lda, ldb, BETAS[be], ldc,
 
2588
                                     ttest,  mftest,  t0,  pass    );
 
2589
#else
 
2590
                     (void) fprintf( stdout, form, *NTESTS, cside, cuplo, m, n,
 
2591
                                     ALPHAS[2*al], ALPHAS[2*al+1], lda, ldb,
 
2592
                                     BETAS[2*be], BETAS[2*be+1], ldc, ttrust,
 
2593
                                     mftrust, 1.0, "-----" );
 
2594
                     (void) fprintf( stdout, form, *NTESTS, cside, cuplo, m, n,
 
2595
                                     ALPHAS[2*al], ALPHAS[2*al+1], lda, ldb,
 
2596
                                     BETAS[2*be], BETAS[2*be+1], ldc, ttest,
 
2597
                                     mftest,  t0,  pass    );
 
2598
#endif
 
2599
                     (*NTESTS)++;
 
2600
                  }
 
2601
               }
 
2602
            }
 
2603
         }
 
2604
      }
 
2605
   }
 
2606
}
 
2607
 
 
2608
void Runsyr2kCase
 
2609
(
 
2610
   const enum LVL3_ROUT       ROUT,
 
2611
   const int                  TEST,
 
2612
   const int                  MFLOP,
 
2613
   const int                  LDA_IS_M,
 
2614
   const int                  NUPLO,
 
2615
   const enum ATLAS_UPLO      * UPLOS,
 
2616
   const int                  NTRAN,
 
2617
   const enum ATLAS_TRANS     * TRANS,
 
2618
   int                        N0,
 
2619
   int                        NN,
 
2620
   int                        NINC,
 
2621
   int                        K0,
 
2622
   int                        KN,
 
2623
   int                        KINC,
 
2624
   const int                  NALPHA,
 
2625
   const TYPE                 * ALPHAS,
 
2626
   const int                  NBETA,
 
2627
   const TYPE                 * BETAS,
 
2628
   const TYPE                 EPSILON,
 
2629
   int                        * NPASSED,
 
2630
   int                        * NTESTS
 
2631
)
 
2632
{
 
2633
   double                     t0, mftrust, mftest, ttrust, ttest;
 
2634
   char                       * pass, * form;
 
2635
   int                        al, be, ires, k, kk, ksame=0, lda, ldb, ldc, n,
 
2636
                              nn, up, ta;
 
2637
   char                       ctran, cuplo;
 
2638
 
 
2639
   if( K0 == -1 ) { ksame = 1; K0 = KN = KINC = NN; }
 
2640
 
 
2641
#ifdef TREAL
 
2642
   (void) fprintf( stdout, "\n%s%s%s\n",
 
2643
                   "-------------------------------- ", "SYR2K",
 
2644
                   " --------------------------------" );
 
2645
   (void) fprintf( stdout, "%s%s",
 
2646
                   "TST# U T    N    K ALPHA  LDA  LDB  BETA  LDC   TIME",
 
2647
                   "  MFLOP  SpUp  TEST\n" );
 
2648
   (void) fprintf( stdout, "%s%s",
 
2649
                   "==== = = ==== ==== ===== ==== ==== ===== ==== ======",
 
2650
                   " ====== ===== =====\n" );
 
2651
   form = "%4d %c %c %4d %4d %5.1f %4d %4d %5.1f %4d %6.2f %6.1f %5.2f %5s\n";
 
2652
#else
 
2653
   if( ROUT == SYR2K )
 
2654
   {
 
2655
      (void) fprintf( stdout, "\n%s%s%s\n",
 
2656
                      "------------------------------------ ", "SYR2K",
 
2657
                      " ------------------------------------" );
 
2658
      (void) fprintf( stdout, "%s%s",
 
2659
                      "TST# U T    N    K     ALPHA  LDA  LDB      BETA",
 
2660
                      "  LDC   TIME  MFLOP  SpUp  TEST\n" );
 
2661
      (void) fprintf( stdout, "%s%s",
 
2662
                      "==== = = ==== ==== ==== ==== ==== ==== ==== ====",
 
2663
                      " ==== ====== ====== ===== =====\n" );
 
2664
      form =
 
2665
"%4d %c %c %4d %4d %4.1f %4.1f %4d %4d %4.1f %4.1f %4d %6.2f %6.1f %5.2f %5s\n";
 
2666
   }
 
2667
   else
 
2668
   {
 
2669
      (void) fprintf( stdout, "\n%s%s%s\n",
 
2670
                      "----------------------------------- ", "HER2K",
 
2671
                      " -----------------------------------" );
 
2672
      (void) fprintf( stdout, "%s%s",
 
2673
                      "TST# U T    N    K       ALPHA  LDA  LDB  BETA",
 
2674
                      "  LDC   TIME  MFLOP  SpUp  TEST\n" );
 
2675
      (void) fprintf( stdout, "%s%s",
 
2676
                      "==== = = ==== ==== ===== ===== ==== ==== =====",
 
2677
                      " ==== ====== ====== ===== =====\n" );
 
2678
      form =
 
2679
      "%4d %c %c %4d %4d %5.1f %5.1f %4d %4d %5.1f %4d %6.2f %6.1f %5.2f %5s\n";
 
2680
   }
 
2681
#endif
 
2682
   for( nn = N0; nn <= NN; nn += NINC )
 
2683
   {
 
2684
      n = nn; if( LDA_IS_M ) ldc = Mmax( 1, n ); else ldc = NN;
 
2685
 
 
2686
      for( kk = K0; kk <= KN; kk += KINC )
 
2687
      {
 
2688
         if( ksame ) { k = nn; } else { k = kk; }
 
2689
 
 
2690
         for( up = 0; up < NUPLO; up++ )
 
2691
         {
 
2692
            if( UPLOS[up] == AtlasUpper ) cuplo = 'U';
 
2693
            else                          cuplo = 'L';
 
2694
 
 
2695
            for( ta = 0; ta < NTRAN; ta++ )
 
2696
            {
 
2697
#ifdef TREAL
 
2698
               if( TRANS[ta] == AtlasNoTrans )
 
2699
               {
 
2700
                  ctran = 'N';
 
2701
                  if( LDA_IS_M ) lda = ldb = n; else lda = ldb = NN;
 
2702
               }
 
2703
               else
 
2704
               {
 
2705
                  ctran = 'T';
 
2706
                  if( LDA_IS_M ) lda = ldb = k; else lda = ldb = KN;
 
2707
               }
 
2708
#else
 
2709
               if( ROUT == SYR2K )
 
2710
               {
 
2711
                  if( TRANS[ta] == AtlasNoTrans )
 
2712
                  {
 
2713
                     ctran = 'N';
 
2714
                     if( LDA_IS_M ) lda = ldb = n; else lda = ldb = NN;
 
2715
                  }
 
2716
                  else
 
2717
                  {
 
2718
                     ctran = 'T';
 
2719
                     if( LDA_IS_M ) lda = ldb = k; else lda = ldb = KN;
 
2720
                  }
 
2721
               }
 
2722
               else
 
2723
               {
 
2724
                  if( TRANS[ta] == AtlasNoTrans )
 
2725
                  {
 
2726
                     ctran = 'N';
 
2727
                     if( LDA_IS_M ) lda = ldb = n; else lda = ldb = NN;
 
2728
                  }
 
2729
                  else
 
2730
                  {
 
2731
                     ctran = 'C';
 
2732
                     if( LDA_IS_M ) lda = ldb = k; else lda = ldb = KN;
 
2733
                  }
 
2734
               }
 
2735
#endif
 
2736
               for( al = 0; al < NALPHA; al++ )
 
2737
               {
 
2738
                  for( be = 0; be < NBETA; be++ )
 
2739
                  {
 
2740
#ifdef TREAL
 
2741
                     ires = syr2kcase( ROUT, TEST, MFLOP, UPLOS[up], TRANS[ta],
 
2742
                                       n, k, ALPHAS[al], lda, ldb, BETAS[be],
 
2743
                                       ldc, EPSILON, &ttrust, &ttest, &mftrust,
 
2744
                                       &mftest );
 
2745
#else
 
2746
                     ires = syr2kcase( ROUT, TEST, MFLOP, UPLOS[up], TRANS[ta],
 
2747
                                       n, k, ALPHAS+2*al, lda, ldb, BETAS+2*be,
 
2748
                                       ldc, EPSILON, &ttrust, &ttest, &mftrust,
 
2749
                                       &mftest );
 
2750
#endif
 
2751
                     if(     !( TEST ) ) pass = "SKIP ";
 
2752
                     else if( ires < 0 ) pass = "NoMEM";
 
2753
                     else if( ires     ) pass = "PASS ";
 
2754
                     else                pass = "FAIL ";
 
2755
 
 
2756
                     if( ires > 0 ) (*NPASSED)++;
 
2757
 
 
2758
                     if( ( mftrust > 0.0 ) && ( mftest > 0.0 ) )
 
2759
                        t0 = mftest / mftrust;
 
2760
                     else t0 = 0.0;
 
2761
#ifdef TREAL
 
2762
                     (void) fprintf( stdout, form, *NTESTS, cuplo, ctran, n, k,
 
2763
                                     ALPHAS[al], lda, ldb, BETAS[be], ldc,
 
2764
                                     ttrust, mftrust, 1.0, "-----" );
 
2765
                     (void) fprintf( stdout, form, *NTESTS, cuplo, ctran, n, k,
 
2766
                                     ALPHAS[al], lda, ldb, BETAS[be], ldc,
 
2767
                                     ttest, mftest, t0, pass );
 
2768
#else
 
2769
                     if( ROUT == SYR2K )
 
2770
                     {
 
2771
                        (void) fprintf( stdout, form, *NTESTS, cuplo, ctran,
 
2772
                                        n, k, ALPHAS[2*al], ALPHAS[2*al+1],
 
2773
                                        lda, ldb, BETAS [2*be], BETAS [2*be+1],
 
2774
                                        ldc, ttrust, mftrust, 1.0, "-----" );
 
2775
                        (void) fprintf( stdout, form, *NTESTS, cuplo, ctran,
 
2776
                                        n, k, ALPHAS[2*al], ALPHAS[2*al+1],
 
2777
                                        lda, ldb, BETAS [2*be], BETAS [2*be+1],
 
2778
                                        ldc, ttest, mftest, t0, pass );
 
2779
                     }
 
2780
                     else
 
2781
                     {
 
2782
                        (void) fprintf( stdout, form, *NTESTS, cuplo, ctran,
 
2783
                                        n, k, ALPHAS[2*al], ALPHAS[2*al+1],
 
2784
                                        lda, ldb, BETAS [2*be], ldc, ttrust,
 
2785
                                        mftrust, 1.0, "-----" );
 
2786
                        (void) fprintf( stdout, form, *NTESTS, cuplo, ctran,
 
2787
                                        n, k, ALPHAS[2*al], ALPHAS[2*al+1],
 
2788
                                        lda, ldb, BETAS [2*be], ldc, ttest,
 
2789
                                        mftest, t0, pass );
 
2790
                     }
 
2791
#endif
 
2792
                     (*NTESTS)++;
 
2793
                  }
 
2794
               }
 
2795
            }
 
2796
         }
 
2797
      }
 
2798
   }
 
2799
}
 
2800
 
 
2801
void RunsyrkCase
 
2802
(
 
2803
   const enum LVL3_ROUT       ROUT,
 
2804
   const int                  TEST,
 
2805
   const int                  MFLOP,
 
2806
   const int                  LDA_IS_M,
 
2807
   const int                  NUPLO,
 
2808
   const enum ATLAS_UPLO      * UPLOS,
 
2809
   const int                  NTRAN,
 
2810
   const enum ATLAS_TRANS     * TRANS,
 
2811
   int                        N0,
 
2812
   int                        NN,
 
2813
   int                        NINC,
 
2814
   int                        K0,
 
2815
   int                        KN,
 
2816
   int                        KINC,
 
2817
   const int                  NALPHA,
 
2818
   const TYPE                 * ALPHAS,
 
2819
   const int                  NBETA,
 
2820
   const TYPE                 * BETAS,
 
2821
   const TYPE                 EPSILON,
 
2822
   int                        * NPASSED,
 
2823
   int                        * NTESTS
 
2824
)
 
2825
{
 
2826
   double                     t0, mftrust, mftest, ttrust, ttest;
 
2827
   char                       * pass, * form;
 
2828
   int                        al, be, ires, k, kk, ksame=0, lda, ldc, n, nn,
 
2829
                              up, ta;
 
2830
   char                       ctran, cuplo;
 
2831
 
 
2832
   if( K0 == -1 ) { ksame = 1; K0 = KN = KINC = NN; }
 
2833
 
 
2834
#ifdef TREAL
 
2835
   (void) fprintf( stdout, "\n%s%s%s\n",
 
2836
                   "------------------------------ ", "SYRK",
 
2837
                   " ------------------------------" );
 
2838
   (void) fprintf( stdout, "%s%s",
 
2839
                   "TST# U T    N    K ALPHA  LDA  BETA  LDC   TIME",
 
2840
                   "  MFLOP  SpUp  TEST\n" );
 
2841
   (void) fprintf( stdout, "%s%s",
 
2842
                   "==== = = ==== ==== ===== ==== ===== ==== ======",
 
2843
                   " ====== ===== =====\n" );
 
2844
   form = "%4d %c %c %4d %4d %5.1f %4d %5.1f %4d %6.2f %6.1f %5.2f %5s\n";
 
2845
#else
 
2846
   if( ROUT == SYRK )
 
2847
   {
 
2848
      (void) fprintf( stdout, "\n%s%s%s\n",
 
2849
                      "------------------------------------ ", "SYRK",
 
2850
                      " ------------------------------------" );
 
2851
      (void) fprintf( stdout, "%s%s",
 
2852
                      "TST# U T    N    K       ALPHA  LDA        BETA",
 
2853
                      "  LDC   TIME  MFLOP  SpUp  TEST\n" );
 
2854
      (void) fprintf( stdout, "%s%s",
 
2855
                      "==== = = ==== ==== ===== ===== ==== ===== =====",
 
2856
                      " ==== ====== ====== ===== =====\n" );
 
2857
      form =
 
2858
    "%4d %c %c %4d %4d %5.1f %5.1f %4d %5.1f %5.1f %4d %6.2f %6.1f %5.2f %5s\n";
 
2859
   }
 
2860
   else
 
2861
   {
 
2862
      (void) fprintf( stdout, "\n%s%s%s\n",
 
2863
                      "------------------------------ ", "HERK",
 
2864
                      " ------------------------------" );
 
2865
      (void) fprintf( stdout, "%s%s",
 
2866
                      "TST# U T    N    K ALPHA  LDA  BETA",
 
2867
                      "  LDC   TIME  MFLOP  SpUp  TEST\n" );
 
2868
      (void) fprintf( stdout, "%s%s",
 
2869
                      "==== = = ==== ==== ===== ==== =====",
 
2870
                      " ==== ====== ====== ===== =====\n" );
 
2871
      form = "%4d %c %c %4d %4d %5.1f %4d %5.1f %4d %6.2f %6.1f %5.2f %5s\n";
 
2872
   }
 
2873
#endif
 
2874
   for( nn = N0; nn <= NN; nn += NINC )
 
2875
   {
 
2876
      n = nn; if( LDA_IS_M ) ldc = Mmax( 1, n ); else ldc = NN;
 
2877
 
 
2878
      for( kk = K0; kk <= KN; kk += KINC )
 
2879
      {
 
2880
         if( ksame ) { k = nn; } else { k = kk; }
 
2881
 
 
2882
         for( up = 0; up < NUPLO; up++ )
 
2883
         {
 
2884
            if( UPLOS[up] == AtlasUpper ) cuplo = 'U';
 
2885
            else                          cuplo = 'L';
 
2886
 
 
2887
            for( ta = 0; ta < NTRAN; ta++ )
 
2888
            {
 
2889
#ifdef TREAL
 
2890
               if( TRANS[ta] == AtlasNoTrans )
 
2891
               { ctran = 'N'; if( LDA_IS_M ) lda = n; else lda = NN; }
 
2892
               else
 
2893
               { ctran = 'T'; if( LDA_IS_M ) lda = k; else lda = KN; }
 
2894
#else
 
2895
               if( ROUT == SYRK )
 
2896
               {
 
2897
                  if( TRANS[ta] == AtlasNoTrans )
 
2898
                  { ctran = 'N'; if( LDA_IS_M ) lda = n; else lda = NN; }
 
2899
                  else
 
2900
                  { ctran = 'T'; if( LDA_IS_M ) lda = k; else lda = KN; }
 
2901
               }
 
2902
               else
 
2903
               {
 
2904
                  if( TRANS[ta] == AtlasNoTrans )
 
2905
                  { ctran = 'N'; if( LDA_IS_M ) lda = n; else lda = NN; }
 
2906
                  else
 
2907
                  { ctran = 'C'; if( LDA_IS_M ) lda = k; else lda = KN; }
 
2908
               }
 
2909
#endif
 
2910
               for( al = 0; al < NALPHA; al++ )
 
2911
               {
 
2912
                  for( be = 0; be < NBETA; be++ )
 
2913
                  {
 
2914
#ifdef TREAL
 
2915
                     ires = syrkcase( ROUT, TEST, MFLOP, UPLOS[up], TRANS[ta],
 
2916
                                      n, k, ALPHAS[al], lda, BETAS[be], ldc,
 
2917
                                      EPSILON, &ttrust, &ttest, &mftrust,
 
2918
                                      &mftest );
 
2919
#else
 
2920
                     ires = syrkcase( ROUT, TEST, MFLOP, UPLOS[up], TRANS[ta],
 
2921
                                      n, k, ALPHAS+2*al, lda, BETAS+2*be, ldc,
 
2922
                                      EPSILON, &ttrust, &ttest, &mftrust,
 
2923
                                      &mftest );
 
2924
#endif
 
2925
                     if(     !( TEST ) ) pass = "SKIP ";
 
2926
                     else if( ires < 0 ) pass = "NoMEM";
 
2927
                     else if( ires     ) pass = "PASS ";
 
2928
                     else                pass = "FAIL ";
 
2929
 
 
2930
                     if( ires > 0 ) (*NPASSED)++;
 
2931
 
 
2932
                     if( ( mftrust > 0.0 ) && ( mftest > 0.0 ) )
 
2933
                        t0 = mftest / mftrust;
 
2934
                     else t0 = 0.0;
 
2935
#ifdef TREAL
 
2936
                     (void) fprintf( stdout, form, *NTESTS, cuplo, ctran, n, k,
 
2937
                                     ALPHAS[al], lda, BETAS[be], ldc, ttrust,
 
2938
                                     mftrust, 1.0, "-----" );
 
2939
                     (void) fprintf( stdout, form, *NTESTS, cuplo, ctran, n, k,
 
2940
                                     ALPHAS[al], lda, BETAS[be], ldc, ttest,
 
2941
                                     mftest, t0, pass );
 
2942
#else
 
2943
                     if( ROUT == SYRK )
 
2944
                     {
 
2945
                        (void) fprintf( stdout, form, *NTESTS, cuplo, ctran,
 
2946
                                        n, k, ALPHAS[2*al], ALPHAS[2*al+1],
 
2947
                                        lda, BETAS [2*be], BETAS [2*be+1],
 
2948
                                        ldc, ttrust, mftrust, 1.0, "-----" );
 
2949
                        (void) fprintf( stdout, form, *NTESTS, cuplo, ctran,
 
2950
                                        n, k, ALPHAS[2*al], ALPHAS[2*al+1],
 
2951
                                        lda, BETAS [2*be], BETAS [2*be+1],
 
2952
                                        ldc, ttest, mftest, t0, pass );
 
2953
                     }
 
2954
                     else
 
2955
                     {
 
2956
                        (void) fprintf( stdout, form, *NTESTS, cuplo, ctran,
 
2957
                                        n, k, ALPHAS[2*al], lda, BETAS[2*be],
 
2958
                                        ldc, ttrust, mftrust, 1.0, "-----" );
 
2959
                        (void) fprintf( stdout, form, *NTESTS, cuplo, ctran,
 
2960
                                        n, k, ALPHAS[2*al], lda, BETAS[2*be],
 
2961
                                        ldc, ttest, mftest, t0, pass );
 
2962
                     }
 
2963
#endif
 
2964
                     (*NTESTS)++;
 
2965
                  }
 
2966
               }
 
2967
            }
 
2968
         }
 
2969
      }
 
2970
   }
 
2971
}
 
2972
 
 
2973
void RuntrxmCase
 
2974
(
 
2975
   const enum LVL3_ROUT       ROUT,
 
2976
   const int                  TEST,
 
2977
   const int                  MFLOP,
 
2978
   const int                  LDA_IS_M,
 
2979
   const int                  NSIDE,
 
2980
   const enum ATLAS_SIDE      * SIDES,
 
2981
   const int                  NUPLO,
 
2982
   const enum ATLAS_UPLO      * UPLOS,
 
2983
   const int                  NTRAN,
 
2984
   const enum ATLAS_TRANS     * TRANS,
 
2985
   const int                  NDIAG,
 
2986
   const enum ATLAS_DIAG      * DIAGS,
 
2987
   int                        M0,
 
2988
   int                        MN,
 
2989
   int                        MINC,
 
2990
   int                        N0,
 
2991
   int                        NN,
 
2992
   int                        NINC,
 
2993
   const int                  NALPHA,
 
2994
   const TYPE                 * ALPHAS,
 
2995
   const TYPE                 EPSILON,
 
2996
   int                        * NPASSED,
 
2997
   int                        * NTESTS
 
2998
)
 
2999
{
 
3000
   double                     t0, mftrust, mftest, ttrust, ttest;
 
3001
   char                       * pass, * form;
 
3002
   int                        al, si, up, ta, di, ires, lda, ldb, m, mm,
 
3003
                              msame=0, n, nn;
 
3004
   char                       cside, ctran, cdiag, cuplo;
 
3005
 
 
3006
   if( M0 == -1 ) { msame = 1; M0 = MN = MINC = NN; }
 
3007
 
 
3008
#ifdef TREAL
 
3009
   if( ROUT == TRMM )
 
3010
      (void) fprintf( stdout, "\n%s%s%s\n",
 
3011
                      "---------------------------", " TRMM ",
 
3012
                      "----------------------------" );
 
3013
   else
 
3014
      (void) fprintf( stdout, "\n%s%s%s\n",
 
3015
                      "---------------------------", " TRSM ",
 
3016
                      "----------------------------" );
 
3017
   (void) fprintf( stdout, "%s%s",
 
3018
                   "TST# S U T D    M    N ALPHA  LDA  LDB  TIME",
 
3019
                   " MFLOP SpUp  TEST\n" );
 
3020
   (void) fprintf( stdout, "%s%s",
 
3021
                   "==== = = = = ==== ==== ===== ==== ==== =====",
 
3022
                   " ===== ==== =====\n" );
 
3023
   form = "%4d %c %c %c %c %4d %4d %5.1f %4d %4d %5.2f %5.1f %4.2f %5s\n";
 
3024
#else
 
3025
   if( ROUT == TRMM )
 
3026
      (void) fprintf( stdout, "\n%s%s%s\n",
 
3027
                      "------------------------------", " TRMM ",
 
3028
                      "-------------------------------" );
 
3029
   else
 
3030
      (void) fprintf( stdout, "\n%s%s%s\n",
 
3031
                      "------------------------------", " TRSM ",
 
3032
                      "-------------------------------" );
 
3033
   (void) fprintf( stdout, "%s%s",
 
3034
                   "TST# S U T D    M    N       ALPHA  LDA  LDB  TIME",
 
3035
                   " MFLOP SpUp  TEST\n" );
 
3036
   (void) fprintf( stdout, "%s%s",
 
3037
                   "==== = = = = ==== ==== ===== ===== ==== ==== =====",
 
3038
                   " ===== ==== =====\n" );
 
3039
   form = "%4d %c %c %c %c %4d %4d %5.1f %5.1f %4d %4d %5.2f %5.1f %4.2f %5s\n";
 
3040
#endif
 
3041
   for( mm = M0; mm <= MN; mm += MINC )
 
3042
   {
 
3043
      for( nn = N0; nn <= NN; nn += NINC )
 
3044
      {
 
3045
         n = nn; if( msame ) { m = nn; } else { m = mm; }
 
3046
         if( LDA_IS_M ) { ldb = Mmax( 1, m ); } else { ldb = MN; }
 
3047
 
 
3048
         for( si = 0; si < NSIDE; si++ )
 
3049
         {
 
3050
            if( SIDES[si] == AtlasLeft )
 
3051
            { cside = 'L'; if( LDA_IS_M ) lda = Mmax( 1, m ); else lda = MN; }
 
3052
            else
 
3053
            { cside = 'R'; if( LDA_IS_M ) lda = Mmax( 1, n ); else lda = NN; }
 
3054
 
 
3055
            for( up = 0; up < NUPLO; up++ )
 
3056
            {
 
3057
               if( UPLOS[up] == AtlasUpper ) cuplo = 'U';
 
3058
               else                          cuplo = 'L';
 
3059
 
 
3060
               for( ta = 0; ta < NTRAN; ta++ )
 
3061
               {
 
3062
                  if(      TRANS[ta] == AtlasNoTrans   ) ctran = 'N';
 
3063
                  else if( TRANS[ta] == AtlasTrans     ) ctran = 'T';
 
3064
                  else                                   ctran = 'C';
 
3065
 
 
3066
                  for( di = 0; di < NDIAG; di++ )
 
3067
                  {
 
3068
                     if( DIAGS[di] == AtlasUnit ) cdiag = 'U';
 
3069
                     else                         cdiag = 'N';
 
3070
 
 
3071
                     for( al = 0; al < NALPHA; al++ )
 
3072
                     {
 
3073
#ifdef TREAL
 
3074
                        ires = trxmcase( ROUT, TEST, MFLOP, SIDES[si],
 
3075
                                         UPLOS[up], TRANS[ta], DIAGS[di],
 
3076
                                         m, n, ALPHAS[al], lda, ldb, EPSILON,
 
3077
                                         &ttrust, &ttest, &mftrust, &mftest );
 
3078
#else
 
3079
                        ires = trxmcase( ROUT, TEST, MFLOP, SIDES[si],
 
3080
                                         UPLOS[up], TRANS[ta], DIAGS[di],
 
3081
                                         m, n, ALPHAS+2*al, lda, ldb, EPSILON,
 
3082
                                         &ttrust, &ttest, &mftrust, &mftest );
 
3083
#endif
 
3084
                        if(     !( TEST ) ) pass = "SKIP ";
 
3085
                        else if( ires < 0 ) pass = "NoMEM";
 
3086
                        else if( ires     ) pass = "PASS ";
 
3087
                        else                pass = "FAIL ";
 
3088
 
 
3089
                        if( ires > 0 ) (*NPASSED)++;
 
3090
 
 
3091
                        if( ( mftrust > 0.0 ) && ( mftest > 0.0 ) )
 
3092
                           t0 = mftest / mftrust;
 
3093
                        else t0 = 0.0;
 
3094
#ifdef TREAL
 
3095
                        (void) fprintf( stdout, form, *NTESTS, cside, cuplo,
 
3096
                                        ctran, cdiag, m, n, ALPHAS[al], lda,
 
3097
                                        ldb, ttrust, mftrust, 1.0, "-----" );
 
3098
                        (void) fprintf( stdout, form, *NTESTS, cside, cuplo,
 
3099
                                        ctran, cdiag, m, n, ALPHAS[al], lda,
 
3100
                                        ldb, ttest, mftest,  t0,  pass   );
 
3101
#else
 
3102
                        (void) fprintf( stdout, form, *NTESTS, cside, cuplo,
 
3103
                                        ctran, cdiag, m, n, ALPHAS[2*al],
 
3104
                                        ALPHAS[2*al+1], lda, ldb, ttrust,
 
3105
                                        mftrust, 1.0, "-----" );
 
3106
                        (void) fprintf( stdout, form, *NTESTS, cside, cuplo,
 
3107
                                        ctran, cdiag, m, n, ALPHAS[2*al],
 
3108
                                        ALPHAS[2*al+1], lda, ldb, ttest,
 
3109
                                        mftest,  t0,  pass    );
 
3110
#endif
 
3111
                        (*NTESTS)++;
 
3112
                     }
 
3113
                  }
 
3114
               }
 
3115
            }
 
3116
         }
 
3117
      }
 
3118
   }
 
3119
}
 
3120
 
 
3121
void RunCases
 
3122
(
 
3123
   const int                  TEST,
 
3124
   const int                  MFLOP,
 
3125
   const int                  LDA_IS_M,
 
3126
   const int                  NSIDE,
 
3127
   const enum ATLAS_SIDE      * SIDES,
 
3128
   const int                  NUPLO,
 
3129
   const enum ATLAS_UPLO      * UPLOS,
 
3130
   const int                  NTRANA,
 
3131
   const enum ATLAS_TRANS     * TRANSA,
 
3132
   const int                  NTRANB,
 
3133
   const enum ATLAS_TRANS     * TRANSB,
 
3134
   const int                  NDIAG,
 
3135
   const enum ATLAS_DIAG      * DIAGS,
 
3136
   const int                  M0,
 
3137
   const int                  MN,
 
3138
   const int                  MINC,
 
3139
   const int                  N0,
 
3140
   const int                  NN,
 
3141
   const int                  NINC,
 
3142
   const int                  K0,
 
3143
   const int                  KN,
 
3144
   const int                  KINC,
 
3145
   const int                  NALPHA,
 
3146
   const TYPE                 * ALPHAS,
 
3147
   const int                  NBETA,
 
3148
   const TYPE                 * BETAS,
 
3149
   const int                  NROUT,
 
3150
   const enum LVL3_ROUT       * ROUTS
 
3151
)
 
3152
{
 
3153
   TYPE                       eps;
 
3154
   int                        ro, ntests=0, np=0;
 
3155
 
 
3156
   eps = Mjoin( PATL, epsilon )();
 
3157
 
 
3158
   for( ro = 0; ro < NROUT; ro++ )
 
3159
   {
 
3160
      if(      ROUTS[ro] == GEMM  )
 
3161
      {
 
3162
         RungemmCase( ROUTS[ro], TEST, MFLOP, LDA_IS_M, NTRANA, TRANSA, NTRANB,
 
3163
                      TRANSB, M0, MN, MINC, N0, NN, NINC, K0, KN, KINC, NALPHA,
 
3164
                      ALPHAS, NBETA, BETAS, eps, &np, &ntests );
 
3165
      }
 
3166
#ifdef TREAL
 
3167
      else if(   ROUTS[ro] == SYMM )
 
3168
#else
 
3169
      else if( ( ROUTS[ro] == SYMM ) || ( ROUTS[ro] == HEMM ) )
 
3170
#endif
 
3171
      {
 
3172
         RunsymmCase( ROUTS[ro], TEST, MFLOP, LDA_IS_M, NSIDE, SIDES, NUPLO,
 
3173
                      UPLOS, M0, MN, MINC, N0, NN, NINC, NALPHA, ALPHAS, NBETA,
 
3174
                      BETAS, eps, &np, &ntests );
 
3175
      }
 
3176
#ifdef TREAL
 
3177
      else if(   ROUTS[ro] == SYRK )
 
3178
#else
 
3179
      else if( ( ROUTS[ro] == SYRK ) || ( ROUTS[ro] == HERK ) )
 
3180
#endif
 
3181
      {
 
3182
         RunsyrkCase( ROUTS[ro], TEST, MFLOP, LDA_IS_M, NUPLO, UPLOS, NTRANA,
 
3183
                      TRANSA, N0, NN, NINC, K0, KN, KINC, NALPHA, ALPHAS, NBETA,
 
3184
                      BETAS, eps, &np, &ntests );
 
3185
      }
 
3186
#ifdef TREAL
 
3187
      else if(   ROUTS[ro] == SYR2K )
 
3188
#else
 
3189
      else if( ( ROUTS[ro] == SYR2K ) || ( ROUTS[ro] == HER2K ) )
 
3190
#endif
 
3191
      {
 
3192
         Runsyr2kCase( ROUTS[ro], TEST, MFLOP, LDA_IS_M, NUPLO, UPLOS, NTRANA,
 
3193
                       TRANSA, N0, NN, NINC, K0, KN, KINC, NALPHA, ALPHAS,
 
3194
                       NBETA, BETAS, eps, &np, &ntests );
 
3195
      }
 
3196
      else if( ( ROUTS[ro] == TRMM ) || ( ROUTS[ro] == TRSM ) )
 
3197
      {
 
3198
         RuntrxmCase( ROUTS[ro], TEST, MFLOP, LDA_IS_M, NSIDE, SIDES, NUPLO,
 
3199
                      UPLOS, NTRANA, TRANSA, NDIAG, DIAGS, M0, MN, MINC, N0,
 
3200
                      NN, NINC, NALPHA, ALPHAS, eps, &np, &ntests );
 
3201
      }
 
3202
   }
 
3203
 
 
3204
   if( TEST )
 
3205
      (void) fprintf( stdout, "\n%d tests run, %d passed\n\n", ntests, np );
 
3206
   else
 
3207
      (void) fprintf( stdout, "\n%d tests run, all skipped\n\n", ntests );
 
3208
}
 
3209
/*
 
3210
 * =====================================================================
 
3211
 * Main functions
 
3212
 * =====================================================================
 
3213
 */
 
3214
void PrintUsage( char * nam )
 
3215
{
 
3216
   (void) fprintf( stderr, "ATLAS usage:\n" );
 
3217
   (void) fprintf( stderr, "    %s [-options ...]\n\n", nam );
 
3218
   (void) fprintf( stderr, "where options include:\n" );
 
3219
 
 
3220
   (void) fprintf( stderr, "   -h                                  " );
 
3221
   (void) fprintf( stderr, ". print this message                    \n" );
 
3222
 
 
3223
   (void) fprintf( stderr, "   -R <rout>                           " );
 
3224
   (void) fprintf( stderr, ". select  one  or all routines to test. \n" );
 
3225
   (void) fprintf( stderr, "                                       " );
 
3226
#ifdef TREAL
 
3227
   (void) fprintf( stderr, "  rout must be in {all, gemm,symm,syrk, \n" );
 
3228
   (void) fprintf( stderr, "                                       " );
 
3229
   (void) fprintf( stderr, "  syr2k,trmm,trsm}.                     \n" );
 
3230
#else
 
3231
   (void) fprintf( stderr, "  rout must be in {all, gemm,hemm,herk, \n" );
 
3232
   (void) fprintf( stderr, "                                       " );
 
3233
   (void) fprintf( stderr, "  her2k,symm,syr2k,syrk,trmm,trsm}.     \n" );
 
3234
#endif
 
3235
   (void) fprintf( stderr, "                                       " );
 
3236
   (void) fprintf( stderr, "  Default: -R gemm.  Ex: -R trmm        \n" );
 
3237
 
 
3238
   (void) fprintf( stderr, "   -R <nrout> <rout1> ... <routN>      " );
 
3239
   (void) fprintf( stderr, ". same as above for more than one rout- \n" );
 
3240
   (void) fprintf( stderr, "                                       " );
 
3241
   (void) fprintf( stderr, "  tine. Ex: -R 3 genn trmm symm         \n" );
 
3242
 
 
3243
   (void) fprintf( stderr, "   -S <nside>  L/R                     " );
 
3244
   (void) fprintf( stderr, ". select values for the SIDE parameter. \n" );
 
3245
   (void) fprintf( stderr, "                                       " );
 
3246
   (void) fprintf( stderr, "  Default: -S 1 L. Ex: -S 2 L R         \n" );
 
3247
 
 
3248
   (void) fprintf( stderr, "   -U <nuplo>  L/U                     " );
 
3249
   (void) fprintf( stderr, ". select values for the UPLO parameter. \n" );
 
3250
   (void) fprintf( stderr, "                                       " );
 
3251
   (void) fprintf( stderr, "  Default: -U 1 L. Ex: -U 2 L U         \n" );
 
3252
 
 
3253
   (void) fprintf( stderr, "   -A <ntrans> N/T/C                   " );
 
3254
   (void) fprintf( stderr, ". select values of the TRANSA parameter.\n" );
 
3255
   (void) fprintf( stderr, "                                       " );
 
3256
   (void) fprintf( stderr, "  Default: -A 1 n. Ex: -A 2 N T         \n" );
 
3257
 
 
3258
   (void) fprintf( stderr, "   -B <ntrans> N/T/C                   " );
 
3259
   (void) fprintf( stderr, ". select values of the TRANSB parameter.\n" );
 
3260
   (void) fprintf( stderr, "                                       " );
 
3261
   (void) fprintf( stderr, "  Default: -B 1 N. Ex: -B 2 N T         \n" );
 
3262
 
 
3263
   (void) fprintf( stderr, "   -D <ndiags> N/U                     " );
 
3264
   (void) fprintf( stderr, ". select values for the DIAG parameter. \n" );
 
3265
   (void) fprintf( stderr, "                                       " );
 
3266
   (void) fprintf( stderr, "  Default: -D 1 N. Ex: -Diag 2 N U      \n" );
 
3267
 
 
3268
   (void) fprintf( stderr, "   -m <m>                              " );
 
3269
   (void) fprintf( stderr, ". select one value for the parameter M. \n" );
 
3270
   (void) fprintf( stderr, "                                       " );
 
3271
   (void) fprintf( stderr, "  Ex: -m 100                            \n" );
 
3272
 
 
3273
   (void) fprintf( stderr, "   -n <n>                              " );
 
3274
   (void) fprintf( stderr, ". same as above for the parameter N.    \n" );
 
3275
 
 
3276
   (void) fprintf( stderr, "   -k <k>                              " );
 
3277
   (void) fprintf( stderr, ". same as above for the parameter K.    \n" );
 
3278
 
 
3279
   (void) fprintf( stderr, "   -M <m1>  <mN>  <minc>               " );
 
3280
   (void) fprintf( stderr, ". select the values of M, from m1 to mN \n" );
 
3281
   (void) fprintf( stderr, "                                       " );
 
3282
   (void) fprintf( stderr, "  by increment of minc. m1 > 0.         \n" );
 
3283
   (void) fprintf( stderr, "                                       " );
 
3284
   (void) fprintf( stderr, "  Ex: -M 100 1000 100                   \n" );
 
3285
 
 
3286
   (void) fprintf( stderr, "   -N <n1>  <nN>  <ninc>               " );
 
3287
   (void) fprintf( stderr, ". same as above for the values of N.    \n" );
 
3288
 
 
3289
   (void) fprintf( stderr, "   -K <k1>  <kN>  <kinc>               " );
 
3290
   (void) fprintf( stderr, ". same as above for the values of K.    \n" );
 
3291
 
 
3292
#ifdef TREAL
 
3293
   (void) fprintf( stderr, "   -a <nalphas> <a1> ... <aN>          " );
 
3294
   (void) fprintf( stderr, ". select the values of ALPHA.  Default: \n" );
 
3295
   (void) fprintf( stderr, "                                       " );
 
3296
   (void) fprintf( stderr, "  -a 1 1.0. Ex: -a 3 -1.0 0.0 1.0       \n" );
 
3297
   (void) fprintf( stderr, "   -b <nbetas>  <beta1>  ... <betaN>   " );
 
3298
   (void) fprintf( stderr, ". same as above for the parameter BETA. \n" );
 
3299
#else
 
3300
   (void) fprintf( stderr, "   -a <nalphas> <a1r> <a1i> ... <aNi>  " );
 
3301
   (void) fprintf( stderr, ". select the values of ALPHA, where a1r \n" );
 
3302
   (void) fprintf( stderr, "                                       " );
 
3303
   (void) fprintf( stderr, "  and  a1i  are the  real and imaginary \n" );
 
3304
   (void) fprintf( stderr, "                                       " );
 
3305
   (void) fprintf( stderr, "  parts of a1. Default: -a 1 1.0 0.0    \n" );
 
3306
   (void) fprintf( stderr, "   -b <nbetas>  <b1r> <b1i> ... <bNi>  " );
 
3307
   (void) fprintf( stderr, ". same as above for the parameter BETA. \n" );
 
3308
#endif
 
3309
 
 
3310
   (void) fprintf( stderr, "   -d                                  " );
 
3311
   (void) fprintf( stderr, ". use smallest possible leading  dimen- \n" );
 
3312
   (void) fprintf( stderr, "                                       " );
 
3313
   (void) fprintf( stderr, "  sion for the array A.                 \n" );
 
3314
   (void) fprintf( stderr, "                                       " );
 
3315
   (void) fprintf( stderr, "  Default: max( mN, nN, kN ).           \n" );
 
3316
 
 
3317
   (void) fprintf( stderr, "   -T <0/1>                            " );
 
3318
   (void) fprintf( stderr, ". disable/enable computational check.   \n" );
 
3319
   (void) fprintf( stderr, "                                       " );
 
3320
   (void) fprintf( stderr, "  Default: -T 1                         \n" );
 
3321
 
 
3322
   (void) fprintf( stderr, "   -F <mflops>                         " );
 
3323
   (void) fprintf( stderr, ". perform at least mflops per measure.  \n" );
 
3324
 
 
3325
   (void) fprintf( stderr, "\n" );
 
3326
   exit( -1 );
 
3327
}
 
3328
 
 
3329
void GetFlags
 
3330
(
 
3331
   int                        NARGS,
 
3332
   char                       * ARGS[],
 
3333
   int                        * NROUT,
 
3334
   enum LVL3_ROUT             ** ROUTS,
 
3335
   int                        * TEST,
 
3336
   int                        * LDA_IS_M,
 
3337
   int                        * MFLOP,
 
3338
   int                        * NSIDE,
 
3339
   enum ATLAS_SIDE            ** SIDES,
 
3340
   int                        * NUPLO,
 
3341
   enum ATLAS_UPLO            ** UPLOS,
 
3342
   int                        * NTRANA,
 
3343
   enum ATLAS_TRANS           ** TRANSA,
 
3344
   int                        * NTRANB,
 
3345
   enum ATLAS_TRANS           ** TRANSB,
 
3346
   int                        * NDIAG,
 
3347
   enum ATLAS_DIAG            ** DIAGS,
 
3348
   int                        * M0,
 
3349
   int                        * MN,
 
3350
   int                        * MINC,
 
3351
   int                        * N0,
 
3352
   int                        * NN,
 
3353
   int                        * NINC,
 
3354
   int                        * K0,
 
3355
   int                        * KN,
 
3356
   int                        * KINC,
 
3357
   int                        * NALPHA,
 
3358
   TYPE                       ** ALPHAS,
 
3359
   int                        * NBETA,
 
3360
   TYPE                       ** BETAS
 
3361
)
 
3362
{
 
3363
   char                       ch;
 
3364
   int                        i = 1, j;
 
3365
/*
 
3366
 * Set up defaults
 
3367
 */
 
3368
   *NROUT    = -1;                         /* No routine to be tested */
 
3369
   *TEST     = 1;                               /* Enable the testing */
 
3370
   *LDA_IS_M = 0;    /* Leading dimension chosen as max testing value */
 
3371
   *MFLOP    = 0;                /* smallest number of flops possible */
 
3372
                                            /* Default bandwidth is 1 */
 
3373
 
 
3374
   *NSIDE  = *NUPLO = *NTRANA = *NTRANB = *NDIAG = -1;
 
3375
   *M0     = *N0    = *K0     = -1;
 
3376
   *NALPHA = *NBETA = -1;
 
3377
 
 
3378
   for( i = 1; i < NARGS; )
 
3379
   {
 
3380
      if( ARGS[i][0] != '-' ) PrintUsage( ARGS[0] );
 
3381
 
 
3382
      switch( ARGS[i++][1] )
 
3383
      {
 
3384
         case 'h':
 
3385
            PrintUsage( ARGS[0] );
 
3386
            break;
 
3387
         case 'T':
 
3388
            if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3389
            *TEST = atoi( ARGS[i++] );
 
3390
            break;
 
3391
         case 'd':
 
3392
            *LDA_IS_M = 1;
 
3393
            break;
 
3394
         case 'F':
 
3395
            if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3396
            *MFLOP = atoi( ARGS[i++] );
 
3397
            if( *MFLOP < 0      ) PrintUsage( ARGS[0] );
 
3398
            break;
 
3399
 
 
3400
         case 'S':
 
3401
            if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3402
            *NSIDE = atoi( ARGS[i++] );
 
3403
            if( *NSIDE <= 0     ) PrintUsage( ARGS[0] );
 
3404
            *SIDES = (enum ATLAS_SIDE *)malloc( *NSIDE *
 
3405
                                                sizeof( enum ATLAS_SIDE ) );
 
3406
            ATL_assert( *SIDES );
 
3407
            for( j = 0; j != *NSIDE; j++)
 
3408
            {
 
3409
               if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3410
               ch = *ARGS[i++];
 
3411
               if(      ch == 'l' || ch == 'L' ) (*SIDES)[j] = AtlasLeft;
 
3412
               else if( ch == 'r' || ch == 'R' ) (*SIDES)[j] = AtlasRight;
 
3413
               else PrintUsage( ARGS[0] );
 
3414
            }
 
3415
            break;
 
3416
         case 'U':
 
3417
            if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3418
            *NUPLO = atoi( ARGS[i++] );
 
3419
            if( *NUPLO <= 0     ) PrintUsage( ARGS[0] );
 
3420
            *UPLOS = (enum ATLAS_UPLO *)malloc( *NUPLO *
 
3421
                                                sizeof( enum ATLAS_UPLO ) );
 
3422
            ATL_assert( *UPLOS );
 
3423
            for( j = 0; j != *NUPLO; j++)
 
3424
            {
 
3425
               if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3426
               ch = *ARGS[i++];
 
3427
               if(      ch == 'u' || ch == 'U' ) (*UPLOS)[j] = AtlasUpper;
 
3428
               else if( ch == 'l' || ch == 'L' ) (*UPLOS)[j] = AtlasLower;
 
3429
               else PrintUsage( ARGS[0] );
 
3430
            }
 
3431
            break;
 
3432
         case 'A':
 
3433
            if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3434
            *NTRANA = atoi(ARGS[i++]);
 
3435
            if( *NTRANA <= 0    ) PrintUsage( ARGS[0] );
 
3436
            *TRANSA = (enum ATLAS_TRANS *)malloc( *NTRANA *
 
3437
                                                  sizeof( enum ATLAS_TRANS ) );
 
3438
            ATL_assert( *TRANSA );
 
3439
            for( j = 0; j != *NTRANA; j++ )
 
3440
            {
 
3441
               if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3442
               ch = *ARGS[i++];
 
3443
               if(      ch == 'n' || ch == 'N' ) (*TRANSA)[j] = AtlasNoTrans;
 
3444
               else if( ch == 't' || ch == 'T' ) (*TRANSA)[j] = AtlasTrans;
 
3445
               else if( ch == 'c' || ch == 'C' ) (*TRANSA)[j] = AtlasConjTrans;
 
3446
               else PrintUsage( ARGS[0] );
 
3447
            }
 
3448
            break;
 
3449
         case 'B':
 
3450
            if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3451
            *NTRANB = atoi(ARGS[i++]);
 
3452
            if( *NTRANB <= 0    ) PrintUsage( ARGS[0] );
 
3453
            *TRANSB = (enum ATLAS_TRANS *)malloc( *NTRANB *
 
3454
                                                  sizeof( enum ATLAS_TRANS ) );
 
3455
            ATL_assert( *TRANSB );
 
3456
            for( j = 0; j != *NTRANB; j++ )
 
3457
            {
 
3458
               if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3459
               ch = *ARGS[i++];
 
3460
               if(      ch == 'n' || ch == 'N' ) (*TRANSB)[j] = AtlasNoTrans;
 
3461
               else if( ch == 't' || ch == 'T' ) (*TRANSB)[j] = AtlasTrans;
 
3462
               else if( ch == 'c' || ch == 'C' ) (*TRANSB)[j] = AtlasConjTrans;
 
3463
               else PrintUsage( ARGS[0] );
 
3464
            }
 
3465
            break;
 
3466
         case 'D':
 
3467
            if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3468
            *NDIAG = atoi( ARGS[i++] );
 
3469
            if( *NDIAG <= 0     ) PrintUsage( ARGS[0] );
 
3470
            *DIAGS = (enum ATLAS_DIAG *)malloc( *NDIAG *
 
3471
                                                sizeof( enum ATLAS_DIAG ) );
 
3472
            ATL_assert( *DIAGS );
 
3473
            for( j = 0; j != *NDIAG; j++ )
 
3474
            {
 
3475
               if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3476
               ch = *ARGS[i++];
 
3477
               if(      ch == 'u' || ch == 'U' ) (*DIAGS)[j] = AtlasUnit;
 
3478
               else if( ch == 'n' || ch == 'N' ) (*DIAGS)[j] = AtlasNonUnit;
 
3479
               else PrintUsage( ARGS[0] );
 
3480
            }
 
3481
            break;
 
3482
 
 
3483
         case 'M':
 
3484
            if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3485
            *M0 = atoi( ARGS[i++] );
 
3486
            if( *M0 < 0         ) PrintUsage( ARGS[0] );
 
3487
            if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3488
            *MN = atoi( ARGS[i++] );
 
3489
            if( *MN < 0         ) PrintUsage( ARGS[0] );
 
3490
            if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3491
            *MINC = atoi( ARGS[i++] );
 
3492
            if( *MINC <= 0      ) PrintUsage( ARGS[0] );
 
3493
            break;
 
3494
         case 'm':
 
3495
            if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3496
            *M0 = *MN = atoi( ARGS[i++] ); *MINC = 1;
 
3497
            if( *M0 <= 0        ) PrintUsage( ARGS[0] );
 
3498
            break;
 
3499
         case 'N':
 
3500
            if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3501
            *N0 = atoi( ARGS[i++] );
 
3502
            if( *N0 < 0         ) PrintUsage( ARGS[0] );
 
3503
            if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3504
            *NN = atoi( ARGS[i++] );
 
3505
            if( *NN < 0         ) PrintUsage( ARGS[0] );
 
3506
            if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3507
            *NINC = atoi( ARGS[i++] );
 
3508
            if( *NINC <= 0      ) PrintUsage( ARGS[0] );
 
3509
            break;
 
3510
         case 'n':
 
3511
            if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3512
            *N0 = *NN = atoi( ARGS[i++] ); *NINC = 1;
 
3513
            if( *N0 < 0         ) PrintUsage( ARGS[0] );
 
3514
            break;
 
3515
         case 'K':
 
3516
            if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3517
            *K0 = atoi( ARGS[i++] );
 
3518
            if( *K0 < 0         ) PrintUsage( ARGS[0] );
 
3519
            if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3520
            *KN = atoi( ARGS[i++] );
 
3521
            if( *KN < 0         ) PrintUsage( ARGS[0] );
 
3522
            if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3523
            *KINC = atoi( ARGS[i++] );
 
3524
            if( *KINC <= 0      ) PrintUsage( ARGS[0] );
 
3525
            break;
 
3526
         case 'k':
 
3527
            if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3528
            *K0 = *KN = atoi( ARGS[i++] ); *KINC = 1;
 
3529
            if( *K0 < 0         ) PrintUsage( ARGS[0] );
 
3530
            break;
 
3531
 
 
3532
         case 'a':
 
3533
            if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3534
            *NALPHA = atoi( ARGS[i++] );
 
3535
            if( *NALPHA <= 0    ) PrintUsage( ARGS[0] );
 
3536
            *ALPHAS = (TYPE *)malloc( ATL_MulBySize( *NALPHA ) );
 
3537
            ATL_assert( *ALPHAS );
 
3538
            for( j = 0; j < (*NALPHA SHIFT); j++ )
 
3539
            {
 
3540
               if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3541
               (*ALPHAS)[j] = (TYPE)atof( ARGS[i++] );
 
3542
            }
 
3543
            break;
 
3544
         case 'b':
 
3545
            if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3546
            *NBETA  = atoi( ARGS[i++] );
 
3547
            if( *NBETA <= 0     ) PrintUsage( ARGS[0] );
 
3548
            *BETAS  = (TYPE *)malloc( ATL_MulBySize( *NBETA ) );
 
3549
            ATL_assert( *BETAS );
 
3550
            for( j = 0; j < (*NBETA SHIFT); j++ )
 
3551
            {
 
3552
               if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3553
               (*BETAS)[j] = (TYPE)atof( ARGS[i++] );
 
3554
            }
 
3555
            break;
 
3556
 
 
3557
         case 'R':
 
3558
            if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3559
 
 
3560
            if( ( strcmp( ARGS[i], "ALL"  ) == 0 ) ||
 
3561
                ( strcmp( ARGS[i], "all"  ) == 0 ) )
 
3562
            {
 
3563
#ifdef TREAL
 
3564
               *NROUT = 6;
 
3565
#else
 
3566
               *NROUT = 9;
 
3567
#endif
 
3568
               *ROUTS = (enum LVL3_ROUT *)malloc( (*NROUT) *
 
3569
                                                  sizeof( enum LVL3_ROUT ) );
 
3570
               ATL_assert( *ROUTS );
 
3571
 
 
3572
               (*ROUTS)[ 0] = GEMM; (*ROUTS)[ 1] = SYMM; (*ROUTS)[ 2] = SYR2K;
 
3573
               (*ROUTS)[ 3] = SYRK; (*ROUTS)[ 4] = TRMM; (*ROUTS)[ 5] = TRSM;
 
3574
#ifdef TCPLX
 
3575
               (*ROUTS)[ 6] = HEMM; (*ROUTS)[ 7] = HERK; (*ROUTS)[ 8] = HER2K;
 
3576
#endif
 
3577
               i++;
 
3578
            }
 
3579
            else
 
3580
            {
 
3581
               if( isdigit( *ARGS[i] ) ) { *NROUT = atoi( ARGS[i++] ); }
 
3582
               else                      { *NROUT = 1;                 }
 
3583
               *ROUTS = (enum LVL3_ROUT *)malloc( (*NROUT) *
 
3584
                                                  sizeof( enum LVL3_ROUT ) );
 
3585
               ATL_assert( *ROUTS );
 
3586
 
 
3587
               for( j = 0; j < *NROUT; j++ )
 
3588
               {
 
3589
                  if( ARGS[i] == NULL ) PrintUsage( ARGS[0] );
 
3590
 
 
3591
                  if(      ( strcmp( ARGS[i], "GEMM"  ) == 0 ) ||
 
3592
                           ( strcmp( ARGS[i], "gemm"  ) == 0 ) )
 
3593
                     (*ROUTS)[j] = GEMM;
 
3594
                  else if( ( strcmp( ARGS[i], "SYMM"  ) == 0 ) ||
 
3595
                           ( strcmp( ARGS[i], "symm"  ) == 0 ) )
 
3596
                     (*ROUTS)[j] = SYMM;
 
3597
                  else if( ( strcmp( ARGS[i], "SYR2K" ) == 0 ) ||
 
3598
                           ( strcmp( ARGS[i], "syr2k" ) == 0 ) )
 
3599
                     (*ROUTS)[j] = SYR2K;
 
3600
                  else if( ( strcmp( ARGS[i], "SYRK"  ) == 0 ) ||
 
3601
                           ( strcmp( ARGS[i], "syrk"  ) == 0 ) )
 
3602
                     (*ROUTS)[j] = SYRK;
 
3603
                  else if( ( strcmp( ARGS[i], "TRMM"  ) == 0 ) ||
 
3604
                           ( strcmp( ARGS[i], "trmm"  ) == 0 ) )
 
3605
                     (*ROUTS)[j] = TRMM;
 
3606
                  else if( ( strcmp( ARGS[i], "TRSM"  ) == 0 ) ||
 
3607
                           ( strcmp( ARGS[i], "trsm"  ) == 0 ) )
 
3608
                     (*ROUTS)[j] = TRSM;
 
3609
#ifdef TCPLX
 
3610
                  else if( ( strcmp( ARGS[i], "HEMM"  ) == 0 ) ||
 
3611
                           ( strcmp( ARGS[i], "hemm"  ) == 0 ) )
 
3612
                     (*ROUTS)[j] = HEMM;
 
3613
                  else if( ( strcmp( ARGS[i], "HER2K" ) == 0 ) ||
 
3614
                           ( strcmp( ARGS[i], "her2k" ) == 0 ) )
 
3615
                     (*ROUTS)[j] = HER2K;
 
3616
                  else if( ( strcmp( ARGS[i], "HERK"  ) == 0 ) ||
 
3617
                           ( strcmp( ARGS[i], "herk"  ) == 0 ) )
 
3618
                     (*ROUTS)[j] = HERK;
 
3619
#endif
 
3620
                  else PrintUsage( ARGS[0] );
 
3621
                  i++;
 
3622
               }
 
3623
            }
 
3624
            break;
 
3625
         default:
 
3626
            PrintUsage( ARGS[0] );
 
3627
            break;
 
3628
      }
 
3629
   }
 
3630
/*
 
3631
 * Finish setting up defaults if the user has not selected
 
3632
 */
 
3633
   if( *NROUT == -1 )
 
3634
   {
 
3635
      *NROUT = 1;
 
3636
      *ROUTS = (enum LVL3_ROUT *)malloc( sizeof( enum LVL3_ROUT ) );
 
3637
      ATL_assert( *ROUTS );
 
3638
      (*ROUTS)[0] = GEMM;
 
3639
   }
 
3640
 
 
3641
   if( *NSIDE == -1 )
 
3642
   {
 
3643
      *NSIDE = 1;
 
3644
      *SIDES = (enum ATLAS_SIDE *)malloc( sizeof( enum ATLAS_SIDE ) );
 
3645
      ATL_assert( *SIDES );
 
3646
      (*SIDES)[0] = AtlasLeft;
 
3647
   }
 
3648
   if( *NUPLO == -1 )
 
3649
   {
 
3650
      *NUPLO = 1;
 
3651
      *UPLOS = (enum ATLAS_UPLO *)malloc( sizeof( enum ATLAS_UPLO ) );
 
3652
      ATL_assert( *UPLOS );
 
3653
      (*UPLOS)[0] = AtlasLower;
 
3654
   }
 
3655
   if( *NTRANA == -1 )
 
3656
   {
 
3657
      *NTRANA = 1;
 
3658
      *TRANSA = (enum ATLAS_TRANS *)malloc( sizeof( enum ATLAS_TRANS ) );
 
3659
      ATL_assert( *TRANSA );
 
3660
      (*TRANSA)[0] = AtlasNoTrans;
 
3661
   }
 
3662
   if( *NTRANB == -1 )
 
3663
   {
 
3664
      *NTRANB = 1;
 
3665
      *TRANSB = (enum ATLAS_TRANS *)malloc( sizeof( enum ATLAS_TRANS ) );
 
3666
      ATL_assert( *TRANSB );
 
3667
      (*TRANSB)[0] = AtlasNoTrans;
 
3668
   }
 
3669
   if( *NDIAG == -1 )
 
3670
   {
 
3671
      *NDIAG = 1;
 
3672
      *DIAGS = (enum ATLAS_DIAG *)malloc( sizeof( enum ATLAS_DIAG ) );
 
3673
      ATL_assert( *DIAGS );
 
3674
      (*DIAGS)[0] = AtlasNonUnit;
 
3675
   }
 
3676
 
 
3677
   if( *N0 == -1 ) { *N0 = 100; *NN = 1000; *NINC = 100; }
 
3678
 
 
3679
   if( *NALPHA == -1 )
 
3680
   {
 
3681
      *NALPHA = 1;
 
3682
      *ALPHAS = (TYPE *)malloc( ATL_MulBySize( 1 ) );
 
3683
      ATL_assert( *ALPHAS );
 
3684
#ifdef TREAL
 
3685
      (*ALPHAS)[0] = ATL_rone;
 
3686
#else
 
3687
      (*ALPHAS)[0] = ATL_rone;
 
3688
      (*ALPHAS)[1] = ATL_rzero;
 
3689
#endif
 
3690
   }
 
3691
   if( *NBETA == -1 )
 
3692
   {
 
3693
      *NBETA = 1;
 
3694
      *BETAS = (TYPE *)malloc( ATL_MulBySize( 1 ) );
 
3695
      ATL_assert( *BETAS );
 
3696
#ifdef TREAL
 
3697
      (*BETAS)[0] = ATL_rone;
 
3698
#else
 
3699
      (*BETAS)[0] = ATL_rone;
 
3700
      (*BETAS)[1] = ATL_rzero;
 
3701
#endif
 
3702
   }
 
3703
}
 
3704
 
 
3705
int main( int NARGS, char **ARGS )
 
3706
{
 
3707
   int                        kinc, kstart, kstop, ldaism, mflopmin, minc,
 
3708
                              mstart, mstop, ninc, nstart, nstop, nalpha,
 
3709
                              nbeta, ndiag, nrout, nside, ntrana, ntranb,
 
3710
                              nuplo, test;
 
3711
 
 
3712
   TYPE                       * alphas = NULL, * betas = NULL;
 
3713
   enum LVL3_ROUT             * routs  = NULL;
 
3714
   enum ATLAS_SIDE            * sides  = NULL;
 
3715
   enum ATLAS_UPLO            * uplos  = NULL;
 
3716
   enum ATLAS_TRANS           * transa = NULL, * transb = NULL;
 
3717
   enum ATLAS_DIAG            * diags  = NULL;
 
3718
 
 
3719
   GetFlags( NARGS, ARGS, &nrout, &routs, &test, &ldaism, &mflopmin, &nside,
 
3720
             &sides, &nuplo, &uplos, &ntrana, &transa, &ntranb, &transb,
 
3721
             &ndiag, &diags, &mstart, &mstop, &minc, &nstart, &nstop, &ninc,
 
3722
             &kstart, &kstop, &kinc, &nalpha, &alphas, &nbeta, &betas );
 
3723
   RunCases( test, mflopmin, ldaism, nside, sides, nuplo, uplos, ntrana, transa,
 
3724
             ntranb, transb, ndiag, diags, mstart, mstop, minc, nstart, nstop,
 
3725
             ninc, kstart, kstop, kinc, nalpha, alphas, nbeta, betas, nrout,
 
3726
             routs );
 
3727
 
 
3728
   if( sides  ) free( sides  );
 
3729
   if( uplos  ) free( uplos  );
 
3730
   if( transa ) free( transa );
 
3731
   if( transb ) free( transb );
 
3732
   if( diags  ) free( diags  );
 
3733
   if( alphas ) free( alphas );
 
3734
   if( betas  ) free( betas  );
 
3735
   if( routs  ) free( routs  );
 
3736
 
 
3737
   return( 0 );
 
3738
}