CBLAS/include/cblas.h(3)

๐Ÿ“ฆ version 3.12.1, in arch rolling

๐Ÿ’– CBLAS/include/cblas.h โ€” Library Functions Manual ๐Ÿ’–

okay so bestie, buckle up, because this is the header that runs the whole CBLAS show โœจ It lives in the Library Functions Manual, and it's basically the blueprint where every type, macro and enum gets defined before the actual BLAS functions get to do their thing. No cap.


๐ŸŒธ NAME ๐ŸŒธ

CBLAS/include/cblas.h โ€” the one, the only, the header file herself ๐Ÿ‘‘


๐ŸŽ€ SYNOPSIS ๐ŸŽ€

So when you wanna pull this whole vibe into your code, you do:

#include <stddef.h>
#include <stdint.h>
#include <inttypes.h>
#include 'cblas_mangling.h'

(the last one is literally in single quotes in the original, yes, and we're keeping it exactly like that โ€” character for character, periodt ๐Ÿซถ)


โœจ Macros โœจ

These are the little shortcuts that make everything else work. Obsessed with them honestly:

  • #define CBLAS_INDEX size_t /* this may vary between platforms */ โ€” this is the index type, and heads up, it's size_t but it may vary between platforms, so don't go assuming it's always the same everywhere ๐Ÿ”ฅ
  • #define CBLAS_INT int32_t โ€” the integer type CBLAS rolls with. It's int32_t, no debate.
  • #define CBLAS_IFMT PRId32 โ€” the matching format specifier for CBLAS_INT, so your printf calls don't get weird on you ๐Ÿ’…
  • #define CBLAS_ORDER CBLAS_LAYOUT โ€” and the comment on this one literally says it's "this for backward compatibility with CBLAS_ORDER" โ€” so it's the old name hanging around like that one friend who never left the group chat. Keep it for compat, bestie ๐Ÿซถ
  • #define API_SUFFIX(a) โ€” an empty macro, just sitting there doing its thing. It takes a and expands to... nothing. Iconic minimalism honestly.

๐Ÿฆ‹ Typedefs ๐Ÿฆ‹

The typedefs are basically just the enums wearing a nicer outfit โ€” they let you write the type name without the enum keyword. Very main character energy:

  • typedef enum CBLAS_LAYOUT CBLAS_LAYOUT
  • typedef enum CBLAS_TRANSPOSE CBLAS_TRANSPOSE
  • typedef enum CBLAS_UPLO CBLAS_UPLO
  • typedef enum CBLAS_DIAG CBLAS_DIAG
  • typedef enum CBLAS_SIDE CBLAS_SIDE

Same name on both sides, yes, that's intentional, don't @ me ๐Ÿ˜ญ


๐ŸŒˆ Enumerations ๐ŸŒˆ

now THIS is where the actual values live. Every single one, with its exact number, because numbers are sacred here โญ

๐Ÿ’œ enum CBLAS_LAYOUT

Tells CBLAS how your matrix is laid out in memory. Two options, and they're lowkey the whole personality of your data:

  • CblasRowMajor = 101 โ€” rows first, one after another ๐Ÿ“
  • CblasColMajor = 102 โ€” columns first, slay ๐Ÿ’…
enum CBLAS_LAYOUT { CblasRowMajor =101, CblasColMajor =102 }

๐ŸŒธ enum CBLAS_TRANSPOSE

Do you want your matrix as-is, transposed, or transposed and conjugated? Yes, all three are real:

  • CblasNoTrans = 111 โ€” leave it alone, don't touch it ๐Ÿ™ˆ
  • CblasTrans = 112 โ€” flip it ๐Ÿ”„
  • CblasConjTrans = 113 โ€” flip it and conjugate it, fancy โœจ
enum CBLAS_TRANSPOSE { CblasNoTrans =111, CblasTrans =112, CblasConjTrans =113 }

๐Ÿงš enum CBLAS_UPLO

Which triangle of the matrix are we even talking about? Because bestie, sometimes it's only half:

  • CblasUpper = 121 โ€” the upper triangle ๐Ÿ‘‘
  • CblasLower = 122 โ€” the lower triangle ๐Ÿซถ
enum CBLAS_UPLO { CblasUpper =121, CblasLower =122 }

๐ŸŽ€ enum CBLAS_DIAG

Is the diagonal all ones, or is it whatever you actually put there? Big question:

  • CblasNonUnit = 131 โ€” the diagonal is not all ones, it's real values ๐Ÿ’€
  • CblasUnit = 132 โ€” the diagonal is assumed to be all ones, so don't bother storing it โœจ
enum CBLAS_DIAG { CblasNonUnit =131, CblasUnit =132 }

๐Ÿ”ฅ enum CBLAS_SIDE

For the operations that take a matrix from the left or the right โ€” which side are we multiplying on?

  • CblasLeft = 141 โ€” left side ๐Ÿ’œ
  • CblasRight = 142 โ€” right side ๐ŸŒˆ
enum CBLAS_SIDE { CblasLeft =141, CblasRight =142 }

and that's part one bestie โ€” the types are all set up, the values are all locked in, and the vibe check passed with flying colors ๐Ÿ’– more coming, don't go anywhere ๐Ÿฆ‹

๐Ÿ’… the tiny magnitude helpers

double cblas_dcabs1 (const void *z)
float cblas_scabs1 (const void *c)

okay so these two are the littest helpers on the whole page fr fr. Both take a const void * โ€” one's named z, one's named c โ€” and hand you back a real number: a double for cblas_dcabs1, a float for cblas_scabs1. That's the whole personality. Iconic, minimal, no notes. ๐ŸŽ€


โœจ dot dot dot (the products)

float cblas_sdsdot (const CBLAS_INT N, const float alpha, const float *X, const CBLAS_INT incX, const float *Y, const CBLAS_INT incY)
double cblas_dsdot (const CBLAS_INT N, const float *X, const CBLAS_INT incX, const float *Y, const CBLAS_INT incY)
float cblas_sdot (const CBLAS_INT N, const float *X, const CBLAS_INT incX, const float *Y, const CBLAS_INT incY)
double cblas_ddot (const CBLAS_INT N, const double *X, const CBLAS_INT incX, const double *Y, const CBLAS_INT incY)
void cblas_cdotu_sub (const CBLAS_INT N, const void *X, const CBLAS_INT incX, const void *Y, const CBLAS_INT incY, void *dotu)
void cblas_cdotc_sub (const CBLAS_INT N, const void *X, const CBLAS_INT incX, const void *Y, const CBLAS_INT incY, void *dotc)
void cblas_zdotu_sub (const CBLAS_INT N, const void *X, const CBLAS_INT incX, const void *Y, const CBLAS_INT incY, void *dotu)
void cblas_zdotc_sub (const CBLAS_INT N, const void *X, const CBLAS_INT incX, const void *Y, const CBLAS_INT incY, void *dotc)

the way there are like eight of these ๐Ÿ˜ญ bestie, the family tree is thriving. Notice how the first four literally just return your answer (a float or a double) โ€” so casual of them โ€” while the four _sub ones make you pass in dotu / dotc and write the result out through the pointer. different vibe, same job.

oh and cblas_sdsdot is the extra one: it's got that bonus alpha (a float) sitting there in position two, plus X and Y are both const float * even though it hands back a double. cblas_dsdot has the same float inputs and double output but no alpha. not me noticing that detail immediately ๐Ÿ‘€


๐Ÿฆ‹ norms and absolute-value sums

float cblas_snrm2 (const CBLAS_INT N, const float *X, const CBLAS_INT incX)
float cblas_sasum (const CBLAS_INT N, const float *X, const CBLAS_INT incX)
double cblas_dnrm2 (const CBLAS_INT N, const double *X, const CBLAS_INT incX)
double cblas_dasum (const CBLAS_INT N, const double *X, const CBLAS_INT incX)
float cblas_scnrm2 (const CBLAS_INT N, const void *X, const CBLAS_INT incX)
float cblas_scasum (const CBLAS_INT N, const void *X, const CBLAS_INT incX)
double cblas_dznrm2 (const CBLAS_INT N, const void *X, const CBLAS_INT incX)
double cblas_dzasum (const CBLAS_INT N, const void *X, const CBLAS_INT incX)

eight of them, all matching the same shape: N, then your vector, then incX. the nrm2 girlies and the asum girlies. real versions (s, d) take typed pointers, complex versions (sc, dz) take const void * because they're mysterious and too good for a normal type ๐Ÿ’…


๐Ÿ”ฅ index of the biggest one

CBLAS_INDEX cblas_isamax (const CBLAS_INT N, const float *X, const CBLAS_INT incX)
CBLAS_INDEX cblas_idamax (const CBLAS_INT N, const double *X, const CBLAS_INT incX)
CBLAS_INDEX cblas_icamax (const CBLAS_INT N, const void *X, const CBLAS_INT incX)
CBLAS_INDEX cblas_izamax (const CBLAS_INT N, const void *X, const CBLAS_INT incX)

these four hand you back a CBLAS_INDEX instead of a float, which is so them. same three args every time: N, X, incX. slay. ๐Ÿซถ


๐ŸŽ€ swap, copy, axpy (a.k.a. the level-1 workhorses)

void cblas_sswap (const CBLAS_INT N, float *X, const CBLAS_INT incX, float *Y, const CBLAS_INT incY)
void cblas_scopy (const CBLAS_INT N, const float *X, const CBLAS_INT incX, float *Y, const CBLAS_INT incY)
void cblas_saxpy (const CBLAS_INT N, const float alpha, const float *X, const CBLAS_INT incX, float *Y, const CBLAS_INT incY)
void cblas_dswap (const CBLAS_INT N, double *X, const CBLAS_INT incX, double *Y, const CBLAS_INT incY)
void cblas_dcopy (const CBLAS_INT N, const double *X, const CBLAS_INT incX, double *Y, const CBLAS_INT incY)
void cblas_daxpy (const CBLAS_INT N, const double alpha, const double *X, const CBLAS_INT incX, double *Y, const CBLAS_INT incY)
void cblas_cswap (const CBLAS_INT N, void *X, const CBLAS_INT incX, void *Y, const CBLAS_INT incY)
void cblas_ccopy (const CBLAS_INT N, const void *X, const CBLAS_INT incX, void *Y, const CBLAS_INT incY)
void cblas_caxpy (const CBLAS_INT N, const void *alpha, const void *X, const CBLAS_INT incX, void *Y, const CBLAS_INT incY)
void cblas_zswap (const CBLAS_INT N, void *X, const CBLAS_INT incX, void *Y, const CBLAS_INT incY)
void cblas_zcopy (const CBLAS_INT N, const void *X, const CBLAS_INT incX, void *Y, const CBLAS_INT incY)
void cblas_zaxpy (const CBLAS_INT N, const void *alpha, const void *X, const CBLAS_INT incX, void *Y, const CBLAS_INT incY)

look at the consts bestie. in the copy and axpy rows, X is const and Y is not โ€” that's the code literally telling you which one is the input and which one gets written to ๐Ÿ˜Œ meanwhile in swap neither is const, because both get rewritten. the audacity. also notice the complex ones (c, z) use void * for everything and alpha is a void * too, while the real ones use plain float / double alphas. consistent queen behaviour ๐Ÿ‘‘


๐ŸŒธ modified rotations

void cblas_srotmg (float *d1, float *d2, float *b1, const float b2, float *P)
void cblas_srotm (const CBLAS_INT N, float *X, const CBLAS_INT incX, float *Y, const CBLAS_INT incY, const float *P)
void cblas_drotmg (double *d1, double *d2, double *b1, const double b2, double *P)
void cblas_drotm (const CBLAS_INT N, double *X, const CBLAS_INT incX, double *Y, const CBLAS_INT incY, const double *P)

the *mg ones are the setup girls โ€” three pointers, one lone const scalar (b2), and P at the end. the *m ones are the apply girls โ€” N, X, incX, Y, incY, and P again but const this time. see how they pair up? so cute. ๐Ÿงš


โญ scaling

void cblas_sscal (const CBLAS_INT N, const float alpha, float *X, const CBLAS_INT incX)
void cblas_dscal (const CBLAS_INT N, const double alpha, double *X, const CBLAS_INT incX)
void cblas_cscal (const CBLAS_INT N, const void *alpha, void *X, const CBLAS_INT incX)
void cblas_zscal (const CBLAS_INT N, const void *alpha, void *X, const CBLAS_INT incX)
void cblas_csscal (const CBLAS_INT N, const float alpha, void *X, const CBLAS_INT incX)
void cblas_zdscal (const CBLAS_INT N, const double alpha, void *X, const CBLAS_INT incX)

the regular cscal / zscal take a const void *alpha, but the double-letter ones (csscal, zdscal) switch alpha to a real type โ€” float and double respectively โ€” while X stays void *. tiny detail, huge difference, iykyk ๐Ÿ’–


๐ŸŒˆ givens rotations (the setup)

void cblas_srotg (float *a, float *b, float *c, float *s)
void cblas_drotg (double *a, double *b, double *c, double *s)
void cblas_crotg (void *a, void *b, float *c, void *s)
void cblas_zrotg (void *a, void *b, double *c, void *s)

four pointers, no return value, vibes immaculate. and look โ€” in the complex ones (crotg, zrotg), c is a real pointer (float * / double *) while everything else is void *. that's not a typo, that's just how she is ๐Ÿ™ˆ


๐Ÿ’œ givens rotations (the apply)

void cblas_srot (const CBLAS_INT N, float *X, const CBLAS_INT incX, float *Y, const CBLAS_INT incY, const float c, const float s)
void cblas_drot (const CBLAS_INT N, double *X, const CBLAS_INT incX, double *Y, const CBLAS_INT incY, const double c, const double s)
void cblas_csrot (const CBLAS_INT N, void *X, const CBLAS_INT incX, void *Y, const CBLAS_INT incY, const float c, const float s)
void cblas_zdrot (const CBLAS_INT N, void *X, const CBLAS_INT incX, void *Y, const CBLAS_INT incY, const double c, const double s)

N, X, incX, Y, incY, then c and s as plain const scalars. note csrot and zdrot are the mixed-precision cuties โ€” void * vectors but real float / double rotation scalars. periodt. ๐Ÿ”ฅ


๐Ÿ‘‘ level-2 BLAS, single precision

void cblas_sgemv (const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, const CBLAS_INT M, const CBLAS_INT N, const float alpha, const float *A, const CBLAS_INT lda, const float *X, const CBLAS_INT incX, const float beta, float *Y, const CBLAS_INT incY)
void cblas_sgbmv (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const CBLAS_INT M, const CBLAS_INT N, const CBLAS_INT KL, const CBLAS_INT KU, const float alpha, const float *A, const CBLAS_INT lda, const float *X, const CBLAS_INT incX, const float beta, float *Y, const CBLAS_INT incY)
void cblas_strmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const float *A, const CBLAS_INT lda, float *X, const CBLAS_INT incX)
void cblas_stbmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const float *A, const CBLAS_INT lda, float *X, const CBLAS_INT incX)
void cblas_stpmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const float *Ap, float *X, const CBLAS_INT incX)
void cblas_strsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const float *A, const CBLAS_INT lda, float *X, const CBLAS_INT incX)
void cblas_stbsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const float *A, const CBLAS_INT lda, float *X, const CBLAS_INT incX)
void cblas_stpsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const float *Ap, float *X, const CBLAS_INT incX)

