1 SUBROUTINE STIMB3( LINE, NM, MVAL, NN, NVAL, NK, KVAL, NLDA, 2 $ LDAVAL, TIMMIN, A, B, C, RESLTS, LDR1, LDR2, 3 $ NOUT ) 4* 5* -- LAPACK timing routine (version 3.0) -- 6* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., 7* Courant Institute, Argonne National Lab, and Rice University 8* March 31, 1993 9* 10* .. Scalar Arguments .. 11 CHARACTER*( * ) LINE 12 INTEGER LDR1, LDR2, NK, NLDA, NM, NN, NOUT 13 REAL TIMMIN 14* .. 15* .. Array Arguments .. 16 INTEGER KVAL( * ), LDAVAL( * ), MVAL( * ), NVAL( * ) 17 REAL A( * ), B( * ), C( * ), RESLTS( LDR1, LDR2, * ) 18* .. 19* 20* Purpose 21* ======= 22* 23* STIMB3 times the Level 3 BLAS routines. 24* 25* Arguments 26* ========= 27* 28* LINE (input) CHARACTER*80 29* The input line that requested this routine. The first six 30* characters contain either the name of a subroutine or a 31* generic path name. The remaining characters may be used to 32* specify the individual routines to be timed. See ATIMIN for 33* a full description of the format of the input line. 34* 35* NM (input) INTEGER 36* The number of values of M contained in the vector MVAL. 37* 38* MVAL (input) INTEGER array, dimension (NM) 39* The values of the matrix row dimension M. 40* 41* NN (input) INTEGER 42* The number of values of N contained in the vector NVAL. 43* 44* NVAL (input) INTEGER array, dimension (NN) 45* The values of the matrix column dimension N. 46* 47* NK (input) INTEGER 48* The number of values of K contained in the vector KVAL. 49* 50* KVAL (input) INTEGER array, dimension (NK) 51* The values of K. K is used as the intermediate matrix 52* dimension for SGEMM (the product of an M x K matrix and a 53* K x N matrix) and as the dimension of the rank-K update in 54* SSYRK and SSYR2K. 55* 56* NLDA (input) INTEGER 57* The number of values of LDA contained in the vector LDAVAL. 58* 59* LDAVAL (input) INTEGER array, dimension (NLDA) 60* The values of the leading dimension of the array A. 61* 62* TIMMIN (input) REAL 63* The minimum time a subroutine will be timed. 64* 65* A (workspace) REAL array, dimension (LDAMAX*NMAX) 66* where LDAMAX and NMAX are the maximum values permitted 67* for LDA and N. 68* 69* B (workspace) REAL array, dimension (LDAMAX*NMAX) 70* 71* C (workspace) REAL array, dimension (LDAMAX*NMAX) 72* 73* RESLTS (output) REAL array, dimension (LDR1,LDR2,NLDA) 74* The timing results for each subroutine over the relevant 75* values of M, N, K, and LDA. 76* 77* LDR1 (input) INTEGER 78* The first dimension of RESLTS. LDR1 >= max(1,NM,NK). 79* 80* LDR2 (input) INTEGER 81* The second dimension of RESLTS. LDR2 >= max(1,NN). 82* 83* NOUT (input) INTEGER 84* The unit number for output. 85* 86* ===================================================================== 87* 88* .. Parameters .. 89 INTEGER NSUBS 90 PARAMETER ( NSUBS = 6 ) 91 INTEGER NTRANS, NSIDES, NUPLOS 92 PARAMETER ( NTRANS = 2, NSIDES = 2, NUPLOS = 2 ) 93 REAL ALPHA, BETA 94 PARAMETER ( ALPHA = 1.0E0, BETA = 1.0E0 ) 95* .. 96* .. Local Scalars .. 97 CHARACTER SIDE, TRANSA, TRANSB, UPLO 98 CHARACTER*3 PATH 99 CHARACTER*6 CNAME 100 INTEGER I, IC, ICL, IK, ILDA, IM, IMAT, IN, INFO, 101 $ ISIDE, ISUB, ITA, ITB, IUPLO, K, LDA, M, N 102 REAL OPS, S1, S2, TIME, UNTIME 103* .. 104* .. Local Arrays .. 105 LOGICAL TIMSUB( NSUBS ) 106 CHARACTER SIDES( NSIDES ), TRANS( NTRANS ), 107 $ UPLOS( NUPLOS ) 108 CHARACTER*6 NAMES( NSUBS ) 109* .. 110* .. External Functions .. 111 LOGICAL LSAME 112 REAL SECOND, SMFLOP, SOPBL3 113 EXTERNAL LSAME, SECOND, SMFLOP, SOPBL3 114* .. 115* .. External Subroutines .. 116 EXTERNAL ATIMCK, ATIMIN, SGEMM, SPRTBL, SSYMM, SSYR2K, 117 $ SSYRK, STIMMG, STRMM, STRSM 118* .. 119* .. Intrinsic Functions .. 120 INTRINSIC REAL 121* .. 122* .. Data statements .. 123 DATA NAMES / 'SGEMM ', 'SSYMM ', 'SSYRK ', 'SSYR2K', 124 $ 'STRMM ', 'STRSM ' / 125 DATA TRANS / 'N', 'T' / 126 DATA SIDES / 'L', 'R' / 127 DATA UPLOS / 'U', 'L' / 128* .. 129* .. Executable Statements .. 130* 131* Extract the timing request from the input line. 132* 133 PATH( 1: 1 ) = 'Single precision' 134 PATH( 2: 3 ) = 'B3' 135 CALL ATIMIN( PATH, LINE, NSUBS, NAMES, TIMSUB, NOUT, INFO ) 136 IF( INFO.NE.0 ) 137 $ GO TO 480 138* 139* Check that M <= LDA. 140* 141 CNAME = LINE( 1: 6 ) 142 CALL ATIMCK( 1, CNAME, NM, MVAL, NLDA, LDAVAL, NOUT, INFO ) 143 IF( INFO.GT.0 ) THEN 144 WRITE( NOUT, FMT = 9999 )CNAME 145 GO TO 480 146 END IF 147* 148* Time each routine. 149* 150 DO 470 ISUB = 1, NSUBS 151 IF( .NOT.TIMSUB( ISUB ) ) 152 $ GO TO 470 153* 154* Print header. 155* 156 CNAME = NAMES( ISUB ) 157 WRITE( NOUT, FMT = 9998 )CNAME 158 IF( NLDA.EQ.1 ) THEN 159 WRITE( NOUT, FMT = 9997 )LDAVAL( 1 ) 160 ELSE 161 DO 10 I = 1, NLDA 162 WRITE( NOUT, FMT = 9996 )I, LDAVAL( I ) 163 10 CONTINUE 164 END IF 165* 166* Time SGEMM 167* 168 IF( CNAME.EQ.'SGEMM ' ) THEN 169 DO 90 ITA = 1, NTRANS 170 TRANSA = TRANS( ITA ) 171 DO 80 ITB = 1, NTRANS 172 TRANSB = TRANS( ITB ) 173 DO 70 IK = 1, NK 174 K = KVAL( IK ) 175 DO 60 ILDA = 1, NLDA 176 LDA = LDAVAL( ILDA ) 177 DO 50 IM = 1, NM 178 M = MVAL( IM ) 179 DO 40 IN = 1, NN 180 N = NVAL( IN ) 181 IF( TRANSA.EQ.'N' ) THEN 182 CALL STIMMG( 1, M, K, A, LDA, 0, 0 ) 183 ELSE 184 CALL STIMMG( 1, K, M, A, LDA, 0, 0 ) 185 END IF 186 IF( TRANSB.EQ.'N' ) THEN 187 CALL STIMMG( 0, K, N, B, LDA, 0, 0 ) 188 ELSE 189 CALL STIMMG( 0, N, K, B, LDA, 0, 0 ) 190 END IF 191 CALL STIMMG( 1, M, N, C, LDA, 0, 0 ) 192 IC = 0 193 S1 = SECOND( ) 194 20 CONTINUE 195 CALL SGEMM( TRANSA, TRANSB, M, N, K, 196 $ ALPHA, A, LDA, B, LDA, BETA, 197 $ C, LDA ) 198 S2 = SECOND( ) 199 TIME = S2 - S1 200 IC = IC + 1 201 IF( TIME.LT.TIMMIN ) THEN 202 CALL STIMMG( 1, M, N, C, LDA, 0, 0 ) 203 GO TO 20 204 END IF 205* 206* Subtract the time used in STIMMG. 207* 208 ICL = 1 209 S1 = SECOND( ) 210 30 CONTINUE 211 S2 = SECOND( ) 212 UNTIME = S2 - S1 213 ICL = ICL + 1 214 IF( ICL.LE.IC ) THEN 215 CALL STIMMG( 1, M, N, C, LDA, 0, 0 ) 216 GO TO 30 217 END IF 218* 219 TIME = ( TIME-UNTIME ) / REAL( IC ) 220 OPS = SOPBL3( CNAME, M, N, K ) 221 RESLTS( IM, IN, ILDA ) = SMFLOP( OPS, 222 $ TIME, 0 ) 223 40 CONTINUE 224 50 CONTINUE 225 60 CONTINUE 226 IF( IK.EQ.1 ) 227 $ WRITE( NOUT, FMT = 9995 )TRANSA, TRANSB 228 WRITE( NOUT, FMT = 9994 )KVAL( IK ) 229 CALL SPRTBL( 'M', 'N', NM, MVAL, NN, NVAL, NLDA, 230 $ RESLTS, LDR1, LDR2, NOUT ) 231 70 CONTINUE 232 80 CONTINUE 233 90 CONTINUE 234* 235 ELSE IF( CNAME.EQ.'SSYMM ' ) THEN 236* 237* Time SSYMM 238* 239 DO 160 ISIDE = 1, NSIDES 240 SIDE = SIDES( ISIDE ) 241 DO 150 IUPLO = 1, NUPLOS 242 UPLO = UPLOS( IUPLO ) 243 IF( LSAME( UPLO, 'U' ) ) THEN 244 IMAT = 6 245 ELSE 246 IMAT = -6 247 END IF 248 DO 140 ILDA = 1, NLDA 249 LDA = LDAVAL( ILDA ) 250 DO 130 IM = 1, NM 251 M = MVAL( IM ) 252 DO 120 IN = 1, NN 253 N = NVAL( IN ) 254 IF( ISIDE.EQ.1 ) THEN 255 CALL STIMMG( IMAT, M, M, A, LDA, 0, 0 ) 256 CALL STIMMG( 0, M, N, B, LDA, 0, 0 ) 257 ELSE 258 CALL STIMMG( 0, M, N, B, LDA, 0, 0 ) 259 CALL STIMMG( IMAT, N, N, A, LDA, 0, 0 ) 260 END IF 261 CALL STIMMG( 1, M, N, C, LDA, 0, 0 ) 262 IC = 0 263 S1 = SECOND( ) 264 100 CONTINUE 265 CALL SSYMM( SIDE, UPLO, M, N, ALPHA, A, LDA, 266 $ B, LDA, BETA, C, LDA ) 267 S2 = SECOND( ) 268 TIME = S2 - S1 269 IC = IC + 1 270 IF( TIME.LT.TIMMIN ) THEN 271 CALL STIMMG( 1, M, N, C, LDA, 0, 0 ) 272 GO TO 100 273 END IF 274* 275* Subtract the time used in STIMMG. 276* 277 ICL = 1 278 S1 = SECOND( ) 279 110 CONTINUE 280 S2 = SECOND( ) 281 UNTIME = S2 - S1 282 ICL = ICL + 1 283 IF( ICL.LE.IC ) THEN 284 CALL STIMMG( 1, M, N, C, LDA, 0, 0 ) 285 GO TO 110 286 END IF 287* 288 TIME = ( TIME-UNTIME ) / REAL( IC ) 289 OPS = SOPBL3( CNAME, M, N, ISIDE-1 ) 290 RESLTS( IM, IN, ILDA ) = SMFLOP( OPS, TIME, 291 $ 0 ) 292 120 CONTINUE 293 130 CONTINUE 294 140 CONTINUE 295 WRITE( NOUT, FMT = 9993 )SIDE, UPLO 296 CALL SPRTBL( 'M', 'N', NM, MVAL, NN, NVAL, NLDA, 297 $ RESLTS, LDR1, LDR2, NOUT ) 298 150 CONTINUE 299 160 CONTINUE 300* 301 ELSE IF( CNAME.EQ.'SSYRK ' ) THEN 302* 303* Time SSYRK 304* 305 DO 230 IUPLO = 1, NUPLOS 306 UPLO = UPLOS( IUPLO ) 307 IF( LSAME( UPLO, 'U' ) ) THEN 308 IMAT = 6 309 ELSE 310 IMAT = -6 311 END IF 312 DO 220 ITA = 1, NTRANS 313 TRANSA = TRANS( ITA ) 314 DO 210 ILDA = 1, NLDA 315 LDA = LDAVAL( ILDA ) 316 DO 200 IK = 1, NK 317 K = KVAL( IK ) 318 IF( TRANSA.EQ.'N' ) THEN 319 CALL STIMMG( 1, N, K, A, LDA, 0, 0 ) 320 ELSE 321 CALL STIMMG( 1, K, N, A, LDA, 0, 0 ) 322 END IF 323 DO 190 IN = 1, NN 324 N = NVAL( IN ) 325 CALL STIMMG( IMAT, N, N, C, LDA, 0, 0 ) 326 IC = 0 327 S1 = SECOND( ) 328 170 CONTINUE 329 CALL SSYRK( UPLO, TRANSA, N, K, ALPHA, A, 330 $ LDA, BETA, C, LDA ) 331 S2 = SECOND( ) 332 TIME = S2 - S1 333 IC = IC + 1 334 IF( TIME.LT.TIMMIN ) THEN 335 CALL STIMMG( IMAT, N, N, C, LDA, 0, 0 ) 336 GO TO 170 337 END IF 338* 339* Subtract the time used in STIMMG. 340* 341 ICL = 1 342 S1 = SECOND( ) 343 180 CONTINUE 344 S2 = SECOND( ) 345 UNTIME = S2 - S1 346 ICL = ICL + 1 347 IF( ICL.LE.IC ) THEN 348 CALL STIMMG( IMAT, N, N, C, LDA, 0, 0 ) 349 GO TO 180 350 END IF 351* 352 TIME = ( TIME-UNTIME ) / REAL( IC ) 353 OPS = SOPBL3( CNAME, N, N, K ) 354 RESLTS( IK, IN, ILDA ) = SMFLOP( OPS, TIME, 355 $ 0 ) 356 190 CONTINUE 357 200 CONTINUE 358 210 CONTINUE 359 WRITE( NOUT, FMT = 9992 )CNAME, UPLO, TRANSA 360 CALL SPRTBL( 'K', 'N', NK, KVAL, NN, NVAL, NLDA, 361 $ RESLTS, LDR1, LDR2, NOUT ) 362 220 CONTINUE 363 230 CONTINUE 364* 365 ELSE IF( CNAME.EQ.'SSYR2K' ) THEN 366* 367* Time SSYR2K 368* 369 DO 300 IUPLO = 1, NUPLOS 370 UPLO = UPLOS( IUPLO ) 371 IF( LSAME( UPLO, 'U' ) ) THEN 372 IMAT = 6 373 ELSE 374 IMAT = -6 375 END IF 376 DO 290 ITB = 1, NTRANS 377 TRANSB = TRANS( ITB ) 378 DO 280 ILDA = 1, NLDA 379 LDA = LDAVAL( ILDA ) 380 DO 270 IK = 1, NK 381 K = KVAL( IK ) 382 IF( TRANSB.EQ.'N' ) THEN 383 CALL STIMMG( 1, N, K, A, LDA, 0, 0 ) 384 CALL STIMMG( 0, N, K, B, LDA, 0, 0 ) 385 ELSE 386 CALL STIMMG( 1, K, N, A, LDA, 0, 0 ) 387 CALL STIMMG( 0, K, N, B, LDA, 0, 0 ) 388 END IF 389 DO 260 IN = 1, NN 390 N = NVAL( IN ) 391 CALL STIMMG( IMAT, N, N, C, LDA, 0, 0 ) 392 IC = 0 393 S1 = SECOND( ) 394 240 CONTINUE 395 CALL SSYR2K( UPLO, TRANSB, N, K, ALPHA, A, 396 $ LDA, B, LDA, BETA, C, LDA ) 397 S2 = SECOND( ) 398 TIME = S2 - S1 399 IC = IC + 1 400 IF( TIME.LT.TIMMIN ) THEN 401 CALL STIMMG( IMAT, N, N, C, LDA, 0, 0 ) 402 GO TO 240 403 END IF 404* 405* Subtract the time used in STIMMG. 406* 407 ICL = 1 408 S1 = SECOND( ) 409 250 CONTINUE 410 S2 = SECOND( ) 411 UNTIME = S2 - S1 412 ICL = ICL + 1 413 IF( ICL.LE.IC ) THEN 414 CALL STIMMG( IMAT, N, N, C, LDA, 0, 0 ) 415 GO TO 250 416 END IF 417* 418 TIME = ( TIME-UNTIME ) / REAL( IC ) 419 OPS = SOPBL3( CNAME, N, N, K ) 420 RESLTS( IK, IN, ILDA ) = SMFLOP( OPS, TIME, 421 $ 0 ) 422 260 CONTINUE 423 270 CONTINUE 424 280 CONTINUE 425 WRITE( NOUT, FMT = 9992 )CNAME, UPLO, TRANSB 426 CALL SPRTBL( 'K', 'N', NK, KVAL, NN, NVAL, NLDA, 427 $ RESLTS, LDR1, LDR2, NOUT ) 428 290 CONTINUE 429 300 CONTINUE 430* 431 ELSE IF( CNAME.EQ.'STRMM ' ) THEN 432* 433* Time STRMM 434* 435 DO 380 ISIDE = 1, NSIDES 436 SIDE = SIDES( ISIDE ) 437 DO 370 IUPLO = 1, NUPLOS 438 UPLO = UPLOS( IUPLO ) 439 IF( LSAME( UPLO, 'U' ) ) THEN 440 IMAT = 9 441 ELSE 442 IMAT = -9 443 END IF 444 DO 360 ITA = 1, NTRANS 445 TRANSA = TRANS( ITA ) 446 DO 350 ILDA = 1, NLDA 447 LDA = LDAVAL( ILDA ) 448 DO 340 IM = 1, NM 449 M = MVAL( IM ) 450 DO 330 IN = 1, NN 451 N = NVAL( IN ) 452 IF( ISIDE.EQ.1 ) THEN 453 CALL STIMMG( IMAT, M, M, A, LDA, 0, 0 ) 454 ELSE 455 CALL STIMMG( IMAT, N, N, A, LDA, 0, 0 ) 456 END IF 457 CALL STIMMG( 0, M, N, B, LDA, 0, 0 ) 458 IC = 0 459 S1 = SECOND( ) 460 310 CONTINUE 461 CALL STRMM( SIDE, UPLO, TRANSA, 462 $ 'Non-unit', M, N, ALPHA, A, 463 $ LDA, B, LDA ) 464 S2 = SECOND( ) 465 TIME = S2 - S1 466 IC = IC + 1 467 IF( TIME.LT.TIMMIN ) THEN 468 CALL STIMMG( 0, M, N, B, LDA, 0, 0 ) 469 GO TO 310 470 END IF 471* 472* Subtract the time used in STIMMG. 473* 474 ICL = 1 475 S1 = SECOND( ) 476 320 CONTINUE 477 S2 = SECOND( ) 478 UNTIME = S2 - S1 479 ICL = ICL + 1 480 IF( ICL.LE.IC ) THEN 481 CALL STIMMG( 0, M, N, B, LDA, 0, 0 ) 482 GO TO 320 483 END IF 484* 485 TIME = ( TIME-UNTIME ) / REAL( IC ) 486 OPS = SOPBL3( CNAME, M, N, ISIDE-1 ) 487 RESLTS( IM, IN, ILDA ) = SMFLOP( OPS, 488 $ TIME, 0 ) 489 330 CONTINUE 490 340 CONTINUE 491 350 CONTINUE 492 WRITE( NOUT, FMT = 9991 )CNAME, SIDE, UPLO, TRANSA 493 CALL SPRTBL( 'M', 'N', NM, MVAL, NN, NVAL, NLDA, 494 $ RESLTS, LDR1, LDR2, NOUT ) 495 360 CONTINUE 496 370 CONTINUE 497 380 CONTINUE 498* 499 ELSE IF( CNAME.EQ.'STRSM ' ) THEN 500* 501* Time STRSM 502* 503 DO 460 ISIDE = 1, NSIDES 504 SIDE = SIDES( ISIDE ) 505 DO 450 IUPLO = 1, NUPLOS 506 UPLO = UPLOS( IUPLO ) 507 IF( LSAME( UPLO, 'U' ) ) THEN 508 IMAT = 9 509 ELSE 510 IMAT = -9 511 END IF 512 DO 440 ITA = 1, NTRANS 513 TRANSA = TRANS( ITA ) 514 DO 430 ILDA = 1, NLDA 515 LDA = LDAVAL( ILDA ) 516 DO 420 IM = 1, NM 517 M = MVAL( IM ) 518 DO 410 IN = 1, NN 519 N = NVAL( IN ) 520 IF( ISIDE.EQ.1 ) THEN 521 CALL STIMMG( IMAT, M, M, A, LDA, 0, 0 ) 522 ELSE 523 CALL STIMMG( IMAT, N, N, A, LDA, 0, 0 ) 524 END IF 525 CALL STIMMG( 0, M, N, B, LDA, 0, 0 ) 526 IC = 0 527 S1 = SECOND( ) 528 390 CONTINUE 529 CALL STRSM( SIDE, UPLO, TRANSA, 530 $ 'Non-unit', M, N, ALPHA, A, 531 $ LDA, B, LDA ) 532 S2 = SECOND( ) 533 TIME = S2 - S1 534 IC = IC + 1 535 IF( TIME.LT.TIMMIN ) THEN 536 CALL STIMMG( 0, M, N, B, LDA, 0, 0 ) 537 GO TO 390 538 END IF 539* 540* Subtract the time used in STIMMG. 541* 542 ICL = 1 543 S1 = SECOND( ) 544 400 CONTINUE 545 S2 = SECOND( ) 546 UNTIME = S2 - S1 547 ICL = ICL + 1 548 IF( ICL.LE.IC ) THEN 549 CALL STIMMG( 0, M, N, B, LDA, 0, 0 ) 550 GO TO 400 551 END IF 552* 553 TIME = ( TIME-UNTIME ) / REAL( IC ) 554 OPS = SOPBL3( CNAME, M, N, ISIDE-1 ) 555 RESLTS( IM, IN, ILDA ) = SMFLOP( OPS, 556 $ TIME, 0 ) 557 410 CONTINUE 558 420 CONTINUE 559 430 CONTINUE 560 WRITE( NOUT, FMT = 9991 )CNAME, SIDE, UPLO, TRANSA 561 CALL SPRTBL( 'M', 'N', NM, MVAL, NN, NVAL, NLDA, 562 $ RESLTS, LDR1, LDR2, NOUT ) 563 440 CONTINUE 564 450 CONTINUE 565 460 CONTINUE 566 END IF 567 WRITE( NOUT, FMT = 9990 ) 568 470 CONTINUE 569 480 CONTINUE 570* 571 9999 FORMAT( 1X, A6, ' timing run not attempted', / ) 572 9998 FORMAT( / ' *** Speed of ', A6, ' in megaflops ***' ) 573 9997 FORMAT( 5X, 'with LDA = ', I5 ) 574 9996 FORMAT( 5X, 'line ', I2, ' with LDA = ', I5 ) 575 9995 FORMAT( / 1X, 'SGEMM with TRANSA = ''', A1, ''', TRANSB = ''', 576 $ A1, '''' ) 577 9994 FORMAT( / 1X, 'K = ', I4, / ) 578 9993 FORMAT( / 1X, 'SSYMM with SIDE = ''', A1, ''', UPLO = ''', A1, 579 $ '''', / ) 580 9992 FORMAT( / 1X, A6, ' with UPLO = ''', A1, ''', TRANS = ''', A1, 581 $ '''', / ) 582 9991 FORMAT( / 1X, A6, ' with SIDE = ''', A1, ''', UPLO = ''', A1, 583 $ ''',', ' TRANS = ''', A1, '''', / ) 584 9990 FORMAT( / / / / / ) 585 RETURN 586* 587* End of STIMB3 588* 589 END 590