|
|
| |
| # lines: |
231 | | # code: |
231 | | # comment: | 0 | |
# blank: | 0 |
| # Variables: | 32 |
| # Callers: | 4 |
| # Callings: | 1 |
| # Words: | 79 |
| # Keywords: | 51 |
|
|
|
|
|
..
.. Array Arguments ..
..
Purpose
=======
PCLACPY copies all or part of a distributed matrix A to another
distributed matrix B. No communication is performed, PCLACPY
performs a local copy sub( A ) := sub( B ), where sub( A ) denotes
A(IA:IA+M-1,JA:JA+N-1) and sub( B ) denotes B(IB:IB+M-1,JB:JB+N-1).
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
=========
UPLO (global input) CHARACTER
Specifies the part of the distributed matrix sub( A ) to be
copied:
= 'U': Upper triangular part is copied; the strictly
lower triangular part of sub( A ) is not referenced;
= 'L': Lower triangular part is copied; the strictly
upper triangular part of sub( A ) is not referenced;
Otherwise: All of the matrix sub( A ) is copied.
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) COMPLEX pointer into the local memory
to an array of dimension (LLD_A, LOCc(JA+N-1) ). This array
contains the local pieces of the distributed matrix sub( A )
to be copied from.
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.
B (local output) COMPLEX pointer into the local memory
to an array of dimension (LLD_B, LOCc(JB+N-1) ). This array
contains on exit the local pieces of the distributed matrix
sub( B ) set as follows:
if UPLO = 'U', B(IB+i-1,JB+j-1) = A(IA+i-1,JA+j-1),
1<=i<=j, 1<=j<=N;
if UPLO = 'L', B(IB+i-1,JB+j-1) = A(IA+i-1,JA+j-1),
j<=i<=M, 1<=j<=N;
otherwise, B(IB+i-1,JB+j-1) = A(IA+i-1,JA+j-1),
1<=i<=M, 1<=j<=N.
IB (global input) INTEGER
The row index in the global array B indicating the first
row of sub( B ).
JB (global input) INTEGER
The column index in the global array B indicating the
first column of sub( B ).
DESCB (global and local input) INTEGER array of dimension DLEN_.
The array descriptor for the distributed matrix B.
=====================================================================
.. Parameters ..
|
|
|
|
001 SUBROUTINE PCLACPY( UPLO , M , N , A , IA , JA , DESCA , B , IB , JB ,
002 $DESCB )
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 UPLO
011 INTEGER IA , IB , JA , JB , M , N
012 INTEGER BLOCK_CYCLIC_2D , CSRC_ , CTXT_ , DLEN_ , DTYPE_ ,
013 $LLD_ , MB_ , M_ , NB_ , N_ , RSRC_
014 PARAMETER( BLOCK_CYCLIC_2D = 1 , DLEN_ = 9 , DTYPE_ = 1 ,
015 $CTXT_ = 2 , M_ = 3 , N_ = 4 , MB_ = 5 , NB_ = 6 ,
016 $RSRC_ = 7 , CSRC_ = 8 , LLD_ = 9 )
017 * ..
018 * .. Local Scalars ..
019 INTEGER I , IAA , IBB , IBLK , IN , ITMP , J , JAA , JBB ,
020 $JBLK , JN , JTMP
021 * ..
022 * .. External Subroutines ..
023 EXTERNAL PCLACP2
024 * ..
025 * .. External Functions ..
026 LOGICAL LSAME
027 INTEGER ICEIL
028 EXTERNAL ICEIL , LSAME
029 * ..
030 * .. Intrinsic Functions ..
031 INTRINSIC MIN , MOD
032 * ..
033 * .. Executable Statements ..
034
035 IF( M.EQ.0 .OR. N.EQ.0 )
035
036 $ RETURN
037
038 IN = MIN( ICEIL( IA , DESCA( MB_ ) ) * DESCA( MB_ ) , IA + M - 1 )
039 JN = MIN( ICEIL( JA , DESCA( NB_ ) ) * DESCA( NB_ ) , JA + N - 1 )
040
041 IF( M.LE.( DESCA( MB_ ) - MOD( IA - 1 , DESCA( MB_ ) ) ) .OR.
042 $ N.LE.( DESCA( NB_ ) - MOD( JA - 1 , DESCA( NB_ ) ) ) ) THEN
043 CALL PCLACP2 ( UPLO , M , N , A , IA , JA , DESCA ,
044 $ B , IB , JB , DESCB )
045 ELSE
046
046
047 IF( LSAME( UPLO , 'U' ) ) THEN
047
048 CALL PCLACP2 ( UPLO , IN - IA + 1 , N , A , IA , JA , DESCA ,
049 $ B , IB , JB , DESCB )
050 DO 10 I = IN + 1 , IA + M - 1 , DESCA( MB_ )
050
051 ITMP = I - IA
052 IBLK = MIN( DESCA( MB_ ) , M - ITMP )
053 IBB = IB + ITMP
054 JBB = JB + ITMP
055 JAA = JA + ITMP
056 CALL PCLACP2 ( UPLO , IBLK , N - ITMP , A , I , JAA , DESCA ,
057 $ B , IBB , JBB , DESCB )
058 10 CONTINUE
058
059 ELSE IF( LSAME( UPLO , 'L' ) ) THEN
059
060 CALL PCLACP2 ( UPLO , M , JN - JA + 1 , A , IA , JA , DESCA ,
061 $ B , IB , JB , DESCB )
062 DO 20 J = JN + 1 , JA + N - 1 , DESCA( NB_ )
062
063 JTMP = J - JA
064 JBLK = MIN( DESCA( NB_ ) , N - JTMP )
065 IBB = IB + JTMP
066 JBB = JB + JTMP
067 IAA = IA + JTMP
068 CALL PCLACP2 ( UPLO , M - JTMP , JBLK , A , IAA , J , DESCA ,
069 $ B , IBB , JBB , DESCB )
070 20 CONTINUE
070
071 ELSE
071
072 IF( M.LE.N ) THEN
072
073 CALL PCLACP2 ( UPLO , IN - IA + 1 , N , A , IA , JA , DESCA ,
074 $ B , IB , JB , DESCB )
075 DO 30 I = IN + 1 , IA + M - 1 , DESCA( MB_ )
075
076 ITMP = I - IA
077 IBLK = MIN( DESCA( MB_ ) , M - ITMP )
078 IBB = IB + ITMP
079 CALL PCLACP2 ( UPLO , IBLK , N , A , I , JA , DESCA ,
080 $ B , IBB , JB , DESCB )
081 30 CONTINUE
081
082 ELSE
082
083 CALL PCLACP2 ( UPLO , M , JN - JA + 1 , A , IA , JA , DESCA ,
084 $ B , IB , JB , DESCB )
085 DO 40 J = JN + 1 , JA + N - 1 , DESCA( NB_ )
085
086 JTMP = J - JA
087 JBLK = MIN( DESCA( NB_ ) , N - JTMP )
088 JBB = JB + JTMP
089 CALL PCLACP2 ( UPLO , M , JBLK , A , IA , J , DESCA ,
090 $ B , IB , JBB , DESCB )
091 40 CONTINUE
091
092 END IF
093 END IF
094
095 END IF
096
097 RETURN
098
099 * End of PCLACPY
100
101 END10
15
|
|
Variables in Routine PCLACPY()
| Summary Report |
| Data Type | Quantity | Size(byte) |
| CHARACTER | 1 | 1 |
| INTEGER | 30 | 120 |
| LOGICAL | 1 | 1 |
| TOTAL | 32 | 122 |
List of Variables
CHARACTER
INTEGER
| BLOCK_CYCLIC_2D | CSRC_ | CTXT_ | DLEN_ | DTYPE_ |
| I | IA | IAA | IB | IBB |
| IBLK | ICEIL | IN | ITMP | J |
| JA | JAA | JB | JBB | JBLK |
| JN | JTMP | LLD_ | M | M_ |
| MB_ | N | N_ | NB_ | RSRC_ |
LOGICAL
Variables Dependence Graph Put the mouse over a right hand side variable to display the corresponding line of the dependence | | - | | - | - | | I | <--- | INDO 10 I = IN+1, IA+M-1, DESCA( MB_ ){2DO 30 I = IN+1, IA+M-1, DESCA( MB_ )}, MDO 10 I = IN+1, IA+M-1, DESCA( MB_ ){2DO 30 I = IN+1, IA+M-1, DESCA( MB_ )}, MB_DO 10 I = IN+1, IA+M-1, DESCA( MB_ ){2DO 30 I = IN+1, IA+M-1, DESCA( MB_ )}, IADO 10 I = IN+1, IA+M-1, DESCA( MB_ ){2DO 30 I = IN+1, IA+M-1, DESCA( MB_ )} |
| IAA | <--- | JTMPIAA = IA + JTMP, IAIAA = IA + JTMP |
| IBB | <--- | ITMPIBB = IB + ITMP{2IBB = IB+ITMP}, JTMPIBB = IB + JTMP, IBIBB = IB + ITMP{2IBB = IB + JTMP, 3IBB = IB+ITMP} |
| IBLK | <--- | ITMPIBLK = MIN( DESCA( MB_ ), M-ITMP ){2IBLK = MIN( DESCA( MB_ ), M-ITMP )}, MIBLK = MIN( DESCA( MB_ ), M-ITMP ){2IBLK = MIN( DESCA( MB_ ), M-ITMP )}, MB_IBLK = MIN( DESCA( MB_ ), M-ITMP ){2IBLK = MIN( DESCA( MB_ ), M-ITMP )} |
| 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 ) |
| ITMP | <--- | IITMP = I-IA{2ITMP = I-IA}, IAITMP = I-IA{2ITMP = I-IA} |
| J | <--- | JADO 20 J = JN+1, JA+N-1, DESCA( NB_ ){2DO 40 J = JN+1, JA+N-1, DESCA( NB_ )}, JNDO 20 J = JN+1, JA+N-1, DESCA( NB_ ){2DO 40 J = JN+1, JA+N-1, DESCA( NB_ )}, NDO 20 J = JN+1, JA+N-1, DESCA( NB_ ){2DO 40 J = JN+1, JA+N-1, DESCA( NB_ )}, NB_DO 20 J = JN+1, JA+N-1, DESCA( NB_ ){2DO 40 J = JN+1, JA+N-1, DESCA( NB_ )} |
| JAA | <--- | ITMPJAA = JA + ITMP, JAJAA = JA + ITMP |
| JBB | <--- | ITMPJBB = JB + ITMP, JBJBB = JB + ITMP{2JBB = JB + JTMP, 3JBB = JB+JTMP}, JTMPJBB = JB + JTMP{2JBB = JB+JTMP} |
| JBLK | <--- | JTMPJBLK = MIN( DESCA( NB_ ), N-JTMP ){2JBLK = MIN( DESCA( NB_ ), N-JTMP )}, NJBLK = MIN( DESCA( NB_ ), N-JTMP ){2JBLK = MIN( DESCA( NB_ ), N-JTMP )}, NB_JBLK = MIN( DESCA( NB_ ), N-JTMP ){2JBLK = MIN( DESCA( NB_ ), N-JTMP )} |
| JN | <--- | ICEILJN = MIN( ICEIL( JA, DESCA( NB_ ) ) * DESCA( NB_ ), JA+N-1 ), JAJN = MIN( ICEIL( JA, DESCA( NB_ ) ) * DESCA( NB_ ), JA+N-1 ), NJN = MIN( ICEIL( JA, DESCA( NB_ ) ) * DESCA( NB_ ), JA+N-1 ), NB_JN = MIN( ICEIL( JA, DESCA( NB_ ) ) * DESCA( NB_ ), JA+N-1 ) |
| JTMP | <--- | JJTMP = J-JA{2JTMP = J-JA}, JAJTMP = J-JA{2JTMP = J-JA} |
|
|
Analysis elements of the routine PCLACPY() Put the mouse over each element to display detailed matching information
Assigned variables |
| | | BLOCK_CYCLIC_2D , CSRC_ , CTXT_ , DLEN_ , DTYPE_ , I , IAA , IBB , IBLK , IN , ITMP , J , JAA , JBB , JBLK , JN , JTMP , LLD_ , M_ , MB_ , N_ , NB_ , RSRC_ |
|
Active variables |
| | | A , B , BLOCK_CYCLIC_2D , CSRC_ , CTXT_ , DESCA , DESCB , DLEN_ , DTYPE_ , I , IA , IAA , IB , IBB , IBLK , ICEIL , IN , ITMP , J , JA , JAA , JB , JBB , JBLK , JN , JTMP , LLD_ , LSAME , M , M_ , MB_ , N , N_ , NB_ , RSRC_ , UPLO |
|
Accessed arrays [ array name : associated index ] |
| | DESCA | : MB_ , MB_ , MB_ , MB_ , MB_ , MB_ , NB_ , NB_ , NB_ , NB_ , NB_ , NB_ |
| | ICEIL | : IA, DESCA( MB_ ) , JA, DESCA( NB_ ) |
| | LSAME | : UPLO, 'L' , UPLO, 'U' |
|
Conditional statements [ statement : associated predicate ] |
| | do | : ( 10 I = IN + 1 , IA + M - 1 , DESCA( MB_ ) ) , ( 20 J = JN + 1 , JA + N - 1 , DESCA( NB_ ) ) , ( 30 I = IN + 1 , IA + M - 1 , DESCA( MB_ ) ) , ( 40 J = JN + 1 , JA + N - 1 , DESCA( NB_ ) ) |
| | if | : ( M.EQ.0 .OR. N.EQ.0 ) , ( (M.LE.( DESCA( MB_ ) - MOD( IA - 1 , DESCA( MB_ ) ) ) .OR. ) , ( (LSAME( UPLO , 'U' ) ) ) , ( (LSAME( UPLO , 'L' ) ) ) , ( M.LE.N ) |
|
| List of variables | BLOCK_CYCLIC_2D CSRC_ CTXT_ DLEN_ DTYPE_ I IA
| IAA IB IBB IBLK ICEIL IN ITMP J
| JA JAA JB JBB JBLK JN JTMP LLD_
| LSAME M M_ MB_ N N_ NB_ RSRC_
| UPLO | | close
| |
BLOCK_CYCLIC_2D
CSRC_
CTXT_
DLEN_
DTYPE_
I
IA
IAA
IB
IBB
IBLK
ICEIL
IN
ITMP
J
JA
JAA
JB
JBB
JBLK
JN
JTMP
LLD_
LSAME
M
M_
MB_
N
N_
NB_
RSRC_
UPLO
78
| |