okay inhale โ€” this is the level-2 friend group and they're all serving structured-argument realness. ๐Ÿซถ

the gemv / gbmv branch keeps the same skeleton: layout, TransA, M, N, then alpha, const float *A, lda, const float *X, incX, beta, float *Y, incY. gbmv slid in extra KL and KU right after N because she's got bandwidth needs, and her layout / TransA params lost their const compared to sgemv. not me spotting that ๐Ÿ˜ญ

the trmv / trsv / tbmv / tbsv / tpmv / tpsv branch swaps in Uplo and Diag alongside TransA, drops alpha and beta entirely, and passes A as const float * with float *X as the thing being poked. the tb* ones take that extra K; the tp* ones use const float *Ap and no lda at all. see the pattern? she's consistent. ๐Ÿ’…


โญ level-2 BLAS, double precision

void cblas_dgemv (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const CBLAS_INT M, const CBLAS_INT N, const double alpha, const double *A, const CBLAS_INT lda, const double *X, const CBLAS_INT incX, const double beta, double *Y, const CBLAS_INT incY)
void cblas_dgbmv (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const CBLAS_INT M, const CBLAS_INT N, const CBLAS_INT KL, const CBLAS_INT KU, const double alpha, const double *A, const CBLAS_INT lda, const double *X, const CBLAS_INT incX, const double beta, double *Y, const CBLAS_INT incY)
void cblas_dtrmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const double *A, const CBLAS_INT lda, double *X, const CBLAS_INT incX)
void cblas_dtbmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const double *A, const CBLAS_INT lda, double *X, const CBLAS_INT incX)
void cblas_dtpmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const double *Ap, double *X, const CBLAS_INT incX)
void cblas_dtrsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const double *A, const CBLAS_INT lda, double *X, const CBLAS_INT incX)
void cblas_dtbsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const double *A, const CBLAS_INT lda, double *X, const CBLAS_INT incX)
void cblas_dtpsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const double *Ap, double *X, const CBLAS_INT incX)

literally the exact same eight, but every float got upgraded to double and every s became a d. no cap, that's the whole diff. she ate and left zero crumbs. ๐Ÿ“


๐Ÿงš level-2 BLAS, complex (the c girlies)

void cblas_cgemv (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const CBLAS_INT M, const CBLAS_INT N, const void *alpha, const void *A, const CBLAS_INT lda, const void *X, const CBLAS_INT incX, const void *beta, void *Y, const CBLAS_INT incY)
void cblas_cgbmv (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const CBLAS_INT M, const CBLAS_INT N, const CBLAS_INT KL, const CBLAS_INT KU, const void *alpha, const void *A, const CBLAS_INT lda, const void *X, const CBLAS_INT incX, const void *beta, void *Y, const CBLAS_INT incY)
void cblas_ctrmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const void *A, const CBLAS_INT lda, void *X, const CBLAS_INT incX)
void cblas_ctbmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const void *A, const CBLAS_INT lda, void *X, const CBLAS_INT incX)
void cblas_ctpmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const void *Ap, void *X, const CBLAS_INT incX)
void cblas_ctrsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const void *A, const CBLAS_INT lda, void *X, const CBLAS_INT incX)
void cblas_ctbsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const void *A, const CBLAS_INT lda, void *X, const CBLAS_INT incX)
void cblas_ctpsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const void *Ap, void *X, const CBLAS_INT incX)

same lineup, but now alpha, A, X, beta, Y, Ap are all void * โ€” with A, X, Ap, alpha, beta holding onto their const where they had it and Y / X staying mutable where they're outputs. the ints (layout, TransA, Uplo, Diag, M, N, K, KL, KU, lda, incX, incY) are untouched by all this void-pointer drama, bless them. ๐Ÿ’€


๐Ÿ’œ level-2 BLAS, double-complex (the z girlies)

void cblas_zgemv (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const CBLAS_INT M, const CBLAS_INT N, const void *alpha, const void *A, const CBLAS_INT lda, const void *X, const CBLAS_INT incX, const void *beta, void *Y, const CBLAS_INT incY)
void cblas_zgbmv (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const

and that's where this part runs out of page ๐Ÿ˜ญ the zgbmv prototype literally gets cut off mid-sentence โ€” she's mid-slay and we gotta wait for the next chunk. the z versions are gonna mirror the c ones exactly, but bestie, do not go assuming the rest of that signature into your code, okay? wait for the actual page. ๐ŸŽ€


heads up: every prototype above is quoted exactly as it appears in the header, so you can copy-paste straight into your #include <cblas.h> life without me messing with a single character. the vibes are mine, the signatures are hers. ๐Ÿซถ

okay bestie we are still in the synopsis and it is a long one ๐Ÿ˜ญ this stretch is all about the triangular girlies, the symmetric squad, the Hermitian icons and then a big glowy finale with the gemm family ๐Ÿ‘‘ every prototype stays exactly as written, so keep your eyes on the code blocks ๐Ÿซถ


first up, the tail end of a prototype from the last part โ€” she got cut off mid-argument-list and is just vibing here on her own, no cap ๐Ÿ’€

           CBLAS_INT M, const CBLAS_INT N, const CBLAS_INT KL, const CBLAS_INT
           KU, const void *alpha, const void *A, const CBLAS_INT lda, const
           void *X, const CBLAS_INT incX, const void *beta, void *Y, const
           CBLAS_INT incY)

๐Ÿ’œ the z triangular crew

complex double triangular vibes โ€” and notice every scalar and array is a void * in here, that's just how she's spelled:

       void cblas_ztrmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
           TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const void *A, const
           CBLAS_INT lda, void *X, const CBLAS_INT incX)
       void cblas_ztbmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
           TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const
           void *A, const CBLAS_INT lda, void *X, const CBLAS_INT incX)
       void cblas_ztpmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
           TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const void *Ap, void *X,
           const CBLAS_INT incX)
       void cblas_ztrsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
           TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const void *A, const
           CBLAS_INT lda, void *X, const CBLAS_INT incX)
       void cblas_ztbsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
           TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const
           void *A, const CBLAS_INT lda, void *X, const CBLAS_INT incX)
       void cblas_ztpsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
           TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const void *Ap, void *X,
           const CBLAS_INT incX)

๐ŸŒธ single precision, symmetric + rank updates

the float girlies ate this section, honestly โ€” alpha and beta are plain float values in here, no pointers, super chill:

       void cblas_ssymv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const float alpha, const float *A, const CBLAS_INT lda, const
           float *X, const CBLAS_INT incX, const float beta, float *Y, const
           CBLAS_INT incY)
       void cblas_ssbmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const CBLAS_INT K, const float alpha, const float *A, const
           CBLAS_INT lda, const float *X, const CBLAS_INT incX, const float
           beta, float *Y, const CBLAS_INT incY)
       void cblas_sspmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const float alpha, const float *Ap, const float *X, const
           CBLAS_INT incX, const float beta, float *Y, const CBLAS_INT incY)
       void cblas_sger (CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT
           N, const float alpha, const float *X, const CBLAS_INT incX, const
           float *Y, const CBLAS_INT incY, float *A, const CBLAS_INT lda)
       void cblas_ssyr (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const float alpha, const float *X, const CBLAS_INT incX, float
           *A, const CBLAS_INT lda)
       void cblas_sspr (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const float alpha, const float *X, const CBLAS_INT incX, float
           *Ap)
       void cblas_ssyr2 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const float alpha, const float *X, const CBLAS_INT incX, const
           float *Y, const CBLAS_INT incY, float *A, const CBLAS_INT lda)
       void cblas_sspr2 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const float alpha, const float *X, const CBLAS_INT incX, const
           float *Y, const CBLAS_INT incY, float *A)

