PDLARED2D(l)
π PDLARED2D π
okay bestie, welcome to PDLARED2D, straight out of the LAPACK routine catalog, version 1.5, chilling in manual section l. it's giving distributed arrays, it's giving parallel vibes, and honestly? we're gonna understand it together. hydrate first. π«Ά
β¨ NAME β¨
PDLARED2D β redistribute a 1D array. it assumes that the input array, BYROW, is distributed across columns and that all process rows contain the same copy of BYROW. periodt. π
β¨ SYNOPSIS β¨
SUBROUTINE PDLARED2D( N, IA, JA, DESC, BYROW, BYALL, WORK, LWORK )
INTEGER IA, JA, LWORK, N
INTEGER DESC( * )
DOUBLE PRECISION BYALL( * ), BYROW( * ), WORK( LWORK )
β¨ PURPOSE β¨
PDLARED2D redistributes a 1D array and will contain the entire array. the whole thing. all of it. no crumbs left behind. β¨
Notes
okay so this is the part where we learn that every 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. it's like a little ID card for your array, iykyk. πͺͺ
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".
here's the whole vibe check of what lives where β the notation table, but make it cute:
DTYPE_A(global) β stored inDESCA( DTYPE_ )β the descriptor type. In this case,DTYPE_A = 1.CTXT_A(global) β stored inDESCA( CTXT_ )β the BLACS context handle, indicating the BLACS process grid A is distributed over. The context itself is global, but the handle (the integer value) may vary.M_A(global) β stored inDESCA( M_ )β the number of rows in the global array A.N_A(global) β stored inDESCA( N_ )β the number of columns in the global array A.MB_A(global) β stored inDESCA( MB_ )β the blocking factor used to distribute the rows of the array.NB_A(global) β stored inDESCA( NB_ )β the blocking factor used to distribute the columns of the array.RSRC_A(global) β stored inDESCA( RSRC_ )β the process row over which the first row of the array A is distributed.CSRC_A(global) β stored inDESCA( CSRC_ )β the process column over which the first column of the array A is distributed.LLD_A(local) β stored inDESCA( 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. basically: how much of K lands on you.
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 β¨
quick little note before we dive in: NP = Number of local rows in BYROW(). yes that's just floating there in the original too, no cap. π
N(global input)INTEGERβ the number of elements to be redistributed.N >= 0. no negatives, bestie, we do not do that here.IA(global input)INTEGERβIAmust be equal to 1.JA(global input)INTEGERβJAmust be equal to 1.DESC(global/local input)INTEGER Array of dimension DLEN_β a 2D array descriptor, which describesBYROW.BYROW(local input) distributed block cyclicDOUBLE PRECISION arrayβ global dimension (N), local dimensionNP.BYCOLis distributed across the process columns. All process rows are assumed to contain the same value.BYALL(global output)DOUBLE PRECISIONβ global dimension(N), local dimension (N).BYALLis exactly duplicated on all processes. It contains the same values asBYCOL, but it is replicated across all processes rather than being distributed. everyone gets the whole thing, it's iconic β¨
and the exact deets:
BYALL(i) = BYCOL( NUMROC(i,NB,MYROW,0,NPROW ) on the procs whose MYROW == mod((i-1)/NB,NPROW)
WORK(local workspace)DOUBLE PRECISION dimension (LWORK)β used to hold the buffers sent from one process to another. the little messenger bags of the parallel world πLWORK(local input)INTEGERβ size ofWORKarray.LWORK >=and, like, for real:
LWORK >= NUMROC(N, DESC( NB_ ), 0, 0, NPCOL)
heads up bestie:IAandJAmust be equal to1. not 0, not 2, not "close enough". the routine said what it said. π
and that's the whole page!! you did it, you read the entire thing, main character energy fr fr π
this was LAPACK version 1.5, dated 12 May 1997. yeah. 1997. vintage. archival. still slaying. π β¨ π¦
π¦ where this page comes from
- ubuntu jammy: scalapack-doc 1.5-11
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms