PDLARED2D(l)

πŸ“¦ version 1.5, in ubuntu jammy

πŸŽ€ 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 in DESCA( DTYPE_ ) β€” the descriptor type. In this case, DTYPE_A = 1.
  • CTXT_A (global) β€” stored in DESCA( 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 in DESCA( M_ ) β€” the number of rows in the global array A.
  • N_A (global) β€” stored in DESCA( N_ ) β€” the number of columns in the global array A.
  • MB_A (global) β€” stored in DESCA( MB_ ) β€” the blocking factor used to distribute the rows of the array.
  • NB_A (global) β€” stored in DESCA( NB_ ) β€” the blocking factor used to distribute the columns of the array.
  • RSRC_A (global) β€” stored in DESCA( RSRC_ ) β€” the process row over which the first row of the array A is distributed.
  • CSRC_A (global) β€” stored in DESCA( CSRC_ ) β€” the process column over which the first column of the array A is distributed.
  • LLD_A (local) β€” stored in 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. 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 β€” IA must be equal to 1.
  • JA (global input) INTEGER β€” JA must be equal to 1.
  • DESC (global/local input) INTEGER Array of dimension DLEN_ β€” a 2D array descriptor, which describes BYROW.
  • BYROW (local input) distributed block cyclic DOUBLE PRECISION array β€” global dimension (N), local dimension NP. BYCOL is 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). BYALL is exactly duplicated on all processes. It contains the same values as BYCOL, 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 of WORK array. LWORK >= and, like, for real:
LWORK >= NUMROC(N, DESC( NB_ ), 0, 0, NPCOL)

heads up bestie: IA and JA must be equal to 1. 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