|
|
| |
| # lines: |
271 | | # code: |
271 | | # comment: | 0 | |
# blank: | 0 |
| # Variables: | 44 |
| # Callers: | 1 |
| # Callings: | 1 |
| # Words: | 72 |
| # Keywords: | 51 |
|
|
|
|
|
..
.. Array Arguments ..
..
Purpose
=======
PCLAQGE equilibrates a general M-by-N distributed matrix
sub( A ) = A(IA:IA+M-1,JA:JA+N-1) using the row and scaling
factors in the vectors R and C.
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
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 pointer into the
local memory to an array of dimension (LLD_A,LOCc(JA+N-1))
containing on entry the M-by-N matrix sub( A ). On exit,
the equilibrated distributed matrix. See EQUED for the
form of the equilibrated distributed submatrix.
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.
R (local input) REAL array, dimension LOCr(M_A)
The row scale factors for sub( A ). R is aligned with the
distributed matrix A, and replicated across every process
column. R is tied to the distributed matrix A.
C (local input) REAL array, dimension LOCc(N_A)
The column scale factors of sub( A ). C is aligned with the
distributed matrix A, and replicated down every process
row. C is tied to the distributed matrix A.
ROWCND (global input) REAL
The global ratio of the smallest R(i) to the largest R(i),
IA <= i <= IA+M-1.
COLCND (global input) REAL
The global ratio of the smallest C(i) to the largest C(i),
JA <= j <= JA+N-1.
AMAX (global input) REAL
Absolute value of largest distributed submatrix entry.
EQUED (global output) CHARACTER
Specifies the form of equilibration that was done.
= 'N': No equilibration
= 'R': Row equilibration, i.e., sub( A ) has been pre-
multiplied by diag(R(IA:IA+M-1)),
= 'C': Column equilibration, i.e., sub( A ) has been post-
multiplied by diag(C(JA:JA+N-1)),
= 'B': Both row and column equilibration, i.e., sub( A )
has been replaced by
diag(R(IA:IA+M-1)) * sub( A ) * diag(C(JA:JA+N-1)).
Internal Parameters
===================
THRESH is a threshold value used to decide if row or column scaling
should be done based on the ratio of the row or column scaling
factors. If ROWCND < THRESH, row scaling is done, and if
COLCND < THRESH, column scaling is done.
LARGE and SMALL are threshold values used to decide if row scaling
should be done based on the absolute size of the largest matrix
element. If AMAX > LARGE or AMAX < SMALL, row scaling is done.
=====================================================================
.. Parameters ..
|
|
|
|
001 SUBROUTINE PCLAQGE( M , N , A , IA , JA , DESCA , R , C , ROWCND , COLCND ,
002 $AMAX , EQUED )
003
004 * -- ScaLAPACK auxiliary routine(version 1.7) --
005 * University of Tennessee , Knoxville , Oak Ridge National Laboratory ,
006 * and University of California , Berkeley.
007 * May 1 , 1997
008
009 * .. Scalar Arguments ..
010 CHARACTER EQUED
011 INTEGER IA , JA , M , N
012 REAL AMAX , COLCND , ROWCND
013 INTEGER BLOCK_CYCLIC_2D , CSRC_ , CTXT_ , DLEN_ , DTYPE_ ,
014 $LLD_ , MB_ , M_ , NB_ , N_ , RSRC_
015 PARAMETER( BLOCK_CYCLIC_2D = 1 , DLEN_ = 9 , DTYPE_ = 1 ,
016 $CTXT_ = 2 , M_ = 3 , N_ = 4 , MB_ = 5 , NB_ = 6 ,
017 $RSRC_ = 7 , CSRC_ = 8 , LLD_ = 9 )
018 REAL ONE , THRESH
019 PARAMETER( ONE = 1.0E + 0 , THRESH = 0.1E + 0 )
020 * ..
021 * .. Local Scalars ..
022 INTEGER I , IACOL , IAROW , ICOFF , ICTXT , IIA , IOFFA ,
023 $IROFF , J , JJA , LDA , MP , MYCOL , MYROW , NPCOL ,
024 $NPROW , NQ
025 REAL CJ , LARGE , SMALL
026 * ..
027 * .. External Subroutines ..
028 EXTERNAL BLACS_GRIDINFO , INFOG2L
029 * ..
030 * .. External Functions ..
031 INTEGER NUMROC
032 REAL PSLAMCH
033 EXTERNAL NUMROC , PSLAMCH
034 * ..
035 * .. Intrinsic Functions ..
036 INTRINSIC MOD
037 * ..
038 * .. Executable Statements ..
039
040 * Quick return if possible
041
042 IF( M.LE.0 .OR. N.LE.0 ) THEN
042
043 EQUED = 'N'
044 RETURN
045 END IF
046
047 * Get grid parameters and compute local indexes
048
049 ICTXT = DESCA( CTXT_ )
050 CALL BLACS_GRIDINFO( ICTXT , NPROW , NPCOL , MYROW , MYCOL )
051 CALL INFOG2L( IA , JA , DESCA , NPROW , NPCOL , MYROW , MYCOL , IIA , JJA ,
052 $IAROW , IACOL )
053 IROFF = MOD( IA - 1 , DESCA( MB_ ) )
054 ICOFF = MOD( JA - 1 , DESCA( NB_ ) )
055 MP = NUMROC( M + IROFF , DESCA( MB_ ) , MYROW , IAROW , NPROW )
056 NQ = NUMROC( N + ICOFF , DESCA( NB_ ) , MYCOL , IACOL , NPCOL )
057 IF( MYROW.EQ.IAROW )
057
058 $ MP = MP - IROFF
059 IF( MYCOL.EQ.IACOL )
059
060 $ NQ = NQ - ICOFF
061 LDA = DESCA( LLD_ )
062
063 * Initialize LARGE and SMALL.
064
065 SMALL = PSLAMCH( ICTXT , 'Safe minimum' ) /
066 $ PSLAMCH( ICTXT , 'Precision' )
067 LARGE = ONE / SMALL
068
069 IF( ROWCND.GE.THRESH .AND. AMAX.GE.SMALL .AND. AMAX.LE.LARGE )
069
070 $ THEN
071
072 * No row scaling
073
074 IF( COLCND.GE.THRESH ) THEN
075
076 * No column scaling
077
077
078 EQUED = 'N'
079
080 ELSE
081
082 * Column scaling
083
083
084 IOFFA =(JJA - 1)*LDA
085 DO 20 J = JJA , JJA + NQ - 1
085
086 CJ = C( J )
087 DO 10 I = IIA , IIA + MP - 1
087
088 A( IOFFA + I ) = CJ*A( IOFFA + I )
089 10 CONTINUE
089
090 IOFFA = IOFFA + LDA
091 20 CONTINUE
091
092 EQUED = 'C'
093 END IF
094
095 ELSE IF( COLCND.GE.THRESH ) THEN
096
097 * Row scaling , no column scaling
098
098
099 IOFFA =(JJA - 1)*LDA
100 DO 40 J = JJA , JJA + NQ - 1
100
101 DO 30 I = IIA , IIA + MP - 1
101
102 A( IOFFA + I ) = R( I )*A( IOFFA + I )
103 30 CONTINUE
103
104 IOFFA = IOFFA + LDA
105 40 CONTINUE
105
106 EQUED = 'R'
107
108 ELSE
109
110 * Row and column scaling
111
111
112 IOFFA =(JJA - 1)*LDA
113 DO 60 J = JJA , JJA + NQ - 1
113
114 CJ = C( J )
115 DO 50 I = IIA , IIA + MP - 1
115
116 A( IOFFA + I ) = CJ*R( I )*A( IOFFA + I )
117 50 CONTINUE
117
118 IOFFA = IOFFA + LDA
119 60 CONTINUE
119
120 EQUED = 'B'
121
122 END IF
123
124 RETURN
125
126 * End of PCLAQGE
127
128 END26
20
|
|
Variables in Routine PCLAQGE()
| Summary Report |
| Data Type | Quantity | Size(byte) |
| CHARACTER | 1 | 1 |
| INTEGER | 33 | 132 |
| REAL | 10 | 40 |
| TOTAL | 44 | 173 |
List of Variables
CHARACTER
INTEGER
| BLOCK_CYCLIC_2D | CSRC_ | CTXT_ | DLEN_ | DTYPE_ |
| I | IA | IACOL | IAROW | ICOFF |
| ICTXT | IIA | IOFFA | IROFF | J |
| JA | JJA | LDA | LLD_ | M |
| M_ | MB_ | MP | MYCOL | MYROW |
| N | N_ | NB_ | NPCOL | NPROW |
| NQ | NUMROC | RSRC_ | | |
REAL
| A | AMAX | CJ | COLCND | LARGE |
| ONE | PSLAMCH | ROWCND | SMALL | THRESH |
Variables Dependence Graph Put the mouse over a right hand side variable to display the corresponding line of the dependence | | - | | - | - | | A | <--- | AA( IOFFA + I ) = R( I )*A( IOFFA + I ){2A( IOFFA + I ) = CJ*R( I )*A( IOFFA + I ), 3A( IOFFA + I ) = CJ*A( IOFFA + I )}, IA( IOFFA + I ) = R( I )*A( IOFFA + I ){2A( IOFFA + I ) = CJ*R( I )*A( IOFFA + I ), 3A( IOFFA + I ) = CJ*A( IOFFA + I )}, IOFFAA( IOFFA + I ) = R( I )*A( IOFFA + I ){2A( IOFFA + I ) = CJ*R( I )*A( IOFFA + I ), 3A( IOFFA + I ) = CJ*A( IOFFA + I )}, CJA( IOFFA + I ) = CJ*R( I )*A( IOFFA + I ){2A( IOFFA + I ) = CJ*A( IOFFA + I )} |
| CJ | <--- | JCJ = C( J ){2CJ = C( J )} |
| EQUED | <--- | NEQUED = 'N'{2EQUED = 'N'} |
| I | <--- | IIADO 30 I = IIA, IIA+MP-1{2DO 50 I = IIA, IIA+MP-1, 3DO 10 I = IIA, IIA+MP-1}, MPDO 30 I = IIA, IIA+MP-1{2DO 50 I = IIA, IIA+MP-1, 3DO 10 I = IIA, IIA+MP-1} |
| ICOFF | <--- | JAICOFF = MOD( JA-1, DESCA( NB_ ) ), NB_ICOFF = MOD( JA-1, DESCA( NB_ ) ) |
| ICTXT | <--- | CTXT_ICTXT = DESCA( CTXT_ ) |
| IOFFA | <--- | IOFFAIOFFA = IOFFA + LDA{2IOFFA = IOFFA + LDA, 3IOFFA = IOFFA + LDA}, JJAIOFFA = (JJA-1)*LDA{2IOFFA = (JJA-1)*LDA, 3IOFFA = (JJA-1)*LDA}, LDAIOFFA = IOFFA + LDA{2IOFFA = (JJA-1)*LDA, 3IOFFA = IOFFA + LDA, 4IOFFA = (JJA-1)*LDA, 5IOFFA = IOFFA + LDA, 6IOFFA = (JJA-1)*LDA} |
| IROFF | <--- | IAIROFF = MOD( IA-1, DESCA( MB_ ) ), MB_IROFF = MOD( IA-1, DESCA( MB_ ) ) |
| J | <--- | JJADO 40 J = JJA, JJA+NQ-1{2DO 60 J = JJA, JJA+NQ-1, 3DO 20 J = JJA, JJA+NQ-1}, NQDO 40 J = JJA, JJA+NQ-1{2DO 60 J = JJA, JJA+NQ-1, 3DO 20 J = JJA, JJA+NQ-1} |
| LARGE | <--- | ONELARGE = ONE / SMALL, SMALLLARGE = ONE / SMALL |
| LDA | <--- | LLD_LDA = DESCA( LLD_ ) |
| MP | <--- | IAROWMP = NUMROC( M+IROFF, DESCA( MB_ ), MYROW, IAROW, NPROW ), IROFFMP = NUMROC( M+IROFF, DESCA( MB_ ), MYROW, IAROW, NPROW ), MMP = NUMROC( M+IROFF, DESCA( MB_ ), MYROW, IAROW, NPROW ), MB_MP = NUMROC( M+IROFF, DESCA( MB_ ), MYROW, IAROW, NPROW ), MYROWMP = NUMROC( M+IROFF, DESCA( MB_ ), MYROW, IAROW, NPROW ), NPROWMP = NUMROC( M+IROFF, DESCA( MB_ ), MYROW, IAROW, NPROW ), NUMROCMP = NUMROC( M+IROFF, DESCA( MB_ ), MYROW, IAROW, NPROW ) |
| NQ | <--- | IACOLNQ = NUMROC( N+ICOFF, DESCA( NB_ ), MYCOL, IACOL, NPCOL ), ICOFFNQ = NUMROC( N+ICOFF, DESCA( NB_ ), MYCOL, IACOL, NPCOL ), MYCOLNQ = NUMROC( N+ICOFF, DESCA( NB_ ), MYCOL, IACOL, NPCOL ), NNQ = NUMROC( N+ICOFF, DESCA( NB_ ), MYCOL, IACOL, NPCOL ), NB_NQ = NUMROC( N+ICOFF, DESCA( NB_ ), MYCOL, IACOL, NPCOL ), NPCOLNQ = NUMROC( N+ICOFF, DESCA( NB_ ), MYCOL, IACOL, NPCOL ), NUMROCNQ = NUMROC( N+ICOFF, DESCA( NB_ ), MYCOL, IACOL, NPCOL ) |
| SMALL | <--- | ICTXTSMALL = PSLAMCH( ICTXT, 'Safe minimum' ) /, PSLAMCHSMALL = PSLAMCH( ICTXT, 'Safe minimum' ) / |
|
|
Analysis elements of the routine PCLAQGE() Put the mouse over each element to display detailed matching information
Assigned variables |
| | | BLOCK_CYCLIC_2D , CJ , CSRC_ , CTXT_ , DLEN_ , DTYPE_ , EQUED , I , ICOFF , ICTXT , IOFFA , IROFF , J , LARGE , LDA , LLD_ , M_ , MB_ , MP , N_ , NB_ , NQ , ONE , RSRC_ , SMALL , THRESH |
|
Active variables |
| | | A , AMAX , BLOCK_CYCLIC_2D , C , CJ , COLCND , CSRC_ , CTXT_ , DESCA , DLEN_ , DTYPE_ , EQUED , I , IA , IACOL , IAROW , ICOFF , ICTXT , IIA , IOFFA , IROFF , J , JA , JJA , LARGE , LDA , LLD_ , M , M_ , MB_ , MP , MYCOL , MYROW , N , N_ , NB_ , NPCOL , NPROW , NQ , NUMROC , ONE , PSLAMCH , R , ROWCND , RSRC_ , SMALL , THRESH |
|
Accessed arrays [ array name : associated index ] |
| | A | : IOFFA + I , IOFFA + I , IOFFA + I |
| | C | : J , J |
| | DESCA | : CTXT_ , LLD_ , MB_ , MB_ , NB_ , NB_ |
| | NUMROC | : M+IROFF, DESCA( MB_ ), MYROW, IAROW, NPROW , N+ICOFF, DESCA( NB_ ), MYCOL, IACOL, NPCOL |
| | PSLAMCH | : ICTXT, 'Precision' , ICTXT, 'Safe minimum' |
| | R | : I , I |
|
Conditional statements [ statement : associated predicate ] |
| | do | : ( 20 J = JJA , JJA + NQ - 1 ) , ( 10 I = IIA , IIA + MP - 1 ) , ( 40 J = JJA , JJA + NQ - 1 ) , ( 30 I = IIA , IIA + MP - 1 ) , ( 60 J = JJA , JJA + NQ - 1 ) , ( 50 I = IIA , IIA + MP - 1 ) |
| | if | : ( possible ) , ( M.LE.0 .OR. N.LE.0 ) , ( MYROW.EQ.IAROW ) , ( MYCOL.EQ.IACOL ) , ( ROWCND.GE.THRESH .AND. AMAX.GE.SMALL .AND. AMAX.LE.LARGE ) , ( COLCND.GE.THRESH ) , ( COLCND.GE.THRESH ) |
|
| List of variables | A AMAX BLOCK_CYCLIC_2D CJ COLCND CSRC_ CTXT_
| DLEN_ DTYPE_ EQUED I IA IACOL IAROW ICOFF
| ICTXT IIA IOFFA IROFF J JA JJA LARGE
| LDA LLD_ M M_ MB_ MP MYCOL MYROW
| N N_ NB_ NPCOL NPROW NQ NUMROC ONE
| PSLAMCH ROWCND RSRC_ SMALL THRESH | | close
| |
A
AMAX
BLOCK_CYCLIC_2D
CJ
COLCND
CSRC_
CTXT_
DLEN_
DTYPE_
EQUED
I
IA
IACOL
IAROW
ICOFF
ICTXT
IIA
IOFFA
IROFF
J
JA
JJA
LARGE
LDA
LLD_
M
M_
MB_
MP
MYCOL
MYROW
N
N_
NB_
NPCOL
NPROW
NQ
NUMROC
ONE
PSLAMCH
ROWCND
RSRC_
SMALL
THRESH
369
| |