โœจ double precision, same energy

literally the exact same lineup but double everywhere โ€” she's the glow-up edition ๐ŸŽ€:

       void cblas_dsymv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const double alpha, const double *A, const CBLAS_INT lda, const
           double *X, const CBLAS_INT incX, const double beta, double *Y, const
           CBLAS_INT incY)
       void cblas_dsbmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const CBLAS_INT K, const double alpha, const double *A, const
           CBLAS_INT lda, const double *X, const CBLAS_INT incX, const double
           beta, double *Y, const CBLAS_INT incY)
       void cblas_dspmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const double alpha, const double *Ap, const double *X, const
           CBLAS_INT incX, const double beta, double *Y, const CBLAS_INT incY)
       void cblas_dger (CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT
           N, const double alpha, const double *X, const CBLAS_INT incX, const
           double *Y, const CBLAS_INT incY, double *A, const CBLAS_INT lda)
       void cblas_dsyr (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const double alpha, const double *X, const CBLAS_INT incX, double
           *A, const CBLAS_INT lda)
       void cblas_dspr (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const double alpha, const double *X, const CBLAS_INT incX, double
           *Ap)
       void cblas_dsyr2 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const double alpha, const double *X, const CBLAS_INT incX, const
           double *Y, const CBLAS_INT incY, double *A, const CBLAS_INT lda)
       void cblas_dspr2 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const double alpha, const double *X, const CBLAS_INT incX, const
           double *Y, const CBLAS_INT incY, double *A)

๐Ÿฆ‹ complex single, Hermitian edition

back to void * land โ€” and yes, there's both cblas_cgeru and cblas_cgerc sitting right there next to each other, so please don't just skim and grab the wrong one ๐Ÿ™ˆ:

       void cblas_chemv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const void *alpha, const void *A, const CBLAS_INT lda, const void
           *X, const CBLAS_INT incX, const void *beta, void *Y, const CBLAS_INT
           incY)
       void cblas_chbmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const CBLAS_INT K, const void *alpha, const void *A, const
           CBLAS_INT lda, const void *X, const CBLAS_INT incX, const void
           *beta, void *Y, const CBLAS_INT incY)
       void cblas_chpmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const void *alpha, const void *Ap, const void *X, const CBLAS_INT
           incX, const void *beta, void *Y, const CBLAS_INT incY)
       void cblas_cgeru (CBLAS_LAYOUT layout, const CBLAS_INT M, const
           CBLAS_INT N, const void *alpha, const void *X, const CBLAS_INT incX,
           const void *Y, const CBLAS_INT incY, void *A, const CBLAS_INT lda)
       void cblas_cgerc (CBLAS_LAYOUT layout, const CBLAS_INT M, const
           CBLAS_INT N, const void *alpha, const void *X, const CBLAS_INT incX,
           const void *Y, const CBLAS_INT incY, void *A, const CBLAS_INT lda)
       void cblas_cher (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const float alpha, const void *X, const CBLAS_INT incX, void *A,
           const CBLAS_INT lda)
       void cblas_chpr (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const float alpha, const void *X, const CBLAS_INT incX, void *A)
       void cblas_cher2 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const void *alpha, const void *X, const CBLAS_INT incX, const
           void *Y, const CBLAS_INT incY, void *A, const CBLAS_INT lda)
       void cblas_chpr2 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const void *alpha, const void *X, const CBLAS_INT incX, const
           void *Y, const CBLAS_INT incY, void *Ap)
heads up bestie: cblas_cher and cblas_chpr take a const float alpha while everything around them takes const void *alpha โ€” that's genuinely how she's written, don't "fix" it ๐Ÿ’€

๐Ÿ’œ complex double, the z twins

every single one of the above, but z โ€” and same deal with cblas_zgeru vs cblas_zgerc ๐Ÿ”ฅ:

       void cblas_zhemv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const void *alpha, const void *A, const CBLAS_INT lda, const void
           *X, const CBLAS_INT incX, const void *beta, void *Y, const CBLAS_INT
           incY)
       void cblas_zhbmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const CBLAS_INT K, const void *alpha, const void *A, const
           CBLAS_INT lda, const void *X, const CBLAS_INT incX, const void
           *beta, void *Y, const CBLAS_INT incY)
       void cblas_zhpmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const void *alpha, const void *Ap, const void *X, const CBLAS_INT
           incX, const void *beta, void *Y, const CBLAS_INT incY)
       void cblas_zgeru (CBLAS_LAYOUT layout, const CBLAS_INT M, const
           CBLAS_INT N, const void *alpha, const void *X, const CBLAS_INT incX,
           const void *Y, const CBLAS_INT incY, void *A, const CBLAS_INT lda)
       void cblas_zgerc (CBLAS_LAYOUT layout, const CBLAS_INT M, const
           CBLAS_INT N, const void *alpha, const void *X, const CBLAS_INT incX,
           const void *Y, const CBLAS_INT incY, void *A, const CBLAS_INT lda)
       void cblas_zher (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const double alpha, const void *X, const CBLAS_INT incX, void *A,
           const CBLAS_INT lda)
       void cblas_zhpr (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const double alpha, const void *X, const CBLAS_INT incX, void *A)
       void cblas_zher2 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const void *alpha, const void *X, const CBLAS_INT incX, const
           void *Y, const CBLAS_INT incY, void *A, const CBLAS_INT lda)
       void cblas_zhpr2 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT
           N, const void *alpha, const void *X, const CBLAS_INT incX, const
           void *Y, const CBLAS_INT incY, void *Ap)

๐Ÿ‘‘ level 3, single precision โ€” main character energy

okay this is the part everyone actually came for, the matrix-matrix headliners ๐ŸŽ€ and yes cblas_sgemmtr is real, she's right there between gemm and symm:

       void cblas_sgemm (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA,
           CBLAS_TRANSPOSE TransB, const CBLAS_INT M, const CBLAS_INT N, const
           CBLAS_INT K, const float alpha, const float *A, const CBLAS_INT lda,
           const float *B, const CBLAS_INT ldb, const float beta, float *C,
           const CBLAS_INT ldc)
       void cblas_sgemmtr (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
           CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB, const CBLAS_INT N,
           const CBLAS_INT K, const float alpha, const float *A, const
           CBLAS_INT lda, const float *B, const CBLAS_INT ldb, const float
           beta, float *C, const CBLAS_INT ldc)
       void cblas_ssymm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
           const CBLAS_INT M, const CBLAS_INT N, const float alpha, const float
           *A, const CBLAS_INT lda, const float *B, const CBLAS_INT ldb, const
           float beta, float *C, const CBLAS_INT ldc)
       void cblas_ssyrk (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
           Trans, const CBLAS_INT N, const CBLAS_INT K, const float alpha,
           const float *A, const CBLAS_INT lda, const float beta, float *C,
           const CBLAS_INT ldc)
       void cblas_ssyr2k (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
           Trans, const CBLAS_INT N, const CBLAS_INT K, const float alpha,
           const float *A, const CBLAS_INT lda, const float *B, const CBLAS_INT
           ldb, const float beta, float *C, const CBLAS_INT ldc)
       void cblas_strmm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
           CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT M, const
           CBLAS_INT N, const float alpha, const float *A, const CBLAS_INT lda,
           float *B, const CBLAS_INT ldb)
       void cblas_strsm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
           CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT M, const
           CBLAS_INT N, const float alpha, const float *A, const CBLAS_INT lda,
           float *B, const CBLAS_INT ldb)
note the vibe shift: cblas_strmm and cblas_strsm take float *B (not const) because they write into it, while A stays const float * ๐Ÿซถ

๐Ÿ”ฅ level 3, double precision

same lineup, double glow-up โ€” and heads up, cblas_dsymm gets cut off right at the edge of this chunk, so don't panic when the code block just ends mid-signature ๐Ÿ’€ she carries on in the next part:

       void cblas_dgemm (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA,
           CBLAS_TRANSPOSE TransB, const CBLAS_INT M, const CBLAS_INT N, const
           CBLAS_INT K, const double alpha, const double *A, const CBLAS_INT
           lda, const double *B, const CBLAS_INT ldb, const double beta, double
           *C, const CBLAS_INT ldc)
       void cblas_dgemmtr (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
           CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB, const CBLAS_INT N,
           const CBLAS_INT K, const double alpha, const double *A, const
           CBLAS_INT lda, const double *B, const CBLAS_INT ldb, const double
           beta, double *C, const CBLAS_INT ldc)
       void cblas_dsymm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,

