1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
|
REAL FUNCTION SOPBL3( SUBNAM, M, N, K )
*
* -- LAPACK timing routine (version 3.0) --
* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
* Courant Institute, Argonne National Lab, and Rice University
* March 31, 1993
*
* .. Scalar Arguments ..
CHARACTER*6 SUBNAM
INTEGER K, M, N
* ..
*
* Purpose
* =======
*
* SOPBL3 computes an approximation of the number of floating point
* operations used by a subroutine SUBNAM with the given values
* of the parameters M, N, and K.
*
* This version counts operations for the Level 3 BLAS.
*
* Arguments
* =========
*
* SUBNAM (input) CHARACTER*6
* The name of the subroutine.
*
* M (input) INTEGER
* N (input) INTEGER
* K (input) INTEGER
* M, N, and K contain parameter values used by the Level 3
* BLAS. The output matrix is always M x N or N x N if
* symmetric, but K has different uses in different
* contexts. For example, in the matrix-matrix multiply
* routine, we have
* C = A * B
* where C is M x N, A is M x K, and B is K x N.
* In xSYMM, xTRMM, and xTRSM, K indicates whether the matrix
* A is applied on the left or right. If K <= 0, the matrix
* is applied on the left, if K > 0, on the right.
*
* =====================================================================
*
* .. Local Scalars ..
CHARACTER C1
CHARACTER*2 C2
CHARACTER*3 C3
REAL ADDS, EK, EM, EN, MULTS
* ..
* .. External Functions ..
LOGICAL LSAME, LSAMEN
EXTERNAL LSAME, LSAMEN
* ..
* .. Executable Statements ..
*
* Quick return if possible
*
IF( M.LE.0 .OR.
$ .NOT.( LSAME( SUBNAM, 'S' ) .OR. LSAME( SUBNAM, 'D' ) .OR.
$ LSAME( SUBNAM, 'C' ) .OR. LSAME( SUBNAM, 'Z' ) ) ) THEN
SOPBL3 = 0
RETURN
END IF
*
C1 = SUBNAM( 1: 1 )
C2 = SUBNAM( 2: 3 )
C3 = SUBNAM( 4: 6 )
MULTS = 0
ADDS = 0
EM = M
EN = N
EK = K
*
* ----------------------
* Matrix-matrix products
* assume beta = 1
* ----------------------
*
IF( LSAMEN( 3, C3, 'MM ' ) ) THEN
*
IF( LSAMEN( 2, C2, 'GE' ) ) THEN
*
MULTS = EM*EK*EN
ADDS = EM*EK*EN
*
ELSE IF( LSAMEN( 2, C2, 'SY' ) .OR.
$ LSAMEN( 3, SUBNAM, 'CHE' ) .OR.
$ LSAMEN( 3, SUBNAM, 'ZHE' ) ) THEN
*
* IF K <= 0, assume A multiplies B on the left.
*
IF( K.LE.0 ) THEN
MULTS = EM*EM*EN
ADDS = EM*EM*EN
ELSE
MULTS = EM*EN*EN
ADDS = EM*EN*EN
END IF
*
ELSE IF( LSAMEN( 2, C2, 'TR' ) ) THEN
*
IF( K.LE.0 ) THEN
MULTS = EN*EM*( EM+1. ) / 2.
ADDS = EN*EM*( EM-1. ) / 2.
ELSE
MULTS = EM*EN*( EN+1. ) / 2.
ADDS = EM*EN*( EN-1. ) / 2.
END IF
*
END IF
*
* ------------------------------------------------
* Rank-K update of a symmetric or Hermitian matrix
* ------------------------------------------------
*
ELSE IF( LSAMEN( 3, C3, 'RK ' ) ) THEN
*
IF( LSAMEN( 2, C2, 'SY' ) .OR. LSAMEN( 3, SUBNAM, 'CHE' ) .OR.
$ LSAMEN( 3, SUBNAM, 'ZHE' ) ) THEN
*
MULTS = EK*EM*( EM+1. ) / 2.
ADDS = EK*EM*( EM+1. ) / 2.
END IF
*
* ------------------------------------------------
* Rank-2K update of a symmetric or Hermitian matrix
* ------------------------------------------------
*
ELSE IF( LSAMEN( 3, C3, 'R2K' ) ) THEN
*
IF( LSAMEN( 2, C2, 'SY' ) .OR. LSAMEN( 3, SUBNAM, 'CHE' ) .OR.
$ LSAMEN( 3, SUBNAM, 'ZHE' ) ) THEN
*
MULTS = EK*EM*EM
ADDS = EK*EM*EM + EM
END IF
*
* -----------------------------------------
* Solving system with many right hand sides
* -----------------------------------------
*
ELSE IF( LSAMEN( 5, SUBNAM( 2: 6 ), 'TRSM ' ) ) THEN
*
IF( K.LE.0 ) THEN
MULTS = EN*EM*( EM+1. ) / 2.
ADDS = EN*EM*( EM-1. ) / 2.
ELSE
MULTS = EM*EN*( EN+1. ) / 2.
ADDS = EM*EN*( EN-1. ) / 2.
END IF
*
END IF
*
* ------------------------------------------------
* Compute the total number of operations.
* For real and double precision routines, count
* 1 for each multiply and 1 for each add.
* For complex and complex*16 routines, count
* 6 for each multiply and 2 for each add.
* ------------------------------------------------
*
IF( LSAME( C1, 'S' ) .OR. LSAME( C1, 'D' ) ) THEN
*
SOPBL3 = MULTS + ADDS
*
ELSE
*
SOPBL3 = 6*MULTS + 2*ADDS
*
END IF
*
RETURN
*
* End of SOPBL3
*
END
|