|
|
| |
| # lines: |
311 | | # code: |
311 | | # comment: | 0 | |
# blank: | 0 |
| # Variables: | 38 |
| # Callers: | 2 |
| # Callings: | 2 |
| # Words: | 155 |
| # Keywords: | 93 |
|
|
|
|
|
..
.. Array Arguments ..
..
Purpose
=======
PZGETRF computes an LU factorization of a general M-by-N distributed
matrix sub( A ) = (IA:IA+M-1,JA:JA+N-1) using partial pivoting with
row interchanges.
The factorization has the form sub( A ) = P * L * U, where P is a
permutation matrix, L is lower triangular with unit diagonal ele-
ments (lower trapezoidal if m > n), and U is upper triangular
(upper trapezoidal if m < n). L and U are stored in sub( A ).
This is the right-looking Parallel Level 3 BLAS version of the
algorithm.
Notes
=====
Each global data object is described by an associated description
vector. This vector stores the information required to establish
the mapping between an object element and its corresponding process
and memory location.
Let A be a generic term for any 2D block cyclicly distributed array.
Such a global array has an associated description vector DESCA.
In the following comments, the character _ should be read as
"of the global array".
NOTATION STORED IN EXPLANATION
--------------- -------------- --------------------------------------
DTYPE_A(global) DESCA( DTYPE_ )The descriptor type. In this case,
DTYPE_A = 1.
CTXT_A (global) DESCA( CTXT_ ) The BLACS context handle, indicating
the BLACS process grid A is distribu-
ted over. The context itself is glo-
bal, but the handle (the integer
value) may vary.
M_A (global) DESCA( M_ ) The number of rows in the global
array A.
N_A (global) DESCA( N_ ) The number of columns in the global
array A.
MB_A (global) DESCA( MB_ ) The blocking factor used to distribute
the rows of the array.
NB_A (global) DESCA( NB_ ) The blocking factor used to distribute
the columns of the array.
RSRC_A (global) DESCA( RSRC_ ) The process row over which the first
row of the array A is distributed.
CSRC_A (global) DESCA( CSRC_ ) The process column over which the
first column of the array A is
distributed.
LLD_A (local) DESCA( LLD_ ) The leading dimension of the local
array. LLD_A >= MAX(1,LOCr(M_A)).
Let K be the number of rows or columns of a distributed matrix,
and assume that its process grid has dimension p x q.
LOCr( K ) denotes the number of elements of K that a process
would receive if K were distributed over the p processes of its
process column.
Similarly, LOCc( K ) denotes the number of elements of K that a
process would receive if K were distributed over the q processes of
its process row.
The values of LOCr() and LOCc() may be determined via a call to the
ScaLAPACK tool function, NUMROC:
LOCr( M ) = NUMROC( M, MB_A, MYROW, RSRC_A, NPROW ),
LOCc( N ) = NUMROC( N, NB_A, MYCOL, CSRC_A, NPCOL ).
An upper bound for these quantities may be computed by:
LOCr( M ) <= ceil( ceil(M/MB_A)/NPROW )*MB_A
LOCc( N ) <= ceil( ceil(N/NB_A)/NPCOL )*NB_A
This routine requires square block decomposition ( MB_A = NB_A ).
Arguments
=========
M (global input) INTEGER
The number of rows to be operated on, i.e. the number of rows
of the distributed submatrix sub( A ). M >= 0.
N (global input) INTEGER
The number of columns to be operated on, i.e. the number of
columns of the distributed submatrix sub( A ). N >= 0.
A (local input/local output) COMPLEX*16 pointer into the
local memory to an array of dimension (LLD_A, LOCc(JA+N-1)).
On entry, this array contains the local pieces of the M-by-N
distributed matrix sub( A ) to be factored. On exit, this
array contains the local pieces of the factors L and U from
the factorization sub( A ) = P*L*U; the unit diagonal ele-
ments of L are not stored.
IA (global input) INTEGER
The row index in the global array A indicating the first
row of sub( A ).
JA (global input) INTEGER
The column index in the global array A indicating the
first column of sub( A ).
DESCA (global and local input) INTEGER array of dimension DLEN_.
The array descriptor for the distributed matrix A.
IPIV (local output) INTEGER array, dimension ( LOCr(M_A)+MB_A )
This array contains the pivoting information.
IPIV(i) -> The global row local row i was swapped with.
This array is tied to the distributed matrix A.
INFO (global output) INTEGER
= 0: successful exit
< 0: If the i-th argument is an array and the j-entry had
an illegal value, then INFO = -(i*100+j), if the i-th
argument is a scalar and had an illegal value, then
INFO = -i.
> 0: If INFO = K, U(IA+K-1,JA+K-1) is exactly zero.
The factorization has been completed, but the factor U
is exactly singular, and division by zero will occur if
it is used to solve a system of equations.
=====================================================================
.. Parameters ..
|
|
|
|
001 SUBROUTINE PZGETRF( M , N , A , IA , JA , DESCA , IPIV , INFO )
002
003 * -- ScaLAPACK routine(version 1.7) --
004 * University of Tennessee , Knoxville , Oak Ridge National Laboratory ,
005 * and University of California , Berkeley.
006 * May 25 , 2001
007
008 * .. Scalar Arguments ..
009 INTEGER IA , INFO , JA , M , N
010 INTEGER BLOCK_CYCLIC_2D , CSRC_ , CTXT_ , DLEN_ , DTYPE_ ,
011 $LLD_ , MB_ , M_ , NB_ , N_ , RSRC_
012 PARAMETER( BLOCK_CYCLIC_2D = 1 , DLEN_ = 9 , DTYPE_ = 1 ,
013 $CTXT_ = 2 , M_ = 3 , N_ = 4 , MB_ = 5 , NB_ = 6 ,
014 $RSRC_ = 7 , CSRC_ = 8 , LLD_ = 9 )
015 COMPLEX*16 ONE
016 PARAMETER( ONE = 1.0D + 0 )
017 * ..
018 * .. Local Scalars ..
019 CHARACTER COLBTOP , COLCTOP , ROWBTOP
020 INTEGER I , ICOFF , ICTXT , IINFO , IN , IROFF , J , JB , JN ,
021 $MN , MYCOL , MYROW , NPCOL , NPROW
022 * ..
023 * .. Local Arrays ..
024 INTEGER IDUM1( 1 ) , IDUM2( 1 )
025 * ..
026 * .. External Subroutines ..
027 EXTERNAL BLACS_GRIDINFO , CHK1MAT , IGAMN2D , PCHK1MAT ,
028 $PB_TOPGET , PB_TOPSET , PXERBLA , PZGEMM , PZGETF2 ,
029 $PZLASWP , PZTRSM
030 * ..
031 * .. External Functions ..
032 INTEGER ICEIL
033 EXTERNAL ICEIL
034 * ..
035 * .. Intrinsic Functions ..
036 INTRINSIC MIN , MOD
037 * ..
038 * .. Executable Statements ..
039
040 * Get grid parameters
041
042 ICTXT = DESCA( CTXT_ )
043 CALL BLACS_GRIDINFO( ICTXT , NPROW , NPCOL , MYROW , MYCOL )
044
045 * Test the input parameters
046
047 INFO = 0
048 IF( NPROW.EQ. - 1 ) THEN
048
049 INFO = - (600 + CTXT_)
050 ELSE
050
051 CALL CHK1MAT( M , 1 , N , 2 , IA , JA , DESCA , 6 , INFO )
052 IF( INFO.EQ.0 ) THEN
052
053 IROFF = MOD( IA - 1 , DESCA( MB_ ) )
054 ICOFF = MOD( JA - 1 , DESCA( NB_ ) )
055 IF( IROFF.NE.0 ) THEN
055
056 INFO = - 4
057 ELSE IF( ICOFF.NE.0 ) THEN
057
058 INFO = - 5
059 ELSE IF( DESCA( MB_ ).NE.DESCA( NB_ ) ) THEN
059
060 INFO = - (600 + NB_)
061 END IF
062 END IF
063 CALL PCHK1MAT( M , 1 , N , 2 , IA , JA , DESCA , 6 , 0 , IDUM1 ,
064 $ IDUM2 , INFO )
065 END IF
066
067 IF( INFO.NE.0 ) THEN
067
068 CALL PXERBLA( ICTXT , 'PZGETRF' , - INFO )
069 RETURN
070 END IF
071
072 * Quick return if possible
073
074 IF( DESCA( M_ ).EQ.1 ) THEN
074
075 IPIV( 1 ) = 1
076 RETURN
077 ELSE IF( M.EQ.0 .OR. N.EQ.0 ) THEN
077
078 RETURN
079 END IF
080
081 * Split - ring topology for the communication along process rows
082
083 CALL PB_TOPGET( ICTXT , 'Broadcast' , 'Rowwise' , ROWBTOP )
084 CALL PB_TOPGET( ICTXT , 'Broadcast' , 'Columnwise' , COLBTOP )
085 CALL PB_TOPGET( ICTXT , 'Combine' , 'Columnwise' , COLCTOP )
086 CALL PB_TOPSET( ICTXT , 'Broadcast' , 'Rowwise' , 'S - ring' )
087 CALL PB_TOPSET( ICTXT , 'Broadcast' , 'Columnwise' , ' ' )
088 CALL PB_TOPSET( ICTXT , 'Combine' , 'Columnwise' , ' ' )
089
090 * Handle the first block of columns separately
091
092 MN = MIN( M , N )
093 IN = MIN( ICEIL( IA , DESCA( MB_ ) )*DESCA( MB_ ) , IA + M - 1 )
094 JN = MIN( ICEIL( JA , DESCA( NB_ ) )*DESCA( NB_ ) , JA + MN - 1 )
095 JB = JN - JA + 1
096
097 * Factor diagonal and subdiagonal blocks and test for exact
098 * singularity.
099
100 CALL PZGETF2 ( M , JB , A , IA , JA , DESCA , IPIV , INFO )
101
102 IF( JB + 1.LE.N ) THEN
103
104 * Apply interchanges to columns JN + 1 : JA + N - 1.
105
105
106 CALL PZLASWP ( 'Forward' , 'Rows' , N - JB , A , IA , JN + 1 , DESCA ,
107 $ IA , IN , IPIV )
108
109 * Compute block row of U.
110
111 CALL PZTRSM( 'Left' , 'Lower' , 'No transpose' , 'Unit' , JB ,
112 $ N - JB , ONE , A , IA , JA , DESCA , A , IA , JN + 1 , DESCA )
113
114 IF( JB + 1.LE.M ) THEN
115
116 * Update trailing submatrix.
117
117
118 CALL PZGEMM( 'No transpose' , 'No transpose' , M - JB , N - JB , JB ,
119 $ - ONE , A , IN + 1 , JA , DESCA , A , IA , JN + 1 , DESCA ,
120 $ ONE , A , IN + 1 , JN + 1 , DESCA )
121
122 END IF
123 END IF
124
125 * Loop over the remaining blocks of columns.
126
127 DO 10 J = JN + 1 , JA + MN - 1 , DESCA( NB_ )
127
128 JB = MIN( MN - J + JA , DESCA( NB_ ) )
129 I = IA + J - JA
130
131 * Factor diagonal and subdiagonal blocks and test for exact
132 * singularity.
133
134 CALL PZGETF2 ( M - J + JA , JB , A , I , J , DESCA , IPIV , IINFO )
135
136 IF( INFO.EQ.0 .AND. IINFO.GT.0 )
136
137 $ INFO = IINFO + J - JA
138
139 * Apply interchanges to columns JA : J - JA.
140
141 CALL PZLASWP ( 'Forward' , 'Rowwise' , J - JA , A , IA , JA , DESCA ,
142 $ I , I + JB - 1 , IPIV )
143
144 IF( J - JA + JB + 1.LE.N ) THEN
145
146 * Apply interchanges to columns J + JB : JA + N - 1.
147
147
148 CALL PZLASWP ( 'Forward' , 'Rowwise' , N - J - JB + JA , A , IA , J + JB ,
149 $ DESCA , I , I + JB - 1 , IPIV )
150
151 * Compute block row of U.
152
153 CALL PZTRSM( 'Left' , 'Lower' , 'No transpose' , 'Unit' , JB ,
154 $ N - J - JB + JA , ONE , A , I , J , DESCA , A , I , J + JB ,
155 $ DESCA )
156
157 IF( J - JA + JB + 1.LE.M ) THEN
158
159 * Update trailing submatrix.
160
160
161 CALL PZGEMM( 'No transpose' , 'No transpose' , M - J - JB + JA ,
162 $ N - J - JB + JA , JB , - ONE , A , I + JB , J , DESCA , A ,
163 $ I , J + JB , DESCA , ONE , A , I + JB , J + JB , DESCA )
164
165 END IF
166 END IF
167
168 10 CONTINUE
169
170 IF( INFO.EQ.0 )
170
171 $ INFO = MN + 1
172 CALL IGAMN2D( ICTXT , 'Rowwise' , ' ' , 1 , 1 , INFO , 1 , IDUM1 , IDUM2 ,
173 $ - 1 , - 1 , MYCOL )
174 IF( INFO.EQ.MN + 1 )
174
175 $ INFO = 0
176
177 CALL PB_TOPSET( ICTXT , 'Broadcast' , 'Rowwise' , ROWBTOP )
178 CALL PB_TOPSET( ICTXT , 'Broadcast' , 'Columnwise' , COLBTOP )
179 CALL PB_TOPSET( ICTXT , 'Combine' , 'Columnwise' , COLCTOP )
180
181 RETURN
182
183 * End of PZGETRF
184
185 END46
17
|
|
Variables in Routine PZGETRF()
| Summary Report |
| Data Type | Quantity | Size(byte) |
| CHARACTER | 3 | 3 |
| COMPLEX*16 | 1 | ? |
| INTEGER | 34 | 140 |
| TOTAL | 38 | 143 |
List of Variables
CHARACTER
COMPLEX*16
INTEGER
| BLOCK_CYCLIC_2D | CSRC_ | CTXT_ | DLEN_ | DTYPE_ |
| I | IA | ICEIL | ICOFF | ICTXT |
| IDUM1( 1 ) | IDUM2( 1 ) | IINFO | IN | INFO |
| IPIV | IROFF | J | JA | JB |
| JN | LLD_ | M | M_ | MB_ |
| MN | MYCOL | MYROW | N | N_ |
| NB_ | NPCOL | NPROW | RSRC_ | |
Variables Dependence Graph Put the mouse over a right hand side variable to display the corresponding line of the dependence | | - | | - | - | | I | <--- | JI = IA + J - JA, JAI = IA + J - JA, IAI = IA + J - JA |
| ICOFF | <--- | JAICOFF = MOD( JA-1, DESCA( NB_ ) ), NB_ICOFF = MOD( JA-1, DESCA( NB_ ) ) |
| ICTXT | <--- | CTXT_ICTXT = DESCA( CTXT_ ) |
| IN | <--- | ICEILIN = MIN( ICEIL( IA, DESCA( MB_ ) )*DESCA( MB_ ), IA+M-1 ), MIN = MIN( ICEIL( IA, DESCA( MB_ ) )*DESCA( MB_ ), IA+M-1 ), MB_IN = MIN( ICEIL( IA, DESCA( MB_ ) )*DESCA( MB_ ), IA+M-1 ), IAIN = MIN( ICEIL( IA, DESCA( MB_ ) )*DESCA( MB_ ), IA+M-1 ) |
| INFO | <--- | NB_INFO = -(600+NB_), CTXT_INFO = -(600+CTXT_) |
| IROFF | <--- | MB_IROFF = MOD( IA-1, DESCA( MB_ ) ), IAIROFF = MOD( IA-1, DESCA( MB_ ) ) |
| J | <--- | JADO 10 J = JN+1, JA+MN-1, DESCA( NB_ ), JNDO 10 J = JN+1, JA+MN-1, DESCA( NB_ ), MNDO 10 J = JN+1, JA+MN-1, DESCA( NB_ ), NB_DO 10 J = JN+1, JA+MN-1, DESCA( NB_ ) |
| JB | <--- | JJB = MIN( MN-J+JA, DESCA( NB_ ) ), JAJB = MIN( MN-J+JA, DESCA( NB_ ) ){2JB = JN - JA + 1}, JNJB = JN - JA + 1, MNJB = MIN( MN-J+JA, DESCA( NB_ ) ), NB_JB = MIN( MN-J+JA, DESCA( NB_ ) ) |
| JN | <--- | ICEILJN = MIN( ICEIL( JA, DESCA( NB_ ) )*DESCA( NB_ ), JA+MN-1 ), JAJN = MIN( ICEIL( JA, DESCA( NB_ ) )*DESCA( NB_ ), JA+MN-1 ), MNJN = MIN( ICEIL( JA, DESCA( NB_ ) )*DESCA( NB_ ), JA+MN-1 ), NB_JN = MIN( ICEIL( JA, DESCA( NB_ ) )*DESCA( NB_ ), JA+MN-1 ) |
| MN | <--- | MMN = MIN( M, N ), NMN = MIN( M, N ) |
|
|
Analysis elements of the routine PZGETRF() Put the mouse over each element to display detailed matching information
Assigned variables |
| | | BLOCK_CYCLIC_2D , CSRC_ , CTXT_ , DLEN_ , DTYPE_ , I , ICOFF , ICTXT , IN , INFO , IPIV , IROFF , J , JB , JN , LLD_ , M_ , MB_ , MN , N_ , NB_ , ONE , RSRC_ |
|
Active variables |
| | | A , BLOCK_CYCLIC_2D , COLBTOP , COLCTOP , CSRC_ , CTXT_ , DESCA , DLEN_ , DTYPE_ , I , IA , ICEIL , ICOFF , ICTXT , IDUM1 , IDUM2 , IINFO , IN , INFO , IPIV , IROFF , J , JA , JB , JN , LLD_ , M , M_ , MB_ , MN , MYCOL , MYROW , N , N_ , NB_ , NPCOL , NPROW , ONE , ROWBTOP , RSRC_ |
|
Accessed arrays [ array name : associated index ] |
| | DESCA | : CTXT_ , M_ , MB_ , MB_ , MB_ , NB_ , NB_ , NB_ , NB_ , NB_ |
| | ICEIL | : IA, DESCA( MB_ ) , JA, DESCA( NB_ ) |
| | IDUM1 | : 1 |
| | IDUM2 | : 1 |
| | IPIV | : 1 |
|
Conditional statements [ statement : associated predicate ] |
| | do | : ( 10 J = JN + 1 , JA + MN - 1 , DESCA( NB_ ) ) |
| | for | : ( the communication along process rows ) , ( exact ) , ( exact ) |
| | if | : ( NPROW.EQ. - 1 ) , ( INFO.EQ.0 ) , ( IROFF.NE.0 ) , ( ICOFF.NE.0 ) , ( (DESCA( MB_ ).NE.DESCA( NB_ ) ) ) , ( INFO.NE.0 ) , ( possible ) , ( (DESCA( M_ ).EQ.1 ) ) , ( M.EQ.0 .OR. N.EQ.0 ) , ( JB+1.LE.N ) , ( JB+1.LE.M ) , ( INFO.EQ.0 .AND. IINFO.GT.0 ) , ( J-JA+JB + 1.LE.N ) , ( J-JA+JB + 1.LE.M ) , ( INFO.EQ.0 ) , ( INFO.EQ.MN + 1 ) |
|
| List of variables | BLOCK_CYCLIC_2D COLBTOP COLCTOP CSRC_ CTXT_ DLEN_ DTYPE_
| I IA ICEIL ICOFF ICTXT IDUM1( 1 ) IDUM2( 1 ) IINFO
| IN INFO IPIV IROFF J JA JB JN
| LLD_ M M_ MB_ MN MYCOL MYROW N
| N_ NB_ NPCOL NPROW ONE ROWBTOP RSRC_ | | close
| |
BLOCK_CYCLIC_2D
COLBTOP
COLCTOP
CSRC_
CTXT_
DLEN_
DTYPE_
I
IA
ICEIL
ICOFF
ICTXT
IDUM1( 1 )
IDUM2( 1 )
IINFO
IN
INFO
IPIV
IROFF
J
JA
JB
JN
LLD_
M
M_
MB_
MN
MYCOL
MYROW
N
N_
NB_
NPCOL
NPROW
ONE
ROWBTOP
RSRC_
494#545
| |