...and the synopsis scroll continues, bestie โ€” same energy, just more prototypes ๐Ÿ’…

           const CBLAS_INT M, const CBLAS_INT N, const double alpha, const
           double *A, const CBLAS_INT lda, const double *B, const CBLAS_INT
           ldb, const double beta, double *C, const CBLAS_INT ldc)
       void cblas_dsyrk (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
           Trans, const CBLAS_INT N, const CBLAS_INT K, const double alpha,
           const double *A, const CBLAS_INT lda, const double beta, double *C,
           const CBLAS_INT ldc)
       void cblas_dsyr2k (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
           Trans, const CBLAS_INT N, const CBLAS_INT K, const double alpha,
           const double *A, const CBLAS_INT lda, const double *B, const
           CBLAS_INT ldb, const double beta, double *C, const CBLAS_INT ldc)
       void cblas_dtrmm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
           CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT M, const
           CBLAS_INT N, const double alpha, const double *A, const CBLAS_INT
           lda, double *B, const CBLAS_INT ldb)
       void cblas_dtrsm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
           CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT M, const
           CBLAS_INT N, const double alpha, const double *A, const CBLAS_INT
           lda, double *B, const CBLAS_INT ldb)
       void cblas_cgemm (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA,
           CBLAS_TRANSPOSE TransB, const CBLAS_INT M, const CBLAS_INT N, const
           CBLAS_INT K, const void *alpha, const void *A, const CBLAS_INT lda,
           const void *B, const CBLAS_INT ldb, const void *beta, void *C, const
           CBLAS_INT ldc)
       void cblas_cgemmtr (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
           CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB, const CBLAS_INT N,
           const CBLAS_INT K, const void *alpha, const void *A, const CBLAS_INT
           lda, const void *B, const CBLAS_INT ldb, const void *beta, void *C,
           const CBLAS_INT ldc)
       void cblas_csymm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
           const CBLAS_INT M, const CBLAS_INT N, const void *alpha, const void
           *A, const CBLAS_INT lda, const void *B, const CBLAS_INT ldb, const
           void *beta, void *C, const CBLAS_INT ldc)
       void cblas_csyrk (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
           Trans, const CBLAS_INT N, const CBLAS_INT K, const void *alpha,
           const void *A, const CBLAS_INT lda, const void *beta, void *C, const
           CBLAS_INT ldc)
       void cblas_csyr2k (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
           Trans, const CBLAS_INT N, const CBLAS_INT K, const void *alpha,
           const void *A, const CBLAS_INT lda, const void *B, const CBLAS_INT
           ldb, const void *beta, void *C, const CBLAS_INT ldc)
       void cblas_ctrmm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
           CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT M, const
           CBLAS_INT N, const void *alpha, const void *A, const CBLAS_INT lda,
           void *B, const CBLAS_INT ldb)
       void cblas_ctrsm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
           CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT M, const
           CBLAS_INT N, const void *alpha, const void *A, const CBLAS_INT lda,
           void *B, const CBLAS_INT ldb)
       void cblas_zgemm (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA,
           CBLAS_TRANSPOSE TransB, const CBLAS_INT M, const CBLAS_INT N, const
           CBLAS_INT K, const void *alpha, const void *A, const CBLAS_INT lda,
           const void *B, const CBLAS_INT ldb, const void *beta, void *C, const
           CBLAS_INT ldc)
       void cblas_zgemmtr (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
           CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB, const CBLAS_INT N,
           const CBLAS_INT K, const void *alpha, const void *A, const CBLAS_INT
           lda, const void *B, const CBLAS_INT ldb, const void *beta, void *C,
           const CBLAS_INT ldc)
       void cblas_zsymm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
           const CBLAS_INT M, const CBLAS_INT N, const void *alpha, const void
           *A, const CBLAS_INT lda, const void *B, const CBLAS_INT ldb, const
           void *beta, void *C, const CBLAS_INT ldc)
       void cblas_zsyrk (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
           Trans, const CBLAS_INT N, const CBLAS_INT K, const void *alpha,
           const void *A, const CBLAS_INT lda, const void *beta, void *C, const
           CBLAS_INT ldc)
       void cblas_zsyr2k (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
           Trans, const CBLAS_INT N, const CBLAS_INT K, const void *alpha,
           const void *A, const CBLAS_INT lda, const void *B, const CBLAS_INT
           ldb, const void *beta, void *C, const CBLAS_INT ldc)
       void cblas_ztrmm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
           CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT M, const
           CBLAS_INT N, const void *alpha, const void *A, const CBLAS_INT lda,
           void *B, const CBLAS_INT ldb)
       void cblas_ztrsm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
           CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT M, const
           CBLAS_INT N, const void *alpha, const void *A, const CBLAS_INT lda,
           void *B, const CBLAS_INT ldb)
       void cblas_chemm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
           const CBLAS_INT M, const CBLAS_INT N, const void *alpha, const void
           *A, const CBLAS_INT lda, const void *B, const CBLAS_INT ldb, const
           void *beta, void *C, const CBLAS_INT ldc)
       void cblas_cherk (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
           Trans, const CBLAS_INT N, const CBLAS_INT K, const float alpha,
           const void *A, const CBLAS_INT lda, const float beta, void *C, const
           CBLAS_INT ldc)
       void cblas_cher2k (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
           Trans, const CBLAS_INT N, const CBLAS_INT K, const void *alpha,
           const void *A, const CBLAS_INT lda, const void *B, const CBLAS_INT
           ldb, const float beta, void *C, const CBLAS_INT ldc)
       void cblas_zhemm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
           const CBLAS_INT M, const CBLAS_INT N, const void *alpha, const void
           *A, const CBLAS_INT lda, const void *B, const CBLAS_INT ldb, const
           void *beta, void *C, const CBLAS_INT ldc)
       void cblas_zherk (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
           Trans, const CBLAS_INT N, const CBLAS_INT K, const double alpha,
           const void *A, const CBLAS_INT lda, const double beta, void *C,
           const CBLAS_INT ldc)
       void cblas_zher2k (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
           Trans, const CBLAS_INT N, const CBLAS_INT K, const void *alpha,
           const void *A, const CBLAS_INT lda, const void *B, const CBLAS_INT
           ldb, const double beta, void *C, const CBLAS_INT ldc)
       void cblas_xerbla (CBLAS_INT p, const char *rout, const char *form,...)

okay that's the whole prototype parade ๐ŸŽ‰ and now we get into the good stuff โ€” the actual definitions. buckle up ๐Ÿฆ‹


๐ŸŽ€ Macro Definition Documentation ๐ŸŽ€

these are the little #defines sprinkled through the header. tiny but iconic โœจ

  • #define API_SUFFIX( a) โ€” its value is literally just a:
a

defined at line 57 of file cblas.h ๐Ÿ’–

  • #define CBLAS_IFMT PRId32 โ€” defined at line 35 of file cblas.h.
  • #define CBLAS_INDEX size_t /* this may vary between platforms */ โ€” defined at line 15 of file cblas.h. bestie note the comment: it may vary between platforms ๐Ÿ˜ญ so don't go assuming it's always the exact same type everywhere.
  • #define CBLAS_INT int32_t โ€” defined at line 24 of file cblas.h.
  • #define CBLAS_ORDER CBLAS_LAYOUT /* this for backward compatibility with CBLAS_ORDER */ โ€” defined at line 45 of file cblas.h. and yes the comment says the whole reason it exists is backward compatibility with CBLAS_ORDER ๐Ÿ‘‘ respect the elders.

๐ŸŒธ Typedef Documentation ๐ŸŒธ

five lil' enum aliases, all living their best life ๐ŸŒˆ

  • typedef enum CBLAS_DIAG CBLAS_DIAG
  • typedef enum CBLAS_LAYOUT CBLAS_LAYOUT
  • typedef enum CBLAS_SIDE CBLAS_SIDE
  • typedef enum CBLAS_TRANSPOSE CBLAS_TRANSPOSE
  • typedef enum CBLAS_UPLO CBLAS_UPLO

๐Ÿฆ‹ Enumeration Type Documentation ๐Ÿฆ‹

the actual enumerators, one enum at a time, no gatekeeping ๐Ÿ’…

enum CBLAS_DIAG

enumerators:

  • CblasNonUnit
  • CblasUnit

defined at line 42 of file cblas.h ๐ŸŽ€

enum CBLAS_LAYOUT

enumerators:

  • CblasRowMajor
  • CblasColMajor

defined at line 39 of file cblas.h โœจ

enum CBLAS_SIDE

enumerators:

  • CblasLeft
  • CblasRight

defined at line 43 of file cblas.h ๐Ÿ’–

enum CBLAS_TRANSPOSE

enumerators:

  • CblasNoTrans
  • CblasTrans
  • CblasConjTrans

defined at line 40 of file cblas.h ๐Ÿซถ

enum CBLAS_UPLO

enumerators:

  • CblasUpper
  • CblasLower

defined at line 41 of file cblas.h ๐ŸŒธ


๐Ÿ‘‘ Function Documentation ๐Ÿ‘‘

here's where each function actually lives โ€” file and line, receipts and all ๐Ÿงพ lowkey this is the most useful part, ngl.

  • void cblas_caxpy (const CBLAS_INT N, const void * alpha, const void * X, const CBLAS_INT incX, void * Y, const CBLAS_INT incY)

definition at line 11 of file cblas_caxpy.c ๐Ÿ’…

  • void cblas_ccopy (const CBLAS_INT N, const void * X, const CBLAS_INT incX, void * Y, const CBLAS_INT incY)

definition at line 11 of file cblas_ccopy.c.

  • void cblas_cdotc_sub (const CBLAS_INT N, const void * X, const CBLAS_INT incX, const void * Y, const CBLAS_INT incY, void * dotc)

definition at line 12 of file cblas_cdotc_sub.c.

  • void cblas_cdotu_sub (const CBLAS_INT N, const void * X, const CBLAS_INT incX, const void * Y, const CBLAS_INT incY, void * dotu)

definition at line 12 of file cblas_cdotu_sub.c.

  • void cblas_cgbmv (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const CBLAS_INT M, const CBLAS_INT N, const CBLAS_INT KL, const CBLAS_INT KU, const void * alpha, const void * A, const CBLAS_INT lda, const void * X, const CBLAS_INT incX, const void * beta, void * Y, const CBLAS_INT incY)

definition at line 12 of file cblas_cgbmv.c.

  • void cblas_cgemm (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB, const CBLAS_INT M, const CBLAS_INT N, const CBLAS_INT K, const void * alpha, const void * A, const CBLAS_INT lda, const void * B, const CBLAS_INT ldb, const void * beta, void * C, const CBLAS_INT ldc)

definition at line 12 of file cblas_cgemm.c ๐Ÿ”ฅ

  • void cblas_cgemmtr (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB, const CBLAS_INT N, const CBLAS_INT K, const void * alpha, const void * A, const CBLAS_INT lda, const void * B, const CBLAS_INT ldb, const void * beta, void * C, const CBLAS_INT ldc)

definition at line 12 of file cblas_cgemmtr.c.

  • void cblas_cgemv (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const CBLAS_INT M, const CBLAS_INT N, const void * alpha, const void * A, const CBLAS_INT lda, const void * X, const CBLAS_INT incX, const void * beta, void * Y, const CBLAS_INT incY)

definition at line 12 of file cblas_cgemv.c.

  • void cblas_cgerc (CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N, const void * alpha, const void * X, const CBLAS_INT incX, const void * Y, const CBLAS_INT incY, void * A, const CBLAS_INT lda)

definition at line 12 of file cblas_cgerc.c ๐Ÿ’œ

  • void cblas_cgeru (CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N, const void * alpha, const void * X, const CBLAS_INT incX, const void * Y, const CBLAS_INT incY, void * A, const CBLAS_INT lda)

definition at line 10 of file cblas_cgeru.c โ€” yes, line 10, everybody else was line 12, this one's just different like that ๐Ÿ™ˆ

  • void cblas_chbmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N, const CBLAS_INT K, const void * alpha, const void * A, const CBLAS_INT lda, const void * X, const CBLAS_INT incX, const void * beta, void * Y, const CBLAS_INT incY)

definition at line 12 of file cblas_chbmv.c โญ

๐Ÿ’… cblas_chemm

void cblas_chemm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
    const CBLAS_INT M, const CBLAS_INT N, const void * alpha, const void *
    A, const CBLAS_INT lda, const void * B, const CBLAS_INT ldb, const void
    * beta, void * C, const CBLAS_INT ldc)

Definition at line 12 of file cblas_chemm.c.

Ok so the c-girlies are up first and they are serving void pointer realness โ€” everything's const void * because complex numbers don't do labels. Respect.


โœจ cblas_chemv

void cblas_chemv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N,
    const void * alpha, const void * A, const CBLAS_INT lda, const void * X,
    const CBLAS_INT incX, const void * beta, void * Y, const CBLAS_INT incY)

Definition at line 12 of file cblas_chemv.c.

Notice X is const void * but Y is just void * โ€” one's read-only, one's getting written to. Character development, honestly.


๐ŸŽ€ cblas_cher

void cblas_cher (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N,
    const float alpha, const void * X, const CBLAS_INT incX, void * A, const
    CBLAS_INT lda)

Definition at line 12 of file cblas_cher.c.

Bestie the alpha here is a plain const float while everything else is const void * โ€” no cap, that's just how this one is built. ๐Ÿซถ


๐Ÿฆ‹ cblas_cher2

void cblas_cher2 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N,
    const void * alpha, const void * X, const CBLAS_INT incX, const void *
    Y, const CBLAS_INT incY, void * A, const CBLAS_INT lda)

Definition at line 12 of file cblas_cher2.c.

Two vectors this time (X and Y), and alpha is back to being a const void *. It's giving glow-up.


๐ŸŒธ cblas_cher2k

void cblas_cher2k (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
    Trans, const CBLAS_INT N, const CBLAS_INT K, const void * alpha, const
    void * A, const CBLAS_INT lda, const void * B, const CBLAS_INT ldb,
    const float beta, void * C, const CBLAS_INT ldc)

Definition at line 12 of file cblas_cher2k.c.

Trans is a CBLAS_TRANSPOSE, alpha is const void *, beta is const float โ€” the mixed-type chaos is iconic, keep up.


๐Ÿ’œ cblas_cherk

void cblas_cherk (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
    Trans, const CBLAS_INT N, const CBLAS_INT K, const float alpha, const
    void * A, const CBLAS_INT lda, const float beta, void * C, const
    CBLAS_INT ldc)

