HPL_pdrpancrN(3)

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

πŸ’– HPL_pdrpancrN πŸ’–

okay bestie, welcome to the HPL_pdrpancrN(3) page β€” it's an HPL Library function and it's literally the Crout recursive panel factorization. yes the name is a keyboard smash, no we are not changing it, it's iconic πŸ’…


✨ NAME ✨

HPL_pdrpancrN β€” Crout recursive panel factorization. that's it, that's the whole name section, short and slay πŸŽ€


✨ SYNOPSIS ✨

#include "hpl.h"

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

✨ DESCRIPTION ✨

so HPL_pdrpancrN recursively factorizes a panel of columns using the recursive Crout variant of the usual one-dimensional algorithm. the lower triangular N0-by-N0 upper block of the panel is stored in no-transpose form, meaning just like the input matrix itself. no cap, it's just vibing as-is πŸ¦‹

Bi-directional exchange is used to perform the swap::broadcast operations at once for one column in the panel. the way this works out, you get a lower number of slightly larger messages than usual. lowkey a glow-up for your message count ✨

On P processes and assuming bi-directional links, the running time of this function can be approximated by (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. πŸ’€ yes there's math, but here's the tea:

the recursive algorithm allows indeed to almost achieve Level 3 BLAS performance in the panel factorization. that's the main character energy we're going for πŸ‘‘

on a large number of modern machines though, this operation is however latency bound, meaning its cost can be estimated by only the latency portion N0 * log_2(P) * lat. Mono-directional links will double this communication cost. so if your links are mono-directional, bestie, your runtime is getting doubled, no thoughts head empty 🫠


✨ ARGUMENTS ✨

  • PANEL (local input/output) HPL_T_panel * β€” On entry, PANEL points to the data structure containing the panel information. it's giving "everything you need to know about this panel" πŸ’–
  • 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. it's the lil location tag of your submatrix πŸ“
  • WORK (local workspace) double * β€” On entry, WORK is a workarray of size at least 2*(4+2*N0). do NOT skimp on this, it needs the space, it's high maintenance and we respect it πŸ’…

✨ SEE ALSO ✨

the whole friend group, fr fr 🫢

  • HPL_dlocmax (3)
  • HPL_dlocswpN (3)
  • HPL_dlocswpT (3)
  • HPL_pdmxswp (3)
  • HPL_pdpancrN (3)
  • HPL_pdpancrT (3)
  • HPL_pdpanllN (3)
  • HPL_pdpanllT (3)
  • HPL_pdpanrlN (3)
  • HPL_pdpanrlT (3)
  • HPL_pdrpancrT (3)
  • HPL_pdrpanllN (3)
  • HPL_pdrpanllT (3)
  • HPL_pdrpanrlN (3)
  • HPL_pdrpanrlT (3)
  • HPL_pdfact (3)

that's the whole page bestie, you ate it, you understood it, periodt πŸŒˆπŸ’œ

signing off from HPL 2.2, dated February 24, 2016 β€” yeah it's an elder but it's still serving, and this page is officially closed, mwah πŸ’‹πŸŽ€

πŸ“¦ where this page comes from