HPL_pdpanllT(3)

πŸ“¦ version 2.2, in fedora 43, fedora 44

πŸ’– HPL_pdpanllT β€” bestie edition πŸ’–

okay so this is a page from the HPL library functions manual (that's the High-Performance Linpack vibe, iykyk), and today's main character is HPL_pdpanllT. she does a left-looking panel factorization, and honestly? she ate. let's get into it 🫢


✨ NAME ✨

HPL_pdpanllT β€” Left-looking panel factorization.


🌸 SYNOPSIS 🌸

#include "hpl.h"

void HPL_pdpanllT( HPL_T_panel * PANEL, const int M, const int N, const
int ICOFF, double * WORK );

πŸ¦‹ DESCRIPTION πŸ¦‹

So HPL_pdpanllT factorizes a panel of columns that is a sub-array of a larger one-dimensional panel A, using the Left-looking variant of the usual one-dimensional algorithm. The lower triangular N0-by-N0 upper block of the panel is stored in transpose form. noted. slay. πŸ’…

Bi-directional exchange is used to perform the swap::broadcast operations at once for one column in the panel. The way this results in a lower number of slightly larger messages than usual? iconic behavior, honestly. On P processes, and assuming bi-directional links, the running time of this function can be approximated by this (when N is equal to N0):

N0 * log_2( P ) * ( lat + ( 2*N0 + 4 ) / bdwth ) +
N0^2 * ( M - N0/3 ) * gam2-3

where M is the local number of rows of the panel, lat and bdwth are the latency and bandwidth of the network for double precision real words, and gam2-3 is an estimate of the Level 2 and Level 3 BLAS rate of execution. The recursive algorithm allows indeed to almost achieve Level 3 BLAS performance in the panel factorization. πŸš€

On a large number of modern machines, this operation is however latency bound, meaning that its cost can be estimated by only the latency portion N0 * log_2(P) * lat. Mono-directional links will double this communication cost. (not the glow-up we wanted but okay 😭)

ngl there's a lil detail worth knowing: one iteration of the main loop is unrolled. The local computation of the absolute value max of the next column is performed just after its update by the current column. This allows bringing the current column only once through cache at each step. ✨

The current implementation does not perform any blocking for this sequence of BLAS operations, however the design allows for plugging in an optimal (machine-specific) specialized BLAS-like kernel. This idea has been suggested to us by Fred Gustavson, IBM T.J. Watson Research Center. (credit where credit is due, periodt πŸ‘‘)


πŸŽ€ ARGUMENTS πŸŽ€

  • PANEL β€” (local input/output) HPL_T_panel * On entry, PANEL points to the data structure containing the panel information. she's holding all the lore πŸ’–
  • M β€” (local input) const int On entry, M specifies the local number of rows of sub(A).
  • N β€” (local input) const int On entry, N specifies the local number of columns of sub(A).
  • ICOFF β€” (global input) const int On entry, ICOFF specifies the row and column offset of sub(A) in A.
  • WORK β€” (local workspace) double * On entry, WORK is a workarray of size at least 2*(4+2*N0).

🌈 SEE ALSO 🌈

HPL_dlocmax (3), HPL_dlocswpN (3), HPL_dlocswpT (3), HPL_pdmxswp (3), HPL_pdpancrN (3), HPL_pdpancrT (3), HPL_pdpanllN (3), HPL_pdpanrlN (3), HPL_pdpanrlT (3).

like a whole friend group fr fr, go read their pages too 🧚


and that's the whole page bestie, no cap, every flag and formula accounted for πŸ’œ

this lil manual page is from HPL 2.2, dated February 24, 2016 β€” yes she's an older queen but she still serves πŸŒΈπŸ‘‘ go forth and factorize some panels, you got this 🫢✨

πŸ“¦ where this page comes from