Definition at line 12 of file cblas_cherk.c.

Here alpha and beta are both const float and the matrices are const void *. Slay, consistency.


โญ cblas_chpmv

void cblas_chpmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N,
    const void * alpha, const void * Ap, const void * X, const CBLAS_INT
    incX, const void * beta, void * Y, const CBLAS_INT incY)

Definition at line 12 of file cblas_chpmv.c.

See that Ap with no lda next to it? That's the whole vibe of this signature โ€” no leading dimension, just Ap out here living its life.


๐Ÿ“ cblas_chpr

void cblas_chpr (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N,
    const float alpha, const void * X, const CBLAS_INT incX, void * A)

Definition at line 12 of file cblas_chpr.c.

Short and sweet: layout, Uplo, N, a const float alpha, X with incX, and then A. That's it, that's the whole function signature. ๐ŸŽ€


๐Ÿงš cblas_chpr2

void cblas_chpr2 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N,
    const void * alpha, const void * X, const CBLAS_INT incX, const void *
    Y, const CBLAS_INT incY, void * Ap)

Definition at line 12 of file cblas_chpr2.c.

Two vectors, one Ap, alpha as const void *. Main character energy from the packed-storage girlies.


๐Ÿ”ฅ cblas_crotg

void cblas_crotg (void * a, void * b, float * c, void * s)

Definition at line 9 of file cblas_crotg.c.

No layout, no N, no incX โ€” this one just rolls up with four pointers and no context whatsoever. We stan a mysterious queen. ๐Ÿ’€


๐ŸŒˆ cblas_cscal

void cblas_cscal (const CBLAS_INT N, const void * alpha, void * X, const
    CBLAS_INT incX)

Definition at line 11 of file cblas_cscal.c.

Four args, alpha is const void *, X is void *. Lowkey the most unbothered signature on this page.


๐Ÿฆ‹ cblas_csrot

void cblas_csrot (const CBLAS_INT N, void * X, const CBLAS_INT incX, void *
    Y, const CBLAS_INT incY, const float c, const float s)

Definition at line 9 of file cblas_csrot.c.

c and s are const float here, and yes those are the actual parameter names โ€” single letters, zero notes, no explanation. Fr fr.


๐ŸŒŸ cblas_csscal

void cblas_csscal (const CBLAS_INT N, const float alpha, void * X, const
    CBLAS_INT incX)

Definition at line 11 of file cblas_csscal.c.

Same shape as cblas_cscal but alpha is a const float instead of const void *. One tiny glyph of difference, bestie.


๐Ÿ’ซ cblas_cswap

void cblas_cswap (const CBLAS_INT N, void * X, const CBLAS_INT incX, void *
    Y, const CBLAS_INT incY)

Definition at line 11 of file cblas_cswap.c.

Both X and Y are plain void * โ€” nobody's const here, everybody's got something to say. ๐Ÿ™ˆ


๐Ÿ‘‘ cblas_csymm

void cblas_csymm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
    const CBLAS_INT M, const CBLAS_INT N, const void * alpha, const void *
    A, const CBLAS_INT lda, const void * B, const CBLAS_INT ldb, const void
    * beta, void * C, const CBLAS_INT ldc)

Definition at line 12 of file cblas_csymm.c.

Full house: layout, Side, Uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc. Thirteen parameters and not a single one wasted. โœจ


๐ŸŒบ cblas_csyr2k

void cblas_csyr2k (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
    Trans, const CBLAS_INT N, const CBLAS_INT K, const void * alpha, const
    void * A, const CBLAS_INT lda, const void * B, const CBLAS_INT ldb,
    const void * beta, void * C, const CBLAS_INT ldc)

Definition at line 12 of file cblas_csyr2k.c.

alpha and beta are both const void * on this one โ€” unlike its cher2k cousin, no float in sight. ๐Ÿ’…


๐ŸŽ€ cblas_csyrk

void cblas_csyrk (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
    Trans, const CBLAS_INT N, const CBLAS_INT K, const void * alpha, const
    void * A, const CBLAS_INT lda, const void * beta, void * C, const
    CBLAS_INT ldc)

Definition at line 12 of file cblas_csyrk.c.

Only one matrix in (A + lda), output goes to C + ldc. Minimalist but make it complex.


๐ŸŒฟ cblas_ctbmv

void cblas_ctbmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
    TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const
    void * A, const CBLAS_INT lda, void * X, const CBLAS_INT incX)

Definition at line 10 of file cblas_ctbmv.c.

TransA AND Diag both showing up โ€” the enum duo we didn't know we needed. Note it's line 10, not 12, bestie, stay awake. ๐Ÿ˜ญ


๐ŸŒ™ cblas_ctbsv

void cblas_ctbsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
    TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const
    void * A, const CBLAS_INT lda, void * X, const CBLAS_INT incX)

Definition at line 10 of file cblas_ctbsv.c.

Exact same parameter list as cblas_ctbmv above โ€” the only thing that changes is the name and the file. Twins, but make it separate.


๐Ÿซง cblas_ctpmv

void cblas_ctpmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
    TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const void * Ap, void * X,
    const CBLAS_INT incX)

Definition at line 10 of file cblas_ctpmv.c.

Ap and no K, no lda โ€” the packed version dropped the leading dimension and honestly? Good for her.


๐ŸงŠ cblas_ctpsv

void cblas_ctpsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
    TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const void * Ap, void * X,
    const CBLAS_INT incX)

Definition at line 10 of file cblas_ctpsv.c.

Same story as cblas_ctpmv โ€” Ap, X, incX, and the two enums doing all the personality work.


๐Ÿ”ฎ cblas_ctrmm

void cblas_ctrmm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
    CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT M, const
    CBLAS_INT N, const void * alpha, const void * A, const CBLAS_INT lda,
    void * B, const CBLAS_INT ldb)

Definition at line 12 of file cblas_ctrmm.c.

Four enums before a single number โ€” Side, Uplo, TransA, Diag โ€” then M, N, alpha, A, lda, B, ldb. The enum backlog is real. ๐Ÿซถ


๐ŸŒŠ cblas_ctrmv

void cblas_ctrmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
    TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const void * A, const
    CBLAS_INT lda, void * X, const CBLAS_INT incX)

Definition at line 10 of file cblas_ctrmv.c.

A comes with lda, X comes with incX, and N is just there vibing in the middle.


๐Ÿ’Ž cblas_ctrsm

void cblas_ctrsm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
    CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT M, const
    CBLAS_INT N, const void * alpha, const void * A, const CBLAS_INT lda,
    void * B, const CBLAS_INT ldb)

Definition at line 12 of file cblas_ctrsm.c.

void cblas_ctrmm and void cblas_ctrsm literally share a parameter list, character for character. Not a typo on my end, bestie, that's just the page.


๐ŸŒธ cblas_ctrsv

void cblas_ctrsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
    TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const void * A, const
    CBLAS_INT lda, void * X, const CBLAS_INT incX)

Definition at line 10 of file cblas_ctrsv.c.

And that's the last of the c crew. Line 10 again โ€” ctrsv, we see you. ๐Ÿ‘‘


โญ cblas_dasum

double cblas_dasum (const CBLAS_INT N, const double * X, const CBLAS_INT
    incX)

Definition at line 12 of file cblas_dasum.c.

Plot twist: this one returns a double instead of void. Everyone say congrats to cblas_dasum for having a return type. ๐ŸŽ‰


๐Ÿ”ฅ cblas_daxpy

void cblas_daxpy (const CBLAS_INT N, const double alpha, const double * X,
    const CBLAS_INT incX, double * Y, const CBLAS_INT incY)

Definition at line 11 of file `cblas_daxpy.c.

alpha is a plain const double โ€” no void * in sight, the d functions keep it simple. X is const, Y is not, and that's the whole dynamic.


๐Ÿ’€ cblas_dcabs1

double cblas_dcabs1 (const void * z)

Definition at line 9 of file `cblas_dcabs1.c.

One argument. const void * z. Returns a double. That is the entire function. Short king behavior, honestly.


๐ŸŽ€ cblas_dcopy

void cblas_dcopy (const CBLAS_INT N, const double * X, const CBLAS_INT incX,
    double * Y, const CBLAS_INT incY)

Definition at line 11 of file cblas_dcopy.c.

X with incX, Y with incY, N up front. The classic layout, no notes. ๐Ÿ’…


๐Ÿ“ cblas_ddot

double cblas_ddot (const CBLAS_INT N, const double * X, const CBLAS_INT
    incX, const double * Y, const CBLAS_INT incY)

Definition at line 12 of file cblas_ddot.c.

Both X and Y are const double * โ€” nobody's getting modified, this one's just here to return a double and leave.


๐ŸŒˆ cblas_dgbmv

void cblas_dgbmv (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const
    CBLAS_INT M, const CBLAS_INT N, const CBLAS_INT KL, const CBLAS_INT KU,
    const double alpha, const double * A, const CBLAS_INT lda, const double
    * X, const CBLAS_INT incX, const double beta, double * Y, const
    CBLAS_INT incY)

Definition at line 11 of file cblas_dgbmv.c.

The widest signature so far and it brought both KL and KU to the party. Obsessed with the dedication. โœจ


๐Ÿ‘‘ cblas_dgemm

void cblas_dgemm (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA,
    CBLAS_TRANSPOSE TransB, const CBLAS_INT M, const CBLAS_INT N, const
    CBLAS_INT K, const double alpha, const double * A, const CBLAS_INT lda,
    const double * B, const CBLAS_INT ldb, const double beta, double * C,
    const CBLAS_INT ldc)

Definition at line 12 of file cblas_dgemm.c.

Fourteen parameters. TransA and TransB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc. This is the main character of the page, no cap. ๐Ÿ’–


๐Ÿฆ‹ cblas_dgemmtr

void cblas_dgemmtr (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
    TransA, CBLAS_TRANSPOSE TransB, const CBLAS_INT N, const CBLAS_INT K,
    const double alpha, const double * A, const CBLAS_INT lda, const double
    * B, const CBLAS_INT ldb, const double beta, double * C, const CBLAS_INT
    ldc)

Definition at line 12 of file cblas_dgemmtr.c.

Don't skip her!! She's got Uplo where dgemm has M, and a single N where dgemm has M and N. Different girl, different signature. ๐Ÿซถ


๐ŸŒŠ cblas_dgemv

void cblas_dgemv (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const
    CBLAS_INT M, const CBLAS_INT N, const double alpha, const double * A,
    const CBLAS_INT lda, const double * X, const CBLAS_INT incX, const
    double beta, double * Y, const CBLAS_INT incY)

Definition at line 11 of file cblas_dgemv.c.

One TransA instead of two, X/incX where the gemm had B, Y where it had C. The matrix-vector remix. ๐ŸŽถ


๐Ÿ’œ cblas_dger

void cblas_dger (CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N,
    const double alpha, const double * X, const CBLAS_INT incX, const double
    * Y, const CBLAS_INT incY, double * A, const CBLAS_INT lda)

Definition at line 12 of file cblas_dger.c.

No Trans anything โ€” just layout, M, N, alpha, X, incX, Y, incY, A, lda. Refreshingly undramatic.


๐ŸŒ™ cblas_dnrm2

double cblas_dnrm2 (const CBLAS_INT N, const double * X, const CBLAS_INT
    incX)

Definition at line 12 of file cblas_dnrm2.c.

Three parameters, returns a double, done. A little minimalist moment for us. ๐ŸŽ€


๐ŸŒธ cblas_drot

void cblas_drot (const CBLAS_INT N, double * X, const CBLAS_INT incX, double
    * Y, const CBLAS_INT incY, const double c, const double s)

Definition at line 11 of file cblas_drot.c.

X and Y are both writable double *, and c and s ride in as const double at the end. Balanced. ๐Ÿ’…


๐Ÿ”ฅ cblas_drotg

void cblas_drotg (double * a, double * b, double * c, double * s)

Definition at line 11 of file cblas_drotg.c.

Four double *, zero const, zero context. She said "figure it out." ๐Ÿ’€


โญ cblas_drotm

void cblas_drotm (const CBLAS_INT N, double * X, const CBLAS_INT incX,
    double * Y, const CBLAS_INT incY, const double * P)

Definition at line 3 of file cblas_drotm.c.

Line 3, bestie!! Everyone else is line 10, 11, or 12 and this one showed up early. Also: P is a const double * out here all by itself.


๐Ÿงš cblas_drotmg

void cblas_drotmg (double * d1, double * d2, double * b1, const double b2,
    double * P)

Definition at line 11 of file cblas_drotmg.c.

Three writable pointers, then b2 as a plain const double (not a pointer!!), then P. The way b2 is the only non-pointer โ€” icon behavior.


๐Ÿ“ cblas_dsbmv

void cblas_dsbmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N,
    const CBLAS_INT K, const double alpha, const double * A, const CBLAS_INT
    lda, const double * X, const CBLAS_INT incX, const double beta, double *
    Y, const CBLAS_INT incY)

Definition at line 12 of file cblas_dsbmv.c.

N and K up front, alpha before A, beta right before Y. Order matters, babes, don't shuffle. โœจ


๐Ÿซง cblas_dscal

void cblas_dscal (const CBLAS_INT N, const double alpha, double * X, const
    CBLAS_INT incX)

Definition at line 11 of file cblas_dscal.c.

Four args, shortest d function on the page. Also the c version of her exists with a const void * alpha โ€” compare and contrast, iykyk.


๐ŸŒˆ cblas_dsdot

double cblas_dsdot (const CBLAS_INT N, const float * X, const CBLAS_INT
    incX, const float * Y, const CBLAS_INT incY)

Definition at line 12 of file cblas_dsdot.c.

Wait โ€” the float!! X and Y here are const float * and it still returns a double. The mixed-type moment of the century. ๐Ÿ”ฅ


๐Ÿ’Ž cblas_dspmv

void cblas_dspmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N,
    const double alpha, const double * Ap, const double * X, const CBLAS_INT
    incX, const double beta, double * Y, const CBLAS_INT incY)

Definition at line 13 of file cblas_dspmv.c.

Line 13! One whole line later than the usual 12. Ap again with no lda following it โ€” packed storage stays packed. ๐ŸŽ€


๐ŸŒŸ cblas_dspr

void cblas_dspr (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N,
    const double alpha, const double * X, const CBLAS_INT incX, double * Ap)

Definition at line 12 of file cblas_dspr.c.

Seven parameters and the last one, Ap, is the writable one. Everybody before it gets const treatment. Queen of boundaries.


๐Ÿ’ซ cblas_dspr2

void cblas_dspr2 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N,
    const double alpha, const double * X, const CBLAS_INT incX, const double
    * Y, const CBLAS_INT incY, double * A)

Definition at line 10 of file cblas_dspr2.c.

Heads up โ€” the trailing output is called A here, not Ap. Same slot, different name. Don't let that sneak past you. ๐Ÿ™ˆ Also line 10, the early riser.


๐ŸŒบ cblas_dswap

void cblas_dswap (const CBLAS_INT N, double * X, const CBLAS_INT incX,
    double * Y, const CBLAS_INT incY)

Definition at line 11 of file cblas_dswap.c.

No const on X or Y, because everybody's getting rewritten, bestie. Equal opportunity modification. ๐Ÿ’…


๐Ÿ‘‘ cblas_dsymm

void cblas_dsymm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
    const CBLAS_INT M, const CBLAS_INT N, const double alpha, const double *
    A, const CBLAS_INT lda, const double * B, const CBLAS_INT ldb, const
    double beta, double * C, const CBLAS_INT ldc)

Definition at line 12 of file `cblas_dsymm.c.

Side + Uplo combo, M and N, then alpha/A/lda, beta/B/ldb, and C/ldc waiting at the end. Thirteen parameters of pure structure. โœจ


๐Ÿฆ‹ cblas_dsymv

void cblas_dsymv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N,
    const double alpha, const double * A, const CBLAS_INT lda, const double
    * X, const CBLAS_INT incX, const double beta, double * Y, const
    CBLAS_INT incY)

Definition at line 12 of file cblas_dsymv.c.

dsymm minus the Side plus X/incX โ€” the symmetry saga continues and we are sat for the rest of it, no cap. ๐Ÿซถ

okay so we're still in the function list and honestly bestie we're thriving โ€” the d squad is wrapping up, then it's the s girlies all the way down. buckle up ๐Ÿ’…

  • cblas_dsyr ๐ŸŽ€ โ€” void cblas_dsyr (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N, const double alpha, const double * X, const CBLAS_INT incX, double * A, const CBLAS_INT lda) โ€” defined at line 12 of file cblas_dsyr.c.
  • cblas_dsyr2 โœจ โ€” void cblas_dsyr2 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N, const double alpha, const double * X, const CBLAS_INT incX, const double * Y, const CBLAS_INT incY, double * A, const CBLAS_INT lda) โ€” defined at line 12 of file cblas_dsyr2.c.
  • cblas_dsyr2k ๐Ÿ’– โ€” void cblas_dsyr2k (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE Trans, const CBLAS_INT N, const CBLAS_INT K, const double alpha, const double * A, const CBLAS_INT lda, const double * B, const CBLAS_INT ldb, const double beta, double * C, const CBLAS_INT ldc) โ€” defined at line 12 of file cblas_dsyr2k.c.
  • cblas_dsyrk ๐ŸŒธ โ€” void cblas_dsyrk (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE Trans, const CBLAS_INT N, const CBLAS_INT K, const double alpha, const double * A, const CBLAS_INT lda, const double beta, double * C, const CBLAS_INT ldc) โ€” defined at line 12 of file cblas_dsyrk.c.
  • cblas_dtbmv โ€” void cblas_dtbmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const double * A, const CBLAS_INT lda, double * X, const CBLAS_INT incX) โ€” defined at line 10 of file cblas_dtbmv.c.
  • cblas_dtbsv โ€” void cblas_dtbsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const double * A, const CBLAS_INT lda, double * X, const CBLAS_INT incX) โ€” defined at line 10 of file cblas_dtbsv.c.
  • cblas_dtpmv ๐Ÿฆ‹ โ€” void cblas_dtpmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const double * Ap, double * X, const CBLAS_INT incX) โ€” defined at line 10 of file cblas_dtpmv.c.
  • cblas_dtpsv ๐Ÿฆ‹ โ€” void cblas_dtpsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const double * Ap, double * X, const CBLAS_INT incX) โ€” defined at line 10 of file cblas_dtpsv.c.
notice how dtpmv and dtpsv are literally twins except for one letter โ€” the packed-storage girlies said "same energy, different Ap" and they ate ๐Ÿ’€ (also both live at line 10, matching outfits, iconic).
  • cblas_dtrmm ๐Ÿ”ฅ โ€” void cblas_dtrmm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT M, const CBLAS_INT N, const double alpha, const double * A, const CBLAS_INT lda, double * B, const CBLAS_INT ldb) โ€” defined at line 12 of file cblas_dtrmm.c.
  • cblas_dtrmv โ€” void cblas_dtrmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const double * A, const CBLAS_INT lda, double * X, const CBLAS_INT incX) โ€” defined at line 12 of file cblas_dtrmv.c.
  • cblas_dtrsm ๐Ÿ”ฅ โ€” void cblas_dtrsm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT M, const CBLAS_INT N, const double alpha, const double * A, const CBLAS_INT lda, double * B, const CBLAS_INT ldb) โ€” defined at line 12 of file cblas_dtrsm.c.
  • cblas_dtrsv โ€” void cblas_dtrsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const double * A, const CBLAS_INT lda, double * X, const CBLAS_INT incX) โ€” defined at line 10 of file cblas_dtrsv.c.

okay quick vibe check: the trmm/trsm pair both take CBLAS_SIDE Side plus M and N and two matrices (A and B), while the trmv/trsv pair keeps it to one matrix A and one vector X. no cap, that's the whole shape of it ๐Ÿ’…

  • cblas_dzasum โญ โ€” double cblas_dzasum (const CBLAS_INT N, const void * X, const CBLAS_INT incX) โ€” defined at line 12 of file cblas_dzasum.c.
  • cblas_dznrm2 โญ โ€” double cblas_dznrm2 (const CBLAS_INT N, const void * X, const CBLAS_INT incX) โ€” defined at line 12 of file cblas_dznrm2.c.
both of these return double but take a const void * X โ€” bestie, void * is giving "we're not gonna talk about the type, just trust us" ๐Ÿ™ˆ and yes, the z in the name is literally in there, iykyk.
  • cblas_icamax ๐Ÿ‘‘ โ€” CBLAS_INDEX cblas_icamax (const CBLAS_INT N, const void * X, const CBLAS_INT incX) โ€” defined at line 12 of file cblas_icamax.c.
  • cblas_idamax ๐Ÿ‘‘ โ€” CBLAS_INDEX cblas_idamax (const CBLAS_INT N, const double * X, const CBLAS_INT incX) โ€” defined at line 12 of file cblas_idamax.c.
  • cblas_isamax ๐Ÿ‘‘ โ€” CBLAS_INDEX cblas_isamax (const CBLAS_INT N, const float * X, const CBLAS_INT incX) โ€” defined at line 12 of file cblas_isamax.c.
  • cblas_izamax ๐Ÿ‘‘ โ€” CBLAS_INDEX cblas_izamax (const CBLAS_INT N, const void * X, const CBLAS_INT incX) โ€” defined at line 12 of file cblas_izamax.c.

the four amax girlies all return CBLAS_INDEX and they all live at line 12 โ€” synchronized, choreographed, ate ๐Ÿ’– note the difference though: idamax takes const double *, isamax takes const float *, and icamax/izamax take const void *. do not mix them up, that's all I'm saying ๐Ÿ˜ญ


and now, the s section begins. say hi to the single-precision squad ๐ŸŒˆ

  • cblas_sasum ๐Ÿ“ โ€” float cblas_sasum (const CBLAS_INT N, const float * X, const CBLAS_INT incX) โ€” defined at line 12 of file cblas_sasum.c.
  • cblas_saxpy ๐Ÿ“ โ€” void cblas_saxpy (const CBLAS_INT N, const float alpha, const float * X, const CBLAS_INT incX, float * Y, const CBLAS_INT incY) โ€” defined at line 12 of file cblas_saxpy.c.
  • cblas_scabs1 ๐ŸŽ€ โ€” float cblas_scabs1 (const void * c) โ€” defined at line 9 of file cblas_scabs1.c.
hello?? cblas_scabs1 takes exactly ONE argument, a const void * c, returns a float, and sits all the way up at line 9. she's the shortest little icon in this whole list and honestly? main character energy, no notes โœจ
  • cblas_scasum โ€” float cblas_scasum (const CBLAS_INT N, const void * X, const CBLAS_INT incX) โ€” defined at line 12 of file cblas_scasum.c.
  • cblas_scnrm2 โ€” float cblas_scnrm2 (const CBLAS_INT N, const void * X, const CBLAS_INT incX) โ€” defined at line 12 of file cblas_scnrm2.c.
  • cblas_scopy ๐Ÿงš โ€” void cblas_scopy (const CBLAS_INT N, const float * X, const CBLAS_INT incX, float * Y, const CBLAS_INT incY) โ€” defined at line 11 of file cblas_scopy.c.
  • cblas_sdot ๐Ÿ’œ โ€” float cblas_sdot (const CBLAS_INT N, const float * X, const CBLAS_INT incX, const float * Y, const CBLAS_INT incY) โ€” defined at line 12 of file cblas_sdot.c.
  • cblas_sdsdot ๐Ÿ’œ โ€” float cblas_sdsdot (const CBLAS_INT N, const float alpha, const float * X, const CBLAS_INT incX, const float * Y, const CBLAS_INT incY) โ€” defined at line 12 of file cblas_sdsdot.c.

okay scopy is at line 11 while sdot and sdsdot are at line 12, and sdsdot is the one with the extra alpha in the middle. yes I'm counting line numbers, yes I have a spreadsheet, mind your business ๐Ÿ’…

  • cblas_sgbmv ๐ŸŒŠ โ€” void cblas_sgbmv (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const CBLAS_INT M, const CBLAS_INT N, const CBLAS_INT KL, const CBLAS_INT KU, const float alpha, const float * A, const CBLAS_INT lda, const float * X, const CBLAS_INT incX, const float beta, float * Y, const CBLAS_INT incY) โ€” defined at line 12 of file cblas_sgbmv.c.
  • cblas_sgemm ๐Ÿ”ฅ๐Ÿ‘‘ โ€” void cblas_sgemm (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB, const CBLAS_INT M, const CBLAS_INT N, const CBLAS_INT K, const float alpha, const float * A, const CBLAS_INT lda, const float * B, const CBLAS_INT ldb, const float beta, float * C, const CBLAS_INT ldc) โ€” defined at line 12 of file cblas_sgemm.c.
the way cblas_sgemm gets two CBLAS_TRANSPOSE params (TransA and TransB), three sizes (M, N, K), alpha and beta, and two output-ish matrices B and C... it's giving "I have a lot going on but I'm handling it" ๐Ÿ’€ iconic, periodt.
  • cblas_sgemmtr โญ โ€” void cblas_sgemmtr (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB, const CBLAS_INT N, const CBLAS_INT K, const float alpha, const float * A, const CBLAS_INT lda, const float * B, const CBLAS_INT ldb, const float beta, float * C, const CBLAS_INT ldc) โ€” defined at line 13 of file cblas_sgemmtr.c.
not to be dramatic but cblas_sgemmtr is the ONLY one in this whole batch defined at line 13 ๐Ÿ’€ everyone else is line 9, 10, 11 or 12 and this girl said "I need one extra line, I'm built different". also note she swapped M out for Uplo โ€” compare with sgemm before you assume anything, bestie ๐Ÿ™ˆ
  • cblas_sgemv ๐ŸŒธ โ€” void cblas_sgemv (const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, const CBLAS_INT M, const CBLAS_INT N, const float alpha, const float * A, const CBLAS_INT lda, const float * X, const CBLAS_INT incX, const float beta, float * Y, const CBLAS_INT incY) โ€” defined at line 11 of file cblas_sgemv.c.
tiny detail that matters, fr fr: cblas_sgemv has const on layout and TransA too โ€” const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA โ€” and again, line 11, not 12. copy it exactly, don't "clean it up" ๐Ÿ˜ญ
  • cblas_sger ๐ŸŒบ โ€” void cblas_sger (CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N, const float alpha, const float * X, const CBLAS_INT incX, const float * Y, const CBLAS_INT incY, float * A, const CBLAS_INT lda) โ€” defined at line 12 of file cblas_sger.c.
  • cblas_snrm2 โญ โ€” float cblas_snrm2 (const CBLAS_INT N, const float * X, const CBLAS_INT incX) โ€” defined at line 12 of file cblas_snrm2.c.
  • cblas_srot ๐ŸŒ€ โ€” void cblas_srot (const CBLAS_INT N, float * X, const CBLAS_INT incX, float * Y, const CBLAS_INT incY, const float c, const float s) โ€” defined at line 11 of file cblas_srot.c.
  • cblas_srotg ๐ŸŒ€ โ€” void cblas_srotg (float * a, float * b, float * c, float * s) โ€” defined at line 11 of file cblas_srotg.c.
  • cblas_srotm ๐ŸŒ€ โ€” void cblas_srotm (const CBLAS_INT N, float * X, const CBLAS_INT incX, float * Y, const CBLAS_INT incY, const float * P) โ€” defined at line 11 of file cblas_srotm.c.
  • cblas_srotmg ๐ŸŒ€ โ€” void cblas_srotmg (float * d1, float * d2, float * b1, const float b2, float * P) โ€” defined at line 11 of file cblas_srotmg.c.

okay the whole rot family is at line 11 and they're all a little unhinged in their own way: srot passes plain c and s by value, srotg passes pointers a, b, c, s, srotm takes a const float * P, and srotmg takes d1, d2, b1 as pointers plus b2 by value and P. ngl that's a lot of little letters, just copy them character for character ๐Ÿ™

  • cblas_ssbmv ๐Ÿฆ‹ โ€” void cblas_ssbmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N, const CBLAS_INT K, const float alpha, const float * A, const CBLAS_INT lda, const float * X, const CBLAS_INT incX, const float beta, float * Y, const CBLAS_INT incY) โ€” defined at line 11 of file cblas_ssbmv.c.
  • cblas_sscal ๐ŸŽ€ โ€” void cblas_sscal (const CBLAS_INT N, const float alpha, float * X, const CBLAS_INT incX) โ€” defined at line 11 of file cblas_sscal.c.
  • cblas_sspmv โ€” void cblas_sspmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N, const float alpha, const float * Ap, const float * X, const CBLAS_INT incX, const float beta, float * Y, const CBLAS_INT incY) โ€” defined at line 11 of file cblas_sspmv.c.
  • cblas_sspr โ€” void cblas_sspr (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N, const float alpha, const float * X, const CBLAS_INT incX, float * Ap) โ€” defined at line 12 of file cblas_sspr.c.
  • cblas_sspr2 โ€” void cblas_sspr2 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N, const float alpha, const float * X, const CBLAS_INT incX, const float * Y, const CBLAS_INT incY, float * A) โ€” defined at line 12 of file cblas_sspr2.c.
watch out on this one bestie ๐Ÿ˜ญ cblas_sspr2 takes float * A as its last param โ€” NOT Ap, even though its sibling cblas_sspr right above it takes float * Ap. different letter, different parameter, do not "fix" it, I'm begging ๐Ÿ’€
  • cblas_sswap ๐Ÿ”„ โ€” void cblas_sswap (const CBLAS_INT N, float * X, const CBLAS_INT incX, float * Y, const CBLAS_INT incY) โ€” defined at line 11 of file cblas_sswap.c.
  • cblas_ssymm ๐Ÿ’– โ€” void cblas_ssymm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo, const CBLAS_INT M, const CBLAS_INT N, const float alpha, const float * A, const CBLAS_INT lda, const float * B, const CBLAS_INT ldb, const float beta, float * C, const CBLAS_INT ldc) โ€” defined at line 12 of file cblas_ssymm.c.
  • cblas_ssymv ๐Ÿ’– โ€” void cblas_ssymv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N, const float alpha, const float * A, const CBLAS_INT lda, const float * X, const CBLAS_INT incX, const float beta, float * Y, const CBLAS_INT incY) โ€” defined at line 12 of file cblas_ssymv.c.
  • cblas_ssyr ๐ŸŒท โ€” void cblas_ssyr (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N, const float alpha, const float * X, const CBLAS_INT incX, float * A, const CBLAS_INT lda) โ€” defined at line 11 of file cblas_ssyr.c.
  • cblas_ssyr2 ๐ŸŒท โ€” void cblas_ssyr2 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N, const float alpha, const float * X, const CBLAS_INT incX, const float * Y, const CBLAS_INT incY, float * A, const CBLAS_INT lda) โ€” defined at line 12 of file cblas_ssyr2.c.

btw ssyr is line 11 and ssyr2 is line 12 โ€” one extra vector, one extra line, that's the pattern and I'm obsessed with the consistency ๐Ÿซถ

  • cblas_ssyr2k ๐ŸŽ€ โ€” void cblas_ssyr2k (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE Trans, const CBLAS_INT N, const CBLAS_INT K, const float alpha, const float * A, const CBLAS_INT lda, const float * B, const CBLAS_INT ldb, const float beta, float * C, const CBLAS_INT ldc) โ€” defined at line 12 of file cblas_ssyr2k.c.
  • cblas_ssyrk ๐ŸŽ€ โ€” void cblas_ssyrk (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE Trans, const CBLAS_INT N, const CBLAS_INT K, const float alpha, const float * A, const CBLAS_INT lda, const float beta, float * C, const CBLAS_INT ldc) โ€” defined at line 12 of file cblas_ssyrk.c.
  • cblas_stbmv โ€” void cblas_stbmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const float * A, const CBLAS_INT lda, float * X, const CBLAS_INT incX) โ€” defined at line 10 of file cblas_stbmv.c.
  • cblas_stbsv โ€” void cblas_stbsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const float * A, const CBLAS_INT lda, float * X, const CBLAS_INT incX) โ€” defined at line 10 of file cblas_stbsv.c.
  • cblas_stpmv ๐Ÿฆ‹ โ€” void cblas_stpmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const float * Ap, float * X, const CBLAS_INT incX) โ€” defined at line 11 of file cblas_stpmv.c.

and that's where this chunk lands bestie โ€” stbmv and stbsv are identical-looking twins down at line 10, then stpmv switches from A/lda/K to plain Ap and hops to line 11. the s girlies really said "we contain multitudes" ๐ŸŒˆ๐Ÿ’…

  • void cblas_stpsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const float * Ap, float * X, const CBLAS_INT incX) โ€” packed triangular solve, single precision ๐Ÿ’… defined at line 10 of cblas_stpsv.c.
  • void cblas_strmm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT M, const CBLAS_INT N, const float alpha, const float * A, const CBLAS_INT lda, float * B, const CBLAS_INT ldb) โ€” triangular matrix-matrix multiply, single precision โœจ defined at line 12 of cblas_strmm.c.
  • void cblas_strmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const float * A, const CBLAS_INT lda, float * X, const CBLAS_INT incX) โ€” triangular matrix-vector multiply, single precision ๐ŸŒธ defined at line 11 of cblas_strmv.c.
  • void cblas_strsm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT M, const CBLAS_INT N, const float alpha, const float * A, const CBLAS_INT lda, float * B, const CBLAS_INT ldb) โ€” triangular solve with multiple right-hand sides, single precision ๐ŸŽ€ defined at line 12 of cblas_strsm.c.
  • void cblas_strsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const float * A, const CBLAS_INT lda, float * X, const CBLAS_INT incX) โ€” triangular solve, single precision ๐Ÿ’– defined at line 10 of cblas_strsv.c.
  • void cblas_xerbla (CBLAS_INT p, const char * rout, const char * form, ...) โ€” the error-reporting bestie ๐Ÿ˜ญ defined at line 12 of cblas_xerbla.c.
  • void cblas_zaxpy (const CBLAS_INT N, const void * alpha, const void * X, const CBLAS_INT incX, void * Y, const CBLAS_INT incY) โ€” double-complex y := alpha*x + y, the glow-up of the century ๐Ÿ”ฅ defined at line 11 of cblas_zaxpy.c.
  • void cblas_zcopy (const CBLAS_INT N, const void * X, const CBLAS_INT incX, void * Y, const CBLAS_INT incY) โ€” double-complex copy, y := x no cap ๐Ÿฆ‹ defined at line 11 of cblas_zcopy.c.
  • void cblas_zdotc_sub (const CBLAS_INT N, const void * X, const CBLAS_INT incX, const void * Y, const CBLAS_INT incY, void * dotc) โ€” double-complex conjugated dot product, result into dotc ๐Ÿ’œ defined at line 12 of cblas_zdotc_sub.c.
  • void cblas_zdotu_sub (const CBLAS_INT N, const void * X, const CBLAS_INT incX, const void * Y, const CBLAS_INT incY, void * dotu) โ€” double-complex unconjugated dot product, result into dotu ๐Ÿ’œ defined at line 12 of cblas_zdotu_sub.c.
  • void cblas_zdrot (const CBLAS_INT N, void * X, const CBLAS_INT incX, void * Y, const CBLAS_INT incY, const double c, const double s) โ€” double-complex plane rotation, bestie โœจ defined at line 9 of cblas_zdrot.c.
  • void cblas_zdscal (const CBLAS_INT N, const double alpha, void * X, const CBLAS_INT incX) โ€” double-complex vector scaled by a real double, iconic ๐ŸŒˆ defined at line 11 of cblas_zdscal.c.
  • void cblas_zgbmv (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const CBLAS_INT M, const CBLAS_INT N, const CBLAS_INT KL, const CBLAS_INT KU, const void * alpha, const void * A, const CBLAS_INT lda, const void * X, const CBLAS_INT incX, const void * beta, void * Y, const CBLAS_INT incY) โ€” double-complex general banded matrix-vector multiply ๐Ÿซถ defined at line 12 of cblas_zgbmv.c.
  • void cblas_zgemm (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB, const CBLAS_INT M, const CBLAS_INT N, const CBLAS_INT K, const void * alpha, const void * A, const CBLAS_INT lda, const void * B, const CBLAS_INT ldb, const void * beta, void * C, const CBLAS_INT ldc) โ€” the double-complex general matrix-matrix multiply, main character energy ๐Ÿ‘‘ defined at line 12 of cblas_zgemm.c.
  • void cblas_zgemmtr (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB, const CBLAS_INT N, const CBLAS_INT K, const void * alpha, const void * A, const CBLAS_INT lda, const void * B, const CBLAS_INT ldb, const void * beta, void * C, const CBLAS_INT ldc) โ€” double-complex triangular matrix-matrix multiply, slay ๐Ÿ’… defined at line 12 of cblas_zgemmtr.c.
  • void cblas_zgemv (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const CBLAS_INT M, const CBLAS_INT N, const void * alpha, const void * A, const CBLAS_INT lda, const void * X, const CBLAS_INT incX, const void * beta, void * Y, const CBLAS_INT incY) โ€” double-complex general matrix-vector multiply ๐ŸŒŸ defined at line 12 of cblas_zgemv.c.
  • void cblas_zgerc (CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N, const void * alpha, const void * X, const CBLAS_INT incX, const void * Y, const CBLAS_INT incY, void * A, const CBLAS_INT lda) โ€” double-complex conjugated rank-1 update ๐ŸŽ€ defined at line 12 of cblas_zgerc.c.
  • void cblas_zgeru (CBLAS_LAYOUT layout, const CBLAS_INT M, const CBLAS_INT N, const void * alpha, const void * X, const CBLAS_INT incX, const void * Y, const CBLAS_INT incY, void * A, const CBLAS_INT lda) โ€” double-complex unconjugated rank-1 update ๐ŸŽ€ defined at line 10 of cblas_zgeru.c.
  • void cblas_zhbmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N, const CBLAS_INT K, const void * alpha, const void * A, const CBLAS_INT lda, const void * X, const CBLAS_INT incX, const void * beta, void * Y, const CBLAS_INT incY) โ€” double-complex Hermitian banded matrix-vector multiply ๐Ÿ’œ defined at line 12 of cblas_zhbmv.c.
  • void cblas_zhemm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo, const CBLAS_INT M, const CBLAS_INT N, const void * alpha, const void * A, const CBLAS_INT lda, const void * B, const CBLAS_INT ldb, const void * beta, void * C, const CBLAS_INT ldc) โ€” double-complex Hermitian matrix-matrix multiply, obsessed ๐Ÿ˜ป defined at line 12 of cblas_zhemm.c.
  • void cblas_zhemv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N, const void * alpha, const void * A, const CBLAS_INT lda, const void * X, const CBLAS_INT incX, const void * beta, void * Y, const CBLAS_INT incY) โ€” double-complex Hermitian matrix-vector multiply ๐Ÿ’œ defined at line 12 of cblas_zhemv.c.
  • void cblas_zher (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N, const double alpha, const void * X, const CBLAS_INT incX, void * A, const CBLAS_INT lda) โ€” double-complex Hermitian rank-1 update, real alpha bestie ๐ŸŒธ defined at line 12 of cblas_zher.c.
  • void cblas_zher2 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N, const void * alpha, const void * X, const CBLAS_INT incX, const void * Y, const CBLAS_INT incY, void * A, const CBLAS_INT lda) โ€” double-complex Hermitian rank-2 update โœจ defined at line 12 of cblas_zher2.c.
  • void cblas_zher2k (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE Trans, const CBLAS_INT N, const CBLAS_INT K, const void * alpha, const void * A, const CBLAS_INT lda, const void * B, const CBLAS_INT ldb, const double beta, void * C, const CBLAS_INT ldc) โ€” double-complex Hermitian rank-2k update, note the real double beta ๐Ÿ”ฅ defined at line 12 of cblas_zher2k.c.
  • void cblas_zherk (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE Trans, const CBLAS_INT N, const CBLAS_INT K, const double alpha, const void * A, const CBLAS_INT lda, const double beta, void * C, const CBLAS_INT ldc) โ€” double-complex Hermitian rank-k update, both alpha and beta are real doubles ๐ŸŽ€ defined at line 12 of cblas_zherk.c.
  • void cblas_zhpmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N, const void * alpha, const void * Ap, const void * X, const CBLAS_INT incX, const void * beta, void * Y, const CBLAS_INT incY) โ€” double-complex Hermitian packed matrix-vector multiply ๐Ÿฆ‹ defined at line 12 of cblas_zhpmv.c.
  • void cblas_zhpr (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N, const double alpha, const void * X, const CBLAS_INT incX, void * A) โ€” double-complex Hermitian packed rank-1 update, real alpha again ๐Ÿ’– defined at line 12 of cblas_zhpr.c.
  • void cblas_zhpr2 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const CBLAS_INT N, const void * alpha, const void * X, const CBLAS_INT incX, const void * Y, const CBLAS_INT incY, void * Ap) โ€” double-complex Hermitian packed rank-2 update ๐ŸŒบ defined at line 12 of cblas_zhpr2.c.
  • void cblas_zrotg (void * a, void * b, double * c, void * s) โ€” double-complex Givens rotation generator, cute little four-arg icon ๐Ÿงš defined at line 9 of cblas_zrotg.c.
  • void cblas_zscal (const CBLAS_INT N, const void * alpha, void * X, const CBLAS_INT incX) โ€” double-complex vector scale by a complex alpha ๐Ÿ’… defined at line 11 of cblas_zscal.c.
  • void cblas_zswap (const CBLAS_INT N, void * X, const CBLAS_INT incX, void * Y, const CBLAS_INT incY) โ€” double-complex swap, trading places fr fr ๐Ÿ”„ defined at line 11 of cblas_zswap.c.
  • void cblas_zsymm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo, const CBLAS_INT M, const CBLAS_INT N, const void * alpha, const void * A, const CBLAS_INT lda, const void * B, const CBLAS_INT ldb, const void * beta, void * C, const CBLAS_INT ldc) โ€” double-complex symmetric matrix-matrix multiply ๐Ÿ‘‘ defined at line 12 of cblas_zsymm.c.
  • void cblas_zsyr2k (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE Trans, const CBLAS_INT N, const CBLAS_INT K, const void * alpha, const void * A, const CBLAS_INT lda, const void * B, const CBLAS_INT ldb, const void * beta, void * C, const CBLAS_INT ldc) โ€” double-complex symmetric rank-2k update, complex beta this time ๐Ÿซถ defined at line 12 of cblas_zsyr2k.c.
  • void cblas_zsyrk (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE Trans, const CBLAS_INT N, const CBLAS_INT K, const void * alpha, const void * A, const CBLAS_INT lda, const void * beta, void * C, const CBLAS_INT ldc) โ€” double-complex symmetric rank-k update โœจ defined at line 12 of cblas_zsyrk.c.
  • void cblas_ztbmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const void * A, const CBLAS_INT lda, void * X, const CBLAS_INT incX) โ€” double-complex triangular banded matrix-vector multiply ๐Ÿ’œ defined at line 10 of cblas_ztbmv.c.
  • void cblas_ztbsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const CBLAS_INT K, const void * A, const CBLAS_INT lda, void * X, const CBLAS_INT incX) โ€” double-complex triangular banded solve ๐ŸŒธ defined at line 10 of cblas_ztbsv.c.
  • void cblas_ztpmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const void * Ap, void * X, const CBLAS_INT incX) โ€” double-complex triangular packed matrix-vector multiply ๐ŸŽ€ defined at line 10 of cblas_ztpmv.c.
  • void cblas_ztpsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const void * Ap, void * X, const CBLAS_INT incX) โ€” double-complex triangular packed solve ๐Ÿฆ‹ defined at line 10 of cblas_ztpsv.c.
  • void cblas_ztrmm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT M, const CBLAS_INT N, const void * alpha, const void * A, const CBLAS_INT lda, void * B, const CBLAS_INT ldb) โ€” double-complex triangular matrix-matrix multiply, go off ๐Ÿ”ฅ defined at line 12 of cblas_ztrmm.c.
  • void cblas_ztrmv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const void * A, const CBLAS_INT lda, void * X, const CBLAS_INT incX) โ€” double-complex triangular matrix-vector multiply ๐Ÿงš defined at line 10 of cblas_ztrmv.c.
  • void cblas_ztrsm (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT M, const CBLAS_INT N, const void * alpha, const void * A, const CBLAS_INT lda, void * B, const CBLAS_INT ldb) โ€” double-complex triangular solve with multiple right-hand sides ๐Ÿ‘‘ defined at line 12 of cblas_ztrsm.c.
  • void cblas_ztrsv (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const CBLAS_INT N, const void * A, const CBLAS_INT lda, void * X, const CBLAS_INT incX) โ€” double-complex triangular solve, the final boss of this list ๐Ÿ’€ defined at line 10 of cblas_ztrsv.c.

๐ŸŒˆ AUTHOR ๐ŸŒˆ

Generated automatically by Doxygen for LAPACK from the source code. Not a human, not a vibe, just a tool doing its thing ๐Ÿค–โœจ


Okay bestie, that's the whole page โ€” every single cblas_ function from s all the way through z, all accounted for, no crumbs left behind ๐Ÿ’… The page you're reading is CBLAS/include/cblas.h(3) from LAPACK Version 3.12.0 โ€” cite it, love it, link it ๐Ÿซถ Now go forth and call your BLAS routines with confidence, you absolute icon ๐Ÿ‘‘๐Ÿ’–

๐Ÿ“ฆ where this page comes from