CBLAS_ZHPR_64(3)
π CBLAS/include/cblas_64.h β Library Functions Manual, section 3 π
okay bestie, listen up π this one's a header file, and yes she's that girl. Full path, exactly as she comes: CBLAS/include/cblas_64.h. She lives in the Library Functions Manual and she's section 3, so she's officially in the library-functions club π no cap, that's the whole vibe check.
β¨ NAME β¨
CBLAS/include/cblas_64.h β that's the name, that's the whole name, and we're not adding anything to it π«Ά literally just the path, forehead kiss, moving on.
πΈ SYNOPSIS πΈ
so here's how you slide into her DMs β you pull in these three headers first, in this exact order, no freestyling:
#include <stddef.h>
#include <stdint.h>
#include <inttypes.h>
and then, the main character herself π
#include 'cblas.h'
bestie, real talk: those first three are angle-bracket includes and that last one is a quoted include β 'cblas.h' β so don't go "fixing" it into angle brackets, iykyk π copy it exactly, character for character, because that's how she's written and we respect the source π
that's the opener, and there's so much more coming β do not touch that dial π¦β¨
π« Functions π«
okay bestie, this is the part where the page just starts listing every single function in cblas_64.h and honestly? it's a lot. every int64_t you see is the whole point of this header β the _64 suffix means those bad boys are 64-bit ints, and the plain float/double types are doing their usual thing. take a breath, we're going through all of them πΈ
double cblas_dcabs1_64 (const void *z)β hands you back adouble, takes a singleconst void *z. that's it, that's the whole vibe check.float cblas_scabs1_64 (const void *c)β same energy as the one above butfloatand aconst void *c. tiny, cute, doing its job β¨float cblas_sdsdot_64 (const int64_t N, const float alpha, const float *X, const int64_t incX, const float *Y, const int64_t incY)β thesdsdotvariant,floatreturn, and yes it's got analphain there alongsideN,X,incX,Y,incY.double cblas_dsdot_64 (const int64_t N, const float *X, const int64_t incX, const float *Y, const int64_t incY)β same crew of args minus thealpha, and it comes back as adouble. glow up πfloat cblas_sdot_64 (const int64_t N, const float *X, const int64_t incX, const float *Y, const int64_t incY)β the classic:N, twofloatpointersXandY, twoincX/incYstrides,floatresult.double cblas_ddot_64 (const int64_t N, const double *X, const int64_t incX, const double *Y, const int64_t incY)β identical shape, but everything'sdoublenow. main character energy π₯void cblas_cdotu_sub_64 (const int64_t N, const void *X, const int64_t incX, const void *Y, const int64_t incY, void *dotu)β returnsvoidand writes into that lastvoid *dotu. note the_subin the name, bestie, it's not giving you a return value.void cblas_cdotc_sub_64 (const int64_t N, const void *X, const int64_t incX, const void *Y, const int64_t incY, void *dotc)β exact same lineup, but the output pointer isvoid *dotc. π¦void cblas_zdotu_sub_64 (const int64_t N, const void *X, const int64_t incX, const void *Y, const int64_t incY, void *dotu)β thezversion,voidreturn, results land invoid *dotu.void cblas_zdotc_sub_64 (const int64_t N, const void *X, const int64_t incX, const void *Y, const int64_t incY, void *dotc)β and here's its sibling withvoid *dotc. matching set, obsessed πfloat cblas_snrm2_64 (const int64_t N, const float *X, const int64_t incX)βfloatback out, justN,const float *X,incXgoing in. tidy.float cblas_sasum_64 (const int64_t N, const float *X, const int64_t incX)β same three args, samefloatreturn. the way thatincXkeeps showing up πdouble cblas_dnrm2_64 (const int64_t N, const double *X, const int64_t incX)β same shape,double *X,doubleresult.double cblas_dasum_64 (const int64_t N, const double *X, const int64_t incX)βN,const double *X,incX, and adoubleat the end. periodt.float cblas_scnrm2_64 (const int64_t N, const void *X, const int64_t incX)β nowXis aconst void *and the return is stillfloat. πfloat cblas_scasum_64 (const int64_t N, const void *X, const int64_t incX)β sameconst void *Xtreatment,floatreturn.double cblas_dznrm2_64 (const int64_t N, const void *X, const int64_t incX)βdoubleversion of thevoid *situation. love that for us.double cblas_dzasum_64 (const int64_t N, const void *X, const int64_t incX)β and its matchingdouble-returning twin. π
okay now we're getting into the index-returning ones and the return type changes, so keep your eyes on the CBLAS_INDEX bestie π
CBLAS_INDEX cblas_isamax_64 (const int64_t N, const float *X, const int64_t incX)β returnsCBLAS_INDEX, not a float, not a double, an index.const float *Xin,incXalongside.CBLAS_INDEX cblas_idamax_64 (const int64_t N, const double *X, const int64_t incX)β sameCBLAS_INDEXreturn, butconst double *Xthis time. βCBLAS_INDEX cblas_icamax_64 (const int64_t N, const void *X, const int64_t incX)βCBLAS_INDEXout,const void *Xin. iconic.CBLAS_INDEX cblas_izamax_64 (const int64_t N, const void *X, const int64_t incX)β thezedition, identical args, identicalCBLAS_INDEXreturn. π«Άvoid cblas_sswap_64 (const int64_t N, float *X, const int64_t incX, float *Y, const int64_t incY)β note:XandYare non-constfloat *here, because yes, this one's touching both of them.voidreturn, no receipts.void cblas_scopy_64 (const int64_t N, const float *X, const int64_t incX, float *Y, const int64_t incY)β sourceXisconst, destinationYis not. the asymmetry is the whole point πvoid cblas_saxpy_64 (const int64_t N, const float alpha, const float *X, const int64_t incX, float *Y, const int64_t incY)βfloat alphaslides in third, then constX, then non-constY.void cblas_dswap_64 (const int64_t N, double *X, const int64_t incX, double *Y, const int64_t incY)β thedoubleswap, same non-const both-sides energy.void cblas_dcopy_64 (const int64_t N, const double *X, const int64_t incX, double *Y, const int64_t incY)βconst double *Xβdouble *Y. chef's kiss π₯void cblas_daxpy_64 (const int64_t N, const double alpha, const double *X, const int64_t incX, double *Y, const int64_t incY)βdouble alphain the third slot, everything elsedouble-ified.void cblas_cswap_64 (const int64_t N, void *X, const int64_t incX, void *Y, const int64_t incY)β bothvoid *, both mutable. noconstin sight, be aware π«£void cblas_ccopy_64 (const int64_t N, const void *X, const int64_t incX, void *Y, const int64_t incY)β hereXisconst void *andYis plainvoid *. balanced.void cblas_caxpy_64 (const int64_t N, const void *alpha, const void *X, const int64_t incX, void *Y, const int64_t incY)βalphacomes in asconst void *. yes, a pointer, not a number. read it again, it's fine πvoid cblas_zswap_64 (const int64_t N, void *X, const int64_t incX, void *Y, const int64_t incY)βzswap,void *city.void cblas_zcopy_64 (const int64_t N, const void *X, const int64_t incX, void *Y, const int64_t incY)β const source, mutable dest. the classic combo πΈvoid cblas_zaxpy_64 (const int64_t N, const void *alpha, const void *X, const int64_t incX, void *Y, const int64_t incY)β pointeralphaagain.void *everything,voidreturn, we move. π
void cblas_srotmg_64 (float *d1, float *d2, float *b1, const float b2, float *P)β noN, noincXβ just five float things:d1,d2,b1, the loneconst float b2, andP. also hi,Pis uppercase here πvoid cblas_srotm_64 (const int64_t N, float *X, const int64_t incX, float *Y, const int64_t incY, const float *P)β and herePis aconst float *. different P energy, don't mix them up bestie.void cblas_drotmg_64 (double *d1, double *d2, double *b1, const double b2, double *P)β thedoubleglow-up ofrotmg. same five-slot layout.void cblas_drotm_64 (const int64_t N, double *X, const int64_t incX, double *Y, const int64_t incY, const double *P)βdoubleeverything and aconst double *Pat the end. βvoid cblas_sscal_64 (const int64_t N, const float alpha, float *X, const int64_t incX)βalphasecond,float *Xthird,incXlast. small but mighty.void cblas_dscal_64 (const int64_t N, const double alpha, double *X, const int64_t incX)β same butdouble. consistent queen πvoid cblas_cscal_64 (const int64_t N, const void *alpha, void *X, const int64_t incX)β pointeralphaagain,void *Xmutable.void cblas_zscal_64 (const int64_t N, const void *alpha, void *X, const int64_t incX)βzversion, exactly the same shape. π¦void cblas_csscal_64 (const int64_t N, const float alpha, void *X, const int64_t incX)β sneaky one:alphais a plainfloathere, not a pointer. catch it.void cblas_zdscal_64 (const int64_t N, const double alpha, void *X, const int64_t incX)β and this one takes a plaindouble alpha. matching set πvoid cblas_srotg_64 (float *a, float *b, float *c, float *s)β four lowercase pointer args:a,b,c,s. that's the whole signature, noNinvited.void cblas_drotg_64 (double *a, double *b, double *c, double *s)β same four, alldouble. β¨void cblas_crotg_64 (void *a, void *b, float *c, void *s)β okay look closely:cis afloat *whilea,b,sarevoid *. don't flatten them in your head π«Άvoid cblas_zrotg_64 (void *a, void *b, double *c, void *s)β and herecisdouble *, othersvoid *. same deal, different precision.void cblas_srot_64 (const int64_t N, float *X, const int64_t incX, float *Y, const int64_t incY, const float c, const float s)β and now lowercasecandsare trailing values, not pointers. yes,rotandrotgare different vibes, keep up bestie πvoid cblas_drot_64 (const int64_t N, double *X, const int64_t incX, double *Y, const int64_t incY, const double c, const double s)βdoubleeverything, trailingconst double c,const double s.void cblas_csrot_64 (const int64_t N, void *X, const int64_t incX, void *Y, const int64_t incY, const float c, const float s)βvoid *X and Y, butcandsarefloat. hybrid moment π₯void cblas_zdrot_64 (const int64_t N, void *X, const int64_t incX, void *Y, const int64_t incY, const double c, const double s)β same, exceptcandsaredouble. π
okay now the matrix-vector zone, where the argument lists get long and layout/TransA/Uplo/Diag enter the chat. deep breath, we're doing all of them π
void cblas_sgemv_64 (const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, const int64_t M, const int64_t N, const float alpha, const float *A, const int64_t lda, const float *X, const int64_t incX, const float beta, float *Y, const int64_t incY)β twelve args and not a single one is optional.layout,TransA,M,N,alpha,A,lda,X,incX,beta,Y,incY. copy it exactly, no heroics.void cblas_sgbmv_64 (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const int64_t M, const int64_t N, const int64_t KL, const int64_t KU, const float alpha, const float *A, const int64_t lda, const float *X, const int64_t incX, const float beta, float *Y, const int64_t incY)β thebversion, soKLandKUjoin betweenNandalpha. also notelayoutandTransAdrop theirconsthere πvoid cblas_strmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const float *A, const int64_t lda, float *X, const int64_t incX)β now it'sUploandDiagtoo, and notice there's noM, noalpha, nobeta. different beast.void cblas_stbmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const int64_t K, const float *A, const int64_t lda, float *X, const int64_t incX)βtbmvmeansinterspersedKright afterN, followed byA,lda,X,incX`.void cblas_stpmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const float *Ap, float *X, const int64_t incX)β packed version! the arg isAp(little p, bestie,ApnotA) and there's noldaorKto be found.void cblas_strsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const float *A, const int64_t lda, float *X, const int64_t incX)β identical clothes tostrmv, but it's a solve. read the name, not the shape πvoid cblas_stbsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const int64_t K, const float *A, const int64_t lda, float *X, const int64_t incX)β the solve withKwedged in afterN. yes, exactly likestbmvbuts vat the end.void cblas_stpsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const float *Ap, float *X, const int64_t incX)β packed solve.Ap,X,incX, done. πvoid cblas_dgemv_64 (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const int64_t M, const int64_t N, const double alpha, const double *A, const int64_t lda, const double *X, const int64_t incX, const double beta, double *Y, const int64_t incY)β thedoublegemv, twelve args of pure commitment.void cblas_dgbmv_64 (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const int64_t M, const int64_t N, const int64_t KL, const int64_t KU, const double alpha, const double *A, const int64_t lda, const double *X, const int64_t incX, const double beta, double *Y, const int64_t incY)βKL/KUback in the middle plusdoubleeverything else.void cblas_dtrmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const double *A, const int64_t lda, double *X, const int64_t incX)βUplo+Diag+double, noM, no Greek letters. β¨void cblas_dtbmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const int64_t K, const double *A, const int64_t lda, double *X, const int64_t incX)βKafterN,double *A,lda,double *X,incX.void cblas_dtpmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const double *Ap, double *X, const int64_t incX)β packed anddouble-coded.Apwith the lowercasep, always.void cblas_dtrsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const double *A, const int64_t lda, double *X, const int64_t incX)βd+tr+sv, the solve, same list asdtrmv. πvoid cblas_dtbsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const int64_t K, const double *A, const int64_t lda, double *X, const int64_t incX)βKpresent,doublepresent, solve present. all accounted for.void cblas_dtpsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const double *Ap, double *X, const int64_t incX)β packeddoublesolve, short and sweet. π§void cblas_cgemv_64 (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const int64_t M, const int64_t N, const void *alpha, const void *A, const int64_t lda, const void *X, const int64_t incX, const void *beta, void *Y, const int64_t incY)βcmeans the scalars and vectors arevoid *now.alphaconst,betaconst,Ythe only mutable one in the party πvoid cblas_cgbmv_64 (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const int64_t M, const int64_t N, const int64_t KL, const int64_t KU, const void *alpha, const void *A, const int64_t lda, const void *X, const int64_t incX, const void *beta, void *Y, const int64_t incY)β plusKLandKU, because of course.void cblas_ctrmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const void *A, const int64_t lda, void *X, const int64_t incX)βconst void *Ain,void *Xout,UploandDiagalong for the ride.void cblas_ctbmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const int64_t K, const void *A, const int64_t lda, void *X, const int64_t incX)βKafterN,void *forAandX. πvoid cblas_ctpmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const void *Ap, void *X, const int64_t incX)β packed,Ap, nolda. π¦void cblas_ctrsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const void *A, const int64_t lda, void *X, const int64_t incX)β thecsolve,const void *Aβvoid *X.void cblas_ctbsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const int64_t K, const void *A, const int64_t lda, void *X, const int64_t incX)β bandedcsolve,Kincluded, all the usuals.void cblas_ctpsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const void *Ap, void *X, const int64_t incX)β packedcsolve. shortest of the bunch, still slays. βvoid cblas_zgemv_64 (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const int64_t M, const int64_t N, const void *alpha, const void *A, const int64_t lda, const void *X, const int64_t incX, const void *beta, void *Y, const int64_t incY)βzflavour,void *everything, twelve args, same deal ascbut you know it's the fancy one πvoid cblas_zgbmv_64 (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const int64_t M, const int64_t N, const int64_t KL, const int64_t KU,β and the page justβ¦ stops mid-signature right here π thezgbmventry is cut off afterKUin this chunk, so we pick it back up next part. don't panic, it's not you, it's the page π«Ά
β¦and we're literally starting this part mid-signature, bestie, because that's just how long this list is. Here's the tail of the prototype from last time (you know the one β¨):
const void *alpha, const void *A, const int64_t lda, const void *X,
const int64_t incX, const void *beta, void *Y, const int64_t incY)
Cool cool cool, moving on π«Ά
π¦ the complex triangular girlies (vector edition)
Same vibe check every time:layout,Uplo,TransA,Diag,N, the matrix,lda, the vectorX, andincX. Spotted. Noted. Slay.
void cblas_ztrmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const void
*A, const int64_t lda, void *X, const int64_t incX)
void cblas_ztbmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const
int64_t K, const void *A, const int64_t lda, void *X, const int64_t
incX)
void cblas_ztpmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const void
*Ap, void *X, const int64_t incX)
void cblas_ztrsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const void
*A, const int64_t lda, void *X, const int64_t incX)
void cblas_ztbsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const
int64_t K, const void *A, const int64_t lda, void *X, const int64_t
incX)
void cblas_ztpsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const void
*Ap, void *X, const int64_t incX)
Notice the mv ones (*trmv, *tbmv, *tpmv) and the sv ones (*trsv, *tbsv, *tpsv) are siblings, and the three flavours are the same three flavours every time: full (tr), banded (tb, extra K π), packed (tp, that Ap instead of A + lda). Iconic consistency, honestly.
π single precision, symmetric era
void cblas_ssymv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const float alpha, const float *A, const int64_t lda, const float
*X, const int64_t incX, const float beta, float *Y, const int64_t
incY)
void cblas_ssbmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const int64_t K, const float alpha, const float *A, const int64_t
lda, const float *X, const int64_t incX, const float beta, float *Y,
const int64_t incY)
void cblas_sspmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const float alpha, const float *Ap, const float *X, const int64_t
incX, const float beta, float *Y, const int64_t incY)
void cblas_sger_64 (CBLAS_LAYOUT layout, const int64_t M, const int64_t
N, const float alpha, const float *X, const int64_t incX, const
float *Y, const int64_t incY, float *A, const int64_t lda)
void cblas_ssyr_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const float alpha, const float *X, const int64_t incX, float *A,
const int64_t lda)
void cblas_sspr_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const float alpha, const float *X, const int64_t incX, float *Ap)
void cblas_ssyr2_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const float alpha, const float *X, const int64_t incX, const
float *Y, const int64_t incY, float *A, const int64_t lda)
void cblas_sspr2_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const float alpha, const float *X, const int64_t incX, const
float *Y, const int64_t incY, float *A)
the way that ssymv / ssbmv / sspmv all take alpha, X, incX, beta, Y, incY and only differ in how the matrix shows up (*A + lda, *A + lda + K, *Ap) β main character energy from all three tbh π
And the rank-updates are out here doing the most: sger takes M and N (it's a rectangle situation), while ssyr, sspr, ssyr2, sspr2 are square-coded with just N and a Uplo. Two vectors for the 2 ones (X and Y, each with their own incX / incY), one vector for the rest. Also note sspr2_64 writes into *A, not *Ap β that's literally what the prototype says, don't come for me π.
π§ double precision, same energy, more bytes
void cblas_dsymv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const double alpha, const double *A, const int64_t lda, const
double *X, const int64_t incX, const double beta, double *Y, const
int64_t incY)
void cblas_dsbmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const int64_t K, const double alpha, const double *A, const
int64_t lda, const double *X, const int64_t incX, const double beta,
double *Y, const int64_t incY)
void cblas_dspmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const double alpha, const double *Ap, const double *X, const
int64_t incX, const double beta, double *Y, const int64_t incY)
void cblas_dger_64 (CBLAS_LAYOUT layout, const int64_t M, const int64_t
N, const double alpha, const double *X, const int64_t incX, const
double *Y, const int64_t incY, double *A, const int64_t lda)
void cblas_dsyr_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const double alpha, const double *X, const int64_t incX, double
*A, const int64_t lda)
void cblas_dspr_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const double alpha, const double *X, const int64_t incX, double
*Ap)
void cblas_dsyr2_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const double alpha, const double *X, const int64_t incX, const
double *Y, const int64_t incY, double *A, const int64_t lda)
void cblas_dspr2_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const double alpha, const double *X, const int64_t incX, const
double *Y, const int64_t incY, double *A)
fr fr it's the exact same shape as the s block, just double everywhere instead of float. iykyk πΈ
π complex, Hermitian-adjacent, doing the absolute most
void cblas_chemv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const void *alpha, const void *A, const int64_t lda, const void
*X, const int64_t incX, const void *beta, void *Y, const int64_t
incY)
void cblas_chbmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const int64_t K, const void *alpha, const void *A, const int64_t
lda, const void *X, const int64_t incX, const void *beta, void *Y,
const int64_t incY)
void cblas_chpmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const void *alpha, const void *Ap, const void *X, const int64_t
incX, const void *beta, void *Y, const int64_t incY)
void cblas_cgeru_64 (CBLAS_LAYOUT layout, const int64_t M, const int64_t
N, const void *alpha, const void *X, const int64_t incX, const void
*Y, const int64_t incY, void *A, const int64_t lda)
void cblas_cgerc_64 (CBLAS_LAYOUT layout, const int64_t M, const int64_t
N, const void *alpha, const void *X, const int64_t incX, const void
*Y, const int64_t incY, void *A, const int64_t lda)
void cblas_cher_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const float alpha, const void *X, const int64_t incX, void *A,
const int64_t lda)
void cblas_chpr_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const float alpha, const void *X, const int64_t incX, void *A)
void cblas_cher2_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const void *alpha, const void *X, const int64_t incX, const void
*Y, const int64_t incY, void *A, const int64_t lda)
void cblas_chpr2_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const void *alpha, const void *X, const int64_t incX, const void
*Y, const int64_t incY, void *Ap)
π stayed up late noticing this:cblas_cher_64andcblas_chpr_64take a plainconst float alpha, notconst void *alphalike all their friends. That's not a typo on my end, bestie β that's exactly what the page says. Same deal forzher/zhprbelow, which takeconst double alpha. Write it down, it matters.
Also the ger pair is giving twins-not-twins: cgeru and cgerc, literally identical signatures, one letter apart. And chpr_64 writes into void *A, while chpr2_64 writes into void *Ap β again, that's the page, not me π₯
π double complex, no skips, no shortcuts
void cblas_zhemv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const void *alpha, const void *A, const int64_t lda, const void
*X, const int64_t incX, const void *beta, void *Y, const int64_t
incY)
void cblas_zhbmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const int64_t K, const void *alpha, const void *A, const int64_t
lda, const void *X, const int64_t incX, const void *beta, void *Y,
const int64_t incY)
void cblas_zhpmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const void *alpha, const void *Ap, const void *X, const int64_t
incX, const void *beta, void *Y, const int64_t incY)
void cblas_zgeru_64 (CBLAS_LAYOUT layout, const int64_t M, const int64_t
N, const void *alpha, const void *X, const int64_t incX, const void
*Y, const int64_t incY, void *A, const int64_t lda)
void cblas_zgerc_64 (CBLAS_LAYOUT layout, const int64_t M, const int64_t
N, const void *alpha, const void *X, const int64_t incX, const void
*Y, const int64_t incY, void *A, const int64_t lda)
void cblas_zher_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const double alpha, const void *X, const int64_t incX, void *A,
const int64_t lda)
void cblas_zhpr_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const double alpha, const void *X, const int64_t incX, void *A)
void cblas_zher2_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const void *alpha, const void *X, const int64_t incX, const void
*Y, const int64_t incY, void *A, const int64_t lda)
void cblas_zhpr2_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t
N, const void *alpha, const void *X, const int64_t incX, const void
*Y, const int64_t incY, void *Ap)
Mirror mirror of the c block, but the scalars became double. No notes, ate π
β and now: the level-3 section, where things get SPICY
void cblas_sgemm_64 (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA,
CBLAS_TRANSPOSE TransB, const int64_t M, const int64_t N, const
int64_t K, const float alpha, const float *A, const int64_t lda,
const float *B, const int64_t ldb, const float beta, float *C, const
int64_t ldc)
void cblas_sgemmtr_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB, const int64_t N,
const int64_t K, const float alpha, const float *A, const int64_t
lda, const float *B, const int64_t ldb, const float beta, float *C,
const int64_t ldc)
void cblas_ssymm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO
Uplo, const int64_t M, const int64_t N, const float alpha, const
float *A, const int64_t lda, const float *B, const int64_t ldb,
const float beta, float *C, const int64_t ldc)
void cblas_ssyrk_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, const float
alpha, const float *A, const int64_t lda, const float beta, float
*C, const int64_t ldc)
void cblas_ssyr2k_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, const float
alpha, const float *A, const int64_t lda, const float *B, const
int64_t ldb, const float beta, float *C, const int64_t ldc)
void cblas_strmm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO
Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t M,
const int64_t N, const float alpha, const float *A, const int64_t
lda, float *B, const int64_t ldb)
void cblas_strsm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO
Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t M,
const int64_t N, const float alpha, const float *A, const int64_t
lda, float *B, const int64_t ldb)
okay so two things, bestie, and they're both real:
cblas_sgemmtr_64takesUplowherecblas_sgemm_64takesTransB, and it hasN/Kinstead ofM/N/K. Not a typo. Copy it exactly. πstrmm/strsmare the ones that take bothCBLAS_SIDE SideandCBLAS_DIAG Diag, and their output goes intofloat *B, const int64_t ldbβ no separateC/ldcat all. Different breed, honestly.
π₯ double precision level-3, we're SO close
void cblas_dgemm_64 (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA,
CBLAS_TRANSPOSE TransB, const int64_t M, const int64_t N, const
int64_t K, const double alpha, const double *A, const int64_t lda,
const double *B, const int64_t ldb, const double beta, double *C,
const int64_t ldc)
void cblas_dgemmtr_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB, const int64_t N,
const int64_t K, const double alpha, const double *A, const int64_t
lda, const double *B, const int64_t ldb, const double beta, double
*C, const int64_t ldc)
void cblas_dsymm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO
Uplo, const int64_t M, const int64_t N, const double alpha, const
double *A, const int64_t lda, const double *B, const int64_t ldb,
const double beta, double *C, const int64_t ldc)
void cblas_dsyrk_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
β¦and that's where this part cuts off mid-prototype β cblas_dsyrk_64 is literally still talking π catch the rest in the next part, don't leave me hanging π¦
CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, const double alpha,
const double *A, const int64_t lda, const double beta, double *C, const int64_t ldc)
okay so that's the tail end of cblas_dsyr2k_64 right there β we were mid-signature, and now the double squad keeps rolling π
no cap, there are so many of these and every single one is listed below, so buckle up bestie.
void cblas_dsyr2k_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, const
double alpha, const double *A, const int64_t lda, const double *B,
const int64_t ldb, const double beta, double *C, const int64_t ldc)
void cblas_dtrmm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO
Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t M,
const int64_t N, const double alpha, const double *A, const int64_t
lda, double *B, const int64_t ldb)
void cblas_dtrsm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO
Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t M,
const int64_t N, const double alpha, const double *A, const int64_t
lda, double *B, const int64_t ldb)
the double trio said "we're done here" β¨ and tbh they ate. <pink>trmm</pink> and <pink>trsm</pink> are literally twinsies β same exact parameter list, same Side/Uplo/TransA/Diag lineup, just different names. iconic.
π the float complex girlies enter the chat
complex numbers, but make it float precision β c prefix, _64 suffix, void * everywhere because C doesn't know what a complex is at the CBLAS level π:
void cblas_cgemm_64 (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA,
CBLAS_TRANSPOSE TransB, const int64_t M, const int64_t N, const
int64_t K, const void *alpha, const void *A, const int64_t lda,
const void *B, const int64_t ldb, const void *beta, void *C, const
int64_t ldc)
void cblas_cgemmtr_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB, const int64_t N,
const int64_t K, const void *alpha, const void *A, const int64_t
lda, const void *B, const int64_t ldb, const void *beta, void *C,
const int64_t ldc)
void cblas_csymm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO
Uplo, const int64_t M, const int64_t N, const void *alpha, const
void *A, const int64_t lda, const void *B, const int64_t ldb, const
void *beta, void *C, const int64_t ldc)
void cblas_csyrk_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, const void
*alpha, const void *A, const int64_t lda, const void *beta, void *C,
const int64_t ldc)
void cblas_csyr2k_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, const void
*alpha, const void *A, const int64_t lda, const void *B, const
int64_t ldb, const void *beta, void *C, const int64_t ldc)
void cblas_ctrmm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO
Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t M,
const int64_t N, const void *alpha, const void *A, const int64_t
lda, void *B, const int64_t ldb)
void cblas_ctrsm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO
Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t M,
const int64_t N, const void *alpha, const void *A, const int64_t
lda, void *B, const int64_t ldb)
β οΈ quick vibe check: noticecblas_cgemmtr_64is doing its own thing β it takesUploand onlyN/K, bestie. it is not a copy-paste ofcblas_cgemm_64. read the signatures, don't assume π₯
π the double complex royalty
z prefix = the big-kid complex ones, and yep, void * for alpha, A, B, beta, C because them's the rules π
void cblas_zgemm_64 (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA,
CBLAS_TRANSPOSE TransB, const int64_t M, const int64_t N, const
int64_t K, const void *alpha, const void *A, const int64_t lda,
const void *B, const int64_t ldb, const void *beta, void *C, const
int64_t ldc)
void cblas_zgemmtr_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB, const int64_t N,
const int64_t K, const void *alpha, const void *A, const int64_t
lda, const void *B, const int64_t ldb, const void *beta, void *C,
const int64_t ldc)
void cblas_zsymm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO
Uplo, const int64_t M, const int64_t N, const void *alpha, const
void *A, const int64_t lda, const void *B, const int64_t ldb, const
void *beta, void *C, const int64_t ldc)
void cblas_zsyrk_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, const void
*alpha, const void *A, const int64_t lda, const void *beta, void *C,
const int64_t ldc)
void cblas_zsyr2k_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, const void
*alpha, const void *A, const int64_t lda, const void *B, const
int64_t ldb, const void *beta, void *C, const int64_t ldc)
void cblas_ztrmm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO
Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t M,
const int64_t N, const void *alpha, const void *A, const int64_t
lda, void *B, const int64_t ldb)
void cblas_ztrsm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO
Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t M,
const int64_t N, const void *alpha, const void *A, const int64_t
lda, void *B, const int64_t ldb)
like, zgemmtr mirrors cgemmtr exactly except everything's z. consistent queen behavior π the way that the alphabet just swaps one letter and the whole personality changes, iykyk.
πΈ the Hermitian corner (yes, they're different from symmetric, don't @ me)
these bad girls use real alpha/beta even though the matrices are complex β <purple>float</purple> for the c versions, <purple>double</purple> for the z versions. that's the whole point of Hermitian, periodt π
void cblas_chemm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO
Uplo, const int64_t M, const int64_t N, const void *alpha, const
void *A, const int64_t lda, const void *B, const int64_t ldb, const
void *beta, void *C, const int64_t ldc)
void cblas_cherk_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, const float
alpha, const void *A, const int64_t lda, const float beta, void *C,
const int64_t ldc)
void cblas_cher2k_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, const void
*alpha, const void *A, const int64_t lda, const void *B, const
int64_t ldb, const float beta, void *C, const int64_t ldc)
void cblas_zhemm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO
Uplo, const int64_t M, const int64_t N, const void *alpha, const
void *A, const int64_t lda, const void *B, const int64_t ldb, const
void *beta, void *C, const int64_t ldc)
void cblas_zherk_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, const
double alpha, const void *A, const int64_t lda, const double beta,
void *C, const int64_t ldc)
void cblas_zher2k_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, const void
*alpha, const void *A, const int64_t lda, const void *B, const
int64_t ldb, const double beta, void *C, const int64_t ldc)
π do NOT get it twisted: incblas_cherk_64andcblas_cher2k_64thealpha(and incher2kthealphatoo) staysconst void *butbetais a plainconst floatβ and incblas_cherk_64alphais alsoconst float. meanwhilezherk/zher2kuseconst double. copy the signature, not the vibe. fr fr.
π¦ and finally, the vibes police
void cblas_xerbla_64 (int64_t p, const char *rout, const char *form,...)
the one and only cblas_xerbla_64 β note the ... at the end because it's variadic bestie, and note that p is an int64_t here like everything else in this _64 world π«Ά and yes it takes a positional arg p, a routine name rout, and a format string form. that's the whole signature, no notes π
and that's the synopsis, wrapped and slayed. keep scrolling, the next part's got more for you π
Okay so this stretch of the page is the c-family first and then the d-family, all the _64 girlies, in exactly the order the header lists them. Every signature below is character for character what's in the header β don't let my commentary fool you into retyping anything π
πΈ the cblas_c* crew
cblas_caxpy_64
void cblas_caxpy_64 (const int64_t N, const void * alpha, const void * X, const int64_t incX, void * Y, const int64_t incY)
Six params, and the signature is already spilling the tea: alpha and X are const void * (hands off π
), Y is the mutable one, and every count/stride is int64_t.
cblas_ccopy_64
void cblas_ccopy_64 (const int64_t N, const void * X, const int64_t incX, void * Y, const int64_t incY)
X goes in const, Y comes out writable, and you've got incX / incY to space them out however you like π«Ά
cblas_cdotc_sub_64
void cblas_cdotc_sub_64 (const int64_t N, const void * X, const int64_t incX, const void * Y, const int64_t incY, void * dotc)
Heads up bestie β the _sub in the name means the answer comes back through that final void * dotc out-param instead of a return value. Six params total, and dotc is the only non-const pointer β¨
cblas_cdotu_sub_64
void cblas_cdotu_sub_64 (const int64_t N, const void * X, const int64_t incX, const void * Y, const int64_t incY, void * dotu)
Same shape as its cdotc sibling, right down to the out-param situation β only the last letter of the name and the last pointer's name change π
cblas_cgbmv_64
void cblas_cgbmv_64 (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const int64_t M, const int64_t N, const int64_t KL, const int64_t KU, const void * alpha, const void * A, const int64_t lda, const void * X, const int64_t incX, const void * beta, void * Y, const int64_t incY)
Fourteen params, no cap. layout and TransA lead, then M, N, KL, KU, then the two const void * scalars alpha / beta are doing their thing around the matrix and vectors π₯
cblas_cgemm_64
void cblas_cgemm_64 (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB, const int64_t M, const int64_t N, const int64_t K, const void * alpha, const void * A, const int64_t lda, const void * B, const int64_t ldb, const void * beta, void * C, const int64_t ldc)
Two transpose flags, M, N, K, two const matrices with their lda / ldb, and C β the only writable pointer β closing it out with ldc π
cblas_cgemmtr_64
void cblas_cgemmtr_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB, const int64_t N, const int64_t K, const void * alpha, const void * A, const int64_t lda, const void * B, const int64_t ldb, const void * beta, void * C, const int64_t ldc)
Notice what's missing: no M, just N and K. You do get Uplo plus both TransA and TransB though, so she's still fully booked π
cblas_cgemv_64
void cblas_cgemv_64 (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const int64_t M, const int64_t N, const void * alpha, const void * A, const int64_t lda, const void * X, const int64_t incX, const void * beta, void * Y, const int64_t incY)
M + N, one matrix with lda, one vector with incX, both scalars const, and Y sitting there mutable with incY π
cblas_cgerc_64
void cblas_cgerc_64 (CBLAS_LAYOUT layout, const int64_t M, const int64_t N, const void * alpha, const void * X, const int64_t incX, const void * Y, const int64_t incY, void * A, const int64_t lda)
Both vectors are const void *, alpha is const void *, and A is the one you're writing into, with lda at the end. The signature literally points at who's getting edited π
cblas_cgeru_64
void cblas_cgeru_64 (CBLAS_LAYOUT layout, const int64_t M, const int64_t N, const void * alpha, const void * X, const int64_t incX, const void * Y, const int64_t incY, void * A, const int64_t lda)
Identical param list to cgerc, sandwiched between layout, M, N and the trailing lda β one letter different, that's the whole assignment π¦
cblas_chbmv_64
void cblas_chbmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N, const int64_t K, const void * alpha, const void * A, const int64_t lda, const void * X, const int64_t incX, const void * beta, void * Y, const int64_t incY)
Uplo up front, N and K together, and the usual alpha in / beta in / Y out arrangement π
cblas_chemm_64
void cblas_chemm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo, const int64_t M, const int64_t N, const void * alpha, const void * A, const int64_t lda, const void * B, const int64_t ldb, const void * beta, void * C, const int64_t ldc)
Both Side and Uplo in the same call, bestie β two enums before you even reach M and N. Then A, B const, C writable with ldc β¨
cblas_chemv_64
void cblas_chemv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N, const void * alpha, const void * A, const int64_t lda, const void * X, const int64_t incX, const void * beta, void * Y, const int64_t incY)
Uplo, one N, one matrix, one vector, alpha and beta both const β Y is out here living its writable truth π«Ά
cblas_cher2_64
void cblas_cher2_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N, const void * alpha, const void * X, const int64_t incX, const void * Y, const int64_t incY, void * A, const int64_t lda)
Two const void * vectors, a const void * alpha, and A as the writable target with its lda. No cap, that's the whole signature πΈ
cblas_cher2k_64
void cblas_cher2k_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, const void * alpha, const void * A, const int64_t lda, const void * B, const int64_t ldb, const float beta, void * C, const int64_t ldc)
Look closely π alpha is const void * but beta is a plain old const float β that mix is intentional, it's literally what's in the header, don't "fix" it. Also Uplo and Trans, plus N, K, lda, ldb, ldc π₯
cblas_cher_64
void cblas_cher_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N, const float alpha, const void * X, const int64_t incX, void * A, const int64_t lda)
alpha is a real const float here β by value, in the middle of the param list β while X stays const void * and A is yours to write π
cblas_cherk_64
void cblas_cherk_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, const float alpha, const void * A, const int64_t lda, const float beta, void * C, const int64_t ldc)
Both alpha and beta are const float in this one β count them, they're both there. Uplo, Trans, N, K, A const, C writable π§
cblas_chpmv_64
void cblas_chpmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N, const void * alpha, const void * Ap, const void * X, const int64_t incX, const void * beta, void * Y, const int64_t incY)
That Ap is packed, so no lda sneaks in. Uplo, N, one vector X, one writable Y, both scalars const β
cblas_chpr2_64
void cblas_chpr2_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N, const void * alpha, const void * X, const int64_t incX, const void * Y, const int64_t incY, void * Ap)
Ap is the only non-const pointer in the whole thing and it's sitting at the very end with no lda attached. Packed life π
cblas_chpr_64
void cblas_chpr_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N, const float alpha, const void * X, const int64_t incX, void * A)
alpha is const float, X is const void *, and the packed output slot is named A here β not Ap β so type it exactly like that π
cblas_crotg_64
void cblas_crotg_64 (void * a, void * b, float * c, void * s)
No N! No layout! No strides! Just four pointers, and one of them (c) is a float * while the rest are void * π
cblas_cscal_64
void cblas_cscal_64 (const int64_t N, const void * alpha, void * X, const int64_t incX)
Four params, alpha const, X mutable, one stride. Short and iconic π
cblas_csrot_64
void cblas_csrot_64 (const int64_t N, void * X, const int64_t incX, void * Y, const int64_t incY, const float c, const float s)
Two mutable vectors and then c and s as by-value const floats at the tail end β yes, csrot specifically, that's the name, don't swap it for another π€
cblas_csscal_64
void cblas_csscal_64 (const int64_t N, const float alpha, void * X, const int64_t incX)
Double-s name, and the payoff is alpha arriving as a plain const float instead of a pointer π¦
cblas_cswap_64
void cblas_cswap_64 (const int64_t N, void * X, const int64_t incX, void * Y, const int64_t incY)
Two writable pointers, two strides, one N. Nobody's const and honestly good for them π
cblas_csymm_64
void cblas_csymm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo, const int64_t M, const int64_t N, const void * alpha, const void * A, const int64_t lda, const void * B, const int64_t ldb, const void * beta, void * C, const int64_t ldc)
Side + Uplo + M + N, then A and B both const, C writable, lda / ldb / ldc all present and accounted for π
cblas_csyr2k_64
void cblas_csyr2k_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, const void * alpha, const void * A, const int64_t lda, const void * B, const int64_t ldb, const void * beta, void * C, const int64_t ldc)
Here beta is a full const void *, unlike cher2k's float situation β these little differences are the whole reason you read the signature, bestie π
cblas_csyrk_64
void cblas_csyrk_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, const void * alpha, const void * A, const int64_t lda, const void * beta, void * C, const int64_t ldc)
Only one input matrix (A) this time β no B in sight, no ldb either. C is writable and ldc closes the call πΈ
cblas_ctbmv_64
void cblas_ctbmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const int64_t K, const void * A, const int64_t lda, void * X, const int64_t incX)
Three enums (Uplo, TransA, Diag) before you even reach N and K. A is const, X is out here writable π₯
cblas_ctbsv_64
void cblas_ctbsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const int64_t K, const void * A, const int64_t lda, void * X, const int64_t incX)
Same enum stack as ctbmv β Uplo, TransA, Diag β with _sv doing the differentiating at the end π
cblas_ctpmv_64
void cblas_ctpmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const void * Ap, void * X, const int64_t incX)
Ap, not A β and because it's packed there's no lda in the param list at all. People keep adding one. Don't be those people π«Ά
cblas_ctpsv_64
void cblas_ctpsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const void * Ap, void * X, const int64_t incX)
Packed Ap, Diag still present, N and incX the only numbers. Same as ctpmv shape-wise, different last letter β¨
cblas_ctrmm_64
void cblas_ctrmm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t M, const int64_t N, const void * alpha, const void * A, const int64_t lda, void * B, const int64_t ldb)
Four enums deep before M/N show up β Side, Uplo, TransA, Diag. A is const, B is the writable one, and there's no separate output param π
cblas_ctrmv_64
void cblas_ctrmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const void * A, const int64_t lda, void * X, const int64_t incX)
A const, X writable, Diag in the enum run, and only one N to keep track of π¦
cblas_ctrsm_64
void cblas_ctrsm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t M, const int64_t N, const void * alpha, const void * A, const int64_t lda, void * B, const int64_t ldb)
Same four-enum opening as ctrmm, same M/N, A const, B writable with ldb β the _sm is doing the heavy lifting in the name π
cblas_ctrsv_64
void cblas_ctrsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t N, const void * A, const int64_t lda, void * X, const int64_t incX)
Last of the c triangle crowd: A const with lda, X mutable with incX, Diag still in the house π
π and now the cblas_d* crew (double everything, same _64 energy)
cblas_dasum_64
double cblas_dasum_64 (const int64_t N, const double * X, const int64_t incX)
This one actually returns a double β look, a return type that isn't void π β and takes const double * X with a stride.
cblas_daxpy_64
void cblas_daxpy_64 (const int64_t N, const double alpha, const double * X, const int64_t incX, double * Y, const int64_t incY)
alpha is a by-value const double here, X is const double *, and Y is the writable double * with its own incY β¨
cblas_dcabs1_64
double cblas_dcabs1_64 (const void * z)
One const void * z in, one double out. No N, no stride, no layout β the most low-maintenance entry on this entire page π
cblas_dcopy_64
void cblas_dcopy_64 (const int64_t N, const double * X, const int64_t incX, double * Y, const int64_t incY)
X const, Y writable, incX and incY doing their spacing thing. Four numeric params and two pointers, that's it π«Ά
cblas_ddot_64
double cblas_ddot_64 (const int64_t N, const double * X, const int64_t incX, const double * Y, const int64_t incY)
Returns double, both vectors const double *. A true icon of not modifying anything she's given π
cblas_dgbmv_64
void cblas_dgbmv_64 (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const int64_t M, const int64_t N, const int64_t KL, const int64_t KU, const double alpha, const double * A, const int64_t lda, const double * X, const int64_t incX, const double beta, double * Y, const int64_t incY)
Fourteen params again, same skeleton as cgbmv, except now alpha and beta are real const double values and A / X are const double * π₯
cblas_dgemm_64
void cblas_dgemm_64 (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB, const int64_t M, const int64_t N, const int64_t K, const double alpha, const double * A, const int64_t lda, const double * B, const int64_t ldb, const double beta, double * C, const int64_t ldc)
The classic. layout, both transposes, M/N/K, two const double * operands with lda/ldb, and C writable with ldc π
cblas_dgemmtr_64
void cblas_dgemmtr_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB, const int64_t N, const int64_t K, const double alpha, const double * A, const int64_t lda, const double * B, const int64_t ldb, const double beta, double * C, const int64_t ldc)
N and K only β no M, remember β plus Uplo and both transpose flags sitting right after layout π
cblas_dgemv_64
void cblas_dgemv_64 (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const int64_t M, const int64_t N, const double alpha, const double * A, const int64_t lda, const double * X, const int64_t incX, const double beta, double * Y, const int64_t incY)
M + N, one matrix with lda, one vector with incX, alpha and beta by value, and Y mutable at the tail πΈ
cblas_dger_64
void cblas_dger_64 (CBLAS_LAYOUT layout, const int64_t M, const int64_t N, const double alpha, const double * X, const int64_t incX, const double * Y, const int64_t incY, double * A, const int64_t lda)
Heads up β there's no a/u/c suffix situation here, it's just dger. alpha, X, Y all const, A writable with lda π§
cblas_dnrm2_64
double cblas_dnrm2_64 (const int64_t N, const double * X, const int64_t incX)
Returns double, takes one const double * and a stride. Clean, minimal, obsessed β
cblas_drot_64
void cblas_drot_64 (const int64_t N, double * X, const int64_t incX, double * Y, const int64_t incY, const double c, const double s)
Both vectors mutable, and c / s arrive as by-value const doubles at the end π«
cblas_drotg_64
void cblas_drotg_64 (double * a, double * b, double * c, double * s)
Four bare double * pointers, no N, no strides, no layout. Zero notes, absolute main character energy π
cblas_drotm_64
void cblas_drotm_64 (const int64_t N, double * X, const int64_t incX, double * Y, const int64_t incY, const double * P)
Note the trailing P is const double * while X and Y are plain writable double * π
cblas_drotmg_64
void cblas_drotmg_64 (double * d1, double * d2, double * b1, const double b2, double * P)
b2 is the odd one out β the only const double by value in the whole param list β everything else is a pointer. Read it twice, bestie π
cblas_dsbmv_64
void cblas_dsbmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N, const int64_t K, const double alpha, const double * A, const int64_t lda, const double * X, const int64_t incX, const double beta, double * Y, const int64_t incY)
Uplo first, then N and K together, one matrix, one vector, two by-value scalars, one writable Y π¦
cblas_dscal_64
void cblas_dscal_64 (const int64_t N, const double alpha, double * X, const int64_t incX)
Four params, alpha by value, X mutable. Short king π
cblas_dsdot_64
double cblas_dsdot_64 (const int64_t N, const float * X, const int64_t incX, const float * Y, const int64_t incY)
Okay stop and read this one again π it returns a double but takes const float * vectors. That's not a typo, that's literally dsdot, and it's the whole personality of this function.
cblas_dspmv_64
void cblas_dspmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N, const double alpha, const double * Ap, const double * X, const int64_t incX, const double beta, double * Y, const int64_t incY)
Ap (packed, so no lda), X const, Y writable, alpha and beta by value, Uplo and N leading the parade β¨
cblas_dspr2_64
void cblas_dspr2_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N, const double alpha, const double * X, const int64_t incX, const double * Y, const int64_t incY, double * A)
X and Y both const double *, alpha by value, and that trailing packed A is the only writable pointer in the bunch π₯
cblas_dspr_64
void cblas_dspr_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N, const double alpha, const double * X, const int64_t incX, double * Ap)
Same Uplo + N + by-value alpha opening, but the writable packed slot is named Ap here β not A, bestie, don't mix them up π
cblas_dswap_64
void cblas_dswap_64 (const int64_t N, double * X, const int64_t incX, double * Y, const int64_t incY)
Two mutable double * vectors and nothing const about them. Trading places, no notes π«Ά
cblas_dsymm_64
void cblas_dsymm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo, const int64_t M, const int64_t N, const double alpha, const double * A, const int64_t lda, const double * B, const int64_t ldb, const double beta, double * C, const int64_t ldc)
Side and Uplo, then M/N, A and B const, C writable, lda/ldb/ldc all doing their jobs π
cblas_dsymv_64
void cblas_dsymv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N, const double alpha, const double * A, const int64_t lda, const double * X, const int64_t incX, const double beta, double * Y, const int64_t incY)
Uplo, one N, matrix A with lda, vector X with incX, alpha/beta by value, Y writable πΈ
cblas_dsyr2_64
void cblas_dsyr2_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N, const double alpha, const double * X, const int64_t incX, const double * Y, const int64_t incY, double * A, const int64_t lda)
X and Y const, alpha by value, and A writable with an lda bolted on the end π
cblas_dsyr2k_64
void cblas_dsyr2k_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE Trans, const int64_t N, const int64_t K, const double alpha, const double * A, const int64_t lda, const double * B, const int64_t ldb,
And this is exactly where our chunk runs out of page β dsyr2k is mid-signature, so the rest of her param list (and the whole rest of the d family, plus whatever comes after) picks up in the next piece π don't panic, nothing got dropped, the page just got cut mid-roll π
...and here's the tail end of that last one from before, finishing up its beta and its C:
const double beta, double * C, const int64_t ldc)
okay and now we're back in the double-precision girlie zone, no cap π
void cblas_dsyr_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N,
const double alpha, const double * X, const int64_t incX, double * A,
const int64_t lda)
void cblas_dsyrk_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
Trans, const int64_t N, const int64_t K, const double alpha, const
double * A, const int64_t lda, const double beta, double * C, const
int64_t ldc)
void cblas_dtbmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
TransA, CBLAS_DIAG Diag, const int64_t N, const int64_t K, const double
* A, const int64_t lda, double * X, const int64_t incX)
void cblas_dtbsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
TransA, CBLAS_DIAG Diag, const int64_t N, const int64_t K, const double
* A, const int64_t lda, double * X, const int64_t incX)
void cblas_dtpmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
TransA, CBLAS_DIAG Diag, const int64_t N, const double * Ap, double * X,
const int64_t incX)
void cblas_dtpsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
TransA, CBLAS_DIAG Diag, const int64_t N, const double * Ap, double * X,
const int64_t incX)
void cblas_dtrmm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t M, const int64_t
N, const double alpha, const double * A, const int64_t lda, double * B,
const int64_t ldb)
void cblas_dtrmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
TransA, CBLAS_DIAG Diag, const int64_t N, const double * A, const
int64_t lda, double * X, const int64_t incX)
void cblas_dtrsm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t M, const int64_t
N, const double alpha, const double * A, const int64_t lda, double * B,
const int64_t ldb)
void cblas_dtrsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
TransA, CBLAS_DIAG Diag, const int64_t N, const double * A, const
int64_t lda, double * X, const int64_t incX)
bestie look at that run π <pink>dsyr</pink>, <pink>dsyrk</pink>, then the whole <cyan>t</cyan>-block squad β dtbmv, dtbsv, dtpmv, dtpsv β and then the <purple>tr</purple> girlies dtrmm, dtrmv, dtrsm, dtrsv. the <cyan>t</cyan> ones are your triangular-band and triangular-packed vibes, the <purple>tr</purple> ones are full-on triangular, and notice the Diag argument showing up everywhere in that crowd β it's literally in the signature, <yellow>Diag</yellow>, right there next to TransA. she's not hiding π
also <green>lowkey</green> obsessed with how dsyr2k's cousin dsyrk here takes both alpha and beta and both A and C with lda and ldc to match. two leading dimensions, no notes. π
π the norm-and-sum cuties (complex double)
double cblas_dzasum_64 (const int64_t N, const void * X, const int64_t incX)
double cblas_dznrm2_64 (const int64_t N, const void * X, const int64_t incX)
two lines, two double returns, both taking const void * X because complex numbers said "we're not committing to a type in this signature" π and both take N and incX like the good little BLAS routines they are. <pink>dzasum</pink> and <pink>dznrm2</pink> β say them out loud, they're giving keyboard smash in the best way π¦
π the index girlies
CBLAS_INDEX cblas_icamax_64 (const int64_t N, const void * X, const int64_t
incX)
CBLAS_INDEX cblas_idamax_64 (const int64_t N, const double * X, const
int64_t incX)
CBLAS_INDEX cblas_isamax_64 (const int64_t N, const float * X, const int64_t
incX)
CBLAS_INDEX cblas_izamax_64 (const int64_t N, const void * X, const int64_t
incX)
okay so these four all return CBLAS_INDEX instead of a float or double, which is the whole personality. <hotpink>icamax</hotpink> takes const void *, <hotpink>idamax</hotpink> takes const double *, <hotpink>isamax</hotpink> takes const float *, <hotpink>izamax</hotpink> takes const void * again. and every single one still wants N and incX. iconic, consistent, we stan a uniform interface π
πΈ single-precision starting lineup
float cblas_sasum_64 (const int64_t N, const float * X, const int64_t incX)
void cblas_saxpy_64 (const int64_t N, const float alpha, const float * X,
const int64_t incX, float * Y, const int64_t incY)
float cblas_scabs1_64 (const void * c)
float cblas_scasum_64 (const int64_t N, const void * X, const int64_t incX)
float cblas_scnrm2_64 (const int64_t N, const void * X, const int64_t incX)
void cblas_scopy_64 (const int64_t N, const float * X, const int64_t incX,
float * Y, const int64_t incY)
float cblas_sdot_64 (const int64_t N, const float * X, const int64_t incX,
const float * Y, const int64_t incY)
float cblas_sdsdot_64 (const int64_t N, const float alpha, const float * X,
const int64_t incX, const float * Y, const int64_t incY)
<pink>sasum</pink> and <pink>saxpy</pink> and <pink>scopy</pink> and <pink>sdot</pink>β¦ the classics, fr fr. but <hotpink>scabs1</hotpink> is the main character here β she takes one argument, const void * c, and returns a float. no N, no incX, no nothing. she simply doesn't need them. <rainbow>tiny legend</rainbow> β
and <pink>sdsdot</pink> has a const float alpha sitting right there in position two β that's her whole thing, alpha first, then the two vectors, then incX and incY. sdot does not have that alpha, and I need you to clock the difference, bestie π
π¦ the single-precision matrix girlies
void cblas_sgbmv_64 (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const
int64_t M, const int64_t N, const int64_t KL, const int64_t KU, const
float alpha, const float * A, const int64_t lda, const float * X, const
int64_t incX, const float beta, float * Y, const int64_t incY)
void cblas_sgemm_64 (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA,
CBLAS_TRANSPOSE TransB, const int64_t M, const int64_t N, const int64_t
K, const float alpha, const float * A, const int64_t lda, const float *
B, const int64_t ldb, const float beta, float * C, const int64_t ldc)
void cblas_sgemmtr_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
TransA, CBLAS_TRANSPOSE TransB, const int64_t N, const int64_t K, const
float alpha, const float * A, const int64_t lda, const float * B, const
int64_t ldb, const float beta, float * C, const int64_t ldc)
void cblas_sgemv_64 (const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE
TransA, const int64_t M, const int64_t N, const float alpha, const float
* A, const int64_t lda, const float * X, const int64_t incX, const float
beta, float * Y, const int64_t incY)
void cblas_sger_64 (CBLAS_LAYOUT layout, const int64_t M, const int64_t N,
const float alpha, const float * X, const int64_t incX, const float * Y,
const int64_t incY, float * A, const int64_t lda)
float cblas_snrm2_64 (const int64_t N, const float * X, const int64_t incX)
void cblas_srot_64 (const int64_t N, float * X, const int64_t incX, float *
Y, const int64_t incY, const float c, const float s)
void cblas_srotg_64 (float * a, float * b, float * c, float * s)
void cblas_srotm_64 (const int64_t N, float * X, const int64_t incX, float *
Y, const int64_t incY, const float * P)
void cblas_srotmg_64 (float * d1, float * d2, float * b1, const float b2,
float * P)
okay <hotpink>sgemm</hotpink> is right there and she's the queen of the whole header, we all know it, <purple>M</purple> <purple>N</purple> <purple>K</purple> with lda, ldb, ldc β three leading dimensions because three matrices, obviously. and <hotpink>sgemmtr</hotpink> is her chaotic sister: she's got Uplo and only N and K instead of M, N, K. don't ask me to explain, just read the signature, it's literally right there π
<pink>sgbmv</pink> has KL and KU β lowercase-ell, uppercase-you, banded energy β while <pink>sgemv</pink> keeps it simple with just TransA. and <pink>sger</pink> doesn't have a TransA at all, she just wants M, N, alpha, the two vectors, and A with lda. `different strokes β¨
then the `rot family, and they are not interchangeable, i'm warning you now:
<pink>srot</pink>βN,X,incX,Y,incY,c,s<pink>srotg</pink>β justa,b,c,s, allfloat *, noNin sight<pink>srotm</pink>βN,X,incX,Y,incY, and aconst float * P<pink>srotmg</pink>βd1,d2,b1(allfloat *), thenconst float b2(not a pointer!!), thenfloat * P
yes bestie, b2 is <yellow>not</yellow> a pointer and b1 <yellow>is</yellow>. i did not make the rules. π«Ά
π single-precision, part two: symmetric & friends
void cblas_ssbmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N,
const int64_t K, const float alpha, const float * A, const int64_t lda,
const float * X, const int64_t incX, const float beta, float * Y, const
int64_t incY)
void cblas_sscal_64 (const int64_t N, const float alpha, float * X, const
int64_t incX)
void cblas_sspmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N,
const float alpha, const float * Ap, const float * X, const int64_t
incX, const float beta, float * Y, const int64_t incY)
void cblas_sspr2_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N,
const float alpha, const float * X, const int64_t incX, const float * Y,
const int64_t incY, float * A)
void cblas_sspr_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N,
const float alpha, const float * X, const int64_t incX, float * Ap)
void cblas_sswap_64 (const int64_t N, float * X, const int64_t incX, float *
Y, const int64_t incY)
void cblas_ssymm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
const int64_t M, const int64_t N, const float alpha, const float * A,
const int64_t lda, const float * B, const int64_t ldb, const float beta,
float * C, const int64_t ldc)
void cblas_ssymv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N,
const float alpha, const float * A, const int64_t lda, const float * X,
const int64_t incX, const float beta, float * Y, const int64_t incY)
void cblas_ssyr2_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N,
const float alpha, const float * X, const int64_t incX, const float * Y,
const int64_t incY, float * A, const int64_t lda)
void cblas_ssyr2k_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
Trans, const int64_t N, const int64_t K, const float alpha, const float
* A, const int64_t lda, const float * B, const int64_t ldb, const float
beta, float * C, const int64_t ldc)
void cblas_ssyr_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N,
const float alpha, const float * X, const int64_t incX, float * A, const
int64_t lda)
void cblas_ssyrk_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
Trans, const int64_t N, const int64_t K, const float alpha, const float
* A, const int64_t lda, const float beta, float * C, const int64_t ldc)
notice how <pink>sspr</pink> and <pink>sspr2</pink> take a bare float * Ap / float * A and <purple>no</purple> lda at all β packed storage said "leading dimension? never heard of her" π while their banded cousin <pink>ssbmv</pink> does have lda and a K. `the audacity, the range π
and can we appreciate <pink>sscal</pink> for being three arguments and done: N, alpha, X, incX. she's the palate cleanser between all these twelve-argument monsters π
<hotpink>ssymm</hotpink> brings Side and Uplo and M and N β the full ensemble. <hotpink>ssymv</hotpink> only takes N, because she's just one matrix and one vector, <yellow>iykyk</yellow>.
π§ the triangular single-precision iconiques
void cblas_stbmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
TransA, CBLAS_DIAG Diag, const int64_t N, const int64_t K, const float *
A, const int64_t lda, float * X, const int64_t incX)
void cblas_stbsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
TransA, CBLAS_DIAG Diag, const int64_t N, const int64_t K, const float *
A, const int64_t lda, float * X, const int64_t incX)
void cblas_stpmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
TransA, CBLAS_DIAG Diag, const int64_t N, const float * Ap, float * X,
const int64_t incX)
void cblas_stpsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
TransA, CBLAS_DIAG Diag, const int64_t N, const float * Ap, float * X,
const int64_t incX)
void cblas_strmm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t M, const int64_t
N, const float alpha, const float * A, const int64_t lda, float * B,
const int64_t ldb)
void cblas_strmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
TransA, CBLAS_DIAG Diag, const int64_t N, const float * A, const int64_t
lda, float * X, const int64_t incX)
void cblas_strsm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t M, const int64_t
N, const float alpha, const float * A, const int64_t lda, float * B,
const int64_t ldb)
void cblas_strsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
TransA, CBLAS_DIAG Diag, const int64_t N, const float * A, const int64_t
lda, float * X, const int64_t incX)
the <cyan>tβ¦</cyan> prefix means triangular, and you can <hotpink>see</hotpink> the Diag argument in literally every single one of these, plus Uplo and TransA. <pink>stbmv</pink> and <pink>stbsv</pink> are the banded ones and they get K + lda. <pink>stpmv</pink> and <pink>stpsv</pink> are packed and get Ap with no lda. and then <purple>strmm</purple> / <purple>strsm</purple> are the two-matrix ones, so they get Side, M, N, alpha, B and ldb β the full glow-up π
π and finally, the one that yells at you
void cblas_xerbla_64 (int64_t p, const char * rout, const char * form, ...)
that's <red>xerbla</red>, bestie. returns void, takes an int64_t p, a const char * rout, a const char * form, and then a literal ... β variadic, no cap. note the <yellow>two spaces</yellow> before the ... in the original, we keep it exactly, <rainbow>character for character</rainbow> β¨ and yeah β if you see her, something in your call was Not It. don't shoot the messenger π
okay we're cruising, <pink>part 7 incoming</pink> π«Ά
π
cblas_zaxpy_64
void cblas_zaxpy_64 (const int64_t N, const void * alpha, const void * X,
const int64_t incX, void * Y, const int64_t incY)
axpy but make it complex-double, bestie. The z girlies have entered the chat. β¨
π¦ cblas_zcopy_64
void cblas_zcopy_64 (const int64_t N, const void * X, const int64_t incX,
void * Y, const int64_t incY)
Copy energy, but fancy complex-double copy energy. It's giving relocation.
πΈ cblas_zdotc_sub_64
void cblas_zdotc_sub_64 (const int64_t N, const void * X, const int64_t
incX, const void * Y, const int64_t incY, void * dotc)
The conjugate-flavored dot situation, and yes dotc is where the answer lands. π
π§ cblas_zdotu_sub_64
void cblas_zdotu_sub_64 (const int64_t N, const void * X, const int64_t
incX, const void * Y, const int64_t incY, void * dotu)
Same dot vibes, unconjugated cousin, answer goes in dotu. Lowkey a duo with the one above.
β cblas_zdrot_64
void cblas_zdrot_64 (const int64_t N, void * X, const int64_t incX, void *
Y, const int64_t incY, const double c, const double s)
Note the c and s are straight-up const double, no wrapper, no drama. π
π₯ cblas_zdscal_64
void cblas_zdscal_64 (const int64_t N, const double alpha, void * X, const
int64_t incX)
alpha is a plain const double here, not a void * β she's built different and she knows it.
π cblas_zgbmv_64
void cblas_zgbmv_64 (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const
int64_t M, const int64_t N, const int64_t KL, const int64_t KU, const
void * alpha, const void * A, const int64_t lda, const void * X, const
int64_t incX, const void * beta, void * Y, const int64_t incY)
Look at all those parameters. KL, KU, lda, incX, incY β she's high-maintenance and iconic for it.
π cblas_zgemm_64
void cblas_zgemm_64 (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA,
CBLAS_TRANSPOSE TransB, const int64_t M, const int64_t N, const int64_t
K, const void * alpha, const void * A, const int64_t lda, const void *
B, const int64_t ldb, const void * beta, void * C, const int64_t ldc)
The main character of the whole header, no cap. Two transposes, both alpha and beta, the full lineup. π«Ά
π cblas_zgemmtr_64
void cblas_zgemmtr_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
TransA, CBLAS_TRANSPOSE TransB, const int64_t N, const int64_t K, const
void * alpha, const void * A, const int64_t lda, const void * B, const
int64_t ldb, const void * beta, void * C, const int64_t ldc)
gemm's mysterious sibling. Got Uplo in there too. We don't ask questions, we just pass the args. π
π cblas_zgemv_64
void cblas_zgemv_64 (CBLAS_LAYOUT layout, CBLAS_TRANSPOSE TransA, const
int64_t M, const int64_t N, const void * alpha, const void * A, const
int64_t lda, const void * X, const int64_t incX, const void * beta, void
* Y, const int64_t incY)
Matrix-vector moment. Single transpose, so like, slightly less to remember than zgemm, and we thank her for that.
π cblas_zgerc_64
void cblas_zgerc_64 (CBLAS_LAYOUT layout, const int64_t M, const int64_t N,
const void * alpha, const void * X, const int64_t incX, const void * Y,
const int64_t incY, void * A, const int64_t lda)
The c stands for conjugate and she will not let you forget it. π¦
π cblas_zgeru_64
void cblas_zgeru_64 (CBLAS_LAYOUT layout, const int64_t M, const int64_t N,
const void * alpha, const void * X, const int64_t incX, const void * Y,
const int64_t incY, void * A, const int64_t lda)
u for unconjugated. Same arg list as zgerc_64, different letter, big difference. Periodt.
πΈ cblas_zhbmv_64
void cblas_zhbmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N,
const int64_t K, const void * alpha, const void * A, const int64_t lda,
const void * X, const int64_t incX, const void * beta, void * Y, const
int64_t incY)
Uplo + K + alpha + beta, the whole little band is here. πΆ
π cblas_zhemm_64
void cblas_zhemm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
const int64_t M, const int64_t N, const void * alpha, const void * A,
const int64_t lda, const void * B, const int64_t ldb, const void * beta,
void * C, const int64_t ldc)
Side and Uplo β so many opinions in one function call, honestly relatable. π
β¨ cblas_zhemv_64
void cblas_zhemv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N,
const void * alpha, const void * A, const int64_t lda, const void * X,
const int64_t incX, const void * beta, void * Y, const int64_t incY)
Hermitian vector situation, Uplo included, obviously. She's not doing it without Uplo.
π§ cblas_zher2_64
void cblas_zher2_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N,
const void * alpha, const void * X, const int64_t incX, const void * Y,
const int64_t incY, void * A, const int64_t lda)
Rank-2 update, two vectors (X and Y), tagged with the 2. The name is telling you everything. π₯
β cblas_zher2k_64
void cblas_zher2k_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
Trans, const int64_t N, const int64_t K, const void * alpha, const void
* A, const int64_t lda, const void * B, const int64_t ldb, const double
beta, void * C, const int64_t ldc)
Careful, bestie: beta here is a real const double, but alpha is still const void *. Do not mix them up, I'm begging. π
π cblas_zher_64
void cblas_zher_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N,
const double alpha, const void * X, const int64_t incX, void * A, const
int64_t lda)
alpha is a plain const double this time. Yes, no void *. Yes, that's correct. π
π cblas_zherk_64
void cblas_zherk_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
Trans, const int64_t N, const int64_t K, const double alpha, const void
* A, const int64_t lda, const double beta, void * C, const int64_t ldc)
Both alpha and beta are const double here β matching set, we love a consistent aesthetic. β¨
π cblas_zhpmv_64
void cblas_zhpmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N,
const void * alpha, const void * Ap, const void * X, const int64_t incX,
const void * beta, void * Y, const int64_t incY)
Note it's Ap, packed-style, not plain A. Different pointer, different life. π¦
π cblas_zhpr2_64
void cblas_zhpr2_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N,
const void * alpha, const void * X, const int64_t incX, const void * Y,
const int64_t incY, void * Ap)
Packed Ap and the 2 and both X and Y. She contains multitudes.
π cblas_zhpr_64
void cblas_zhpr_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, const int64_t N,
const double alpha, const void * X, const int64_t incX, void * A)
Look at that last param β just void * A, no lda. Packed life means no leading dimension, and honestly? A little freeing. π
π₯ cblas_zrotg_64
void cblas_zrotg_64 (void * a, void * b, double * c, void * s)
The cutest little signature in the whole file and I stand by that. Four params, zero int64_t, absolute icon. π
πΈ cblas_zscal_64
void cblas_zscal_64 (const int64_t N, const void * alpha, void * X, const
int64_t incX)
alpha is a void * here, unlike her cousin zdscal_64. Yes, that's the whole difference. No, I will not be explaining further. π
β cblas_zswap_64
void cblas_zswap_64 (const int64_t N, void * X, const int64_t incX, void *
Y, const int64_t incY)
Swapping. Both X and Y are non-const because they both get changed. Vibe check passed. π
π§ cblas_zsymm_64
void cblas_zsymm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
const int64_t M, const int64_t N, const void * alpha, const void * A,
const int64_t lda, const void * B, const int64_t ldb, const void * beta,
void * C, const int64_t ldc)
Symmetric-style, but the complex-double edition. C is the only non-const pointer at the end. π«Ά
π cblas_zsyr2k_64
void cblas_zsyr2k_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
Trans, const int64_t N, const int64_t K, const void * alpha, const void
* A, const int64_t lda, const void * B, const int64_t ldb, const void *
beta, void * C, const int64_t ldc)
alpha and beta are both void * β compare with zher2k_64 where beta is a double. This is that exam question. π
π cblas_zsyrk_64
void cblas_zsyrk_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
Trans, const int64_t N, const int64_t K, const void * alpha, const void
* A, const int64_t lda, const void * beta, void * C, const int64_t ldc)
Only one input matrix (A), because the 2 is missing. See how the naming works? Obsessed with the consistency. π
π cblas_ztbmv_64
void cblas_ztbmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
TransA, CBLAS_DIAG Diag, const int64_t N, const int64_t K, const void *
A, const int64_t lda, void * X, const int64_t incX)
Diag has entered the building. Also no alpha, no beta β just vibes and X. β¨
π¦ cblas_ztbsv_64
void cblas_ztbsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
TransA, CBLAS_DIAG Diag, const int64_t N, const int64_t K, const void *
A, const int64_t lda, void * X, const int64_t incX)
Identical param list to ztbmv_64 but with an s. One letter, whole different function. Stay woke. π
π cblas_ztpmv_64
void cblas_ztpmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
TransA, CBLAS_DIAG Diag, const int64_t N, const void * Ap, void * X,
const int64_t incX)
Packed (Ap), so no lda and no K. She travels light. π
π cblas_ztpsv_64
void cblas_ztpsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
TransA, CBLAS_DIAG Diag, const int64_t N, const void * Ap, void * X,
const int64_t incX)
Again: same as ztpmv_64, one letter different. The m/s pipeline is real, iykyk. π₯
π cblas_ztrmm_64
void cblas_ztrmm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t M, const int64_t
N, const void * alpha, const void * A, const int64_t lda, void * B,
const int64_t ldb)
Five enum-ish params before you even hit a number. She is that girl and she knows it. π
π§ cblas_ztrmv_64
void cblas_ztrmv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
TransA, CBLAS_DIAG Diag, const int64_t N, const void * A, const int64_t
lda, void * X, const int64_t incX)
Side and M/N peaced out; this one only needs N, A, lda, X, incX. Minimalist queen. πΈ
β cblas_ztrsm_64
void cblas_ztrsm_64 (CBLAS_LAYOUT layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo,
CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, const int64_t M, const int64_t
N, const void * alpha, const void * A, const int64_t lda, void * B,
const int64_t ldb)
Same lineup as ztrmm_64, the s version. Last of the m/s pairs, we made it. π
π cblas_ztrsv_64
void cblas_ztrsv_64 (CBLAS_LAYOUT layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE
TransA, CBLAS_DIAG Diag, const int64_t N, const void * A, const int64_t
lda, void * X, const int64_t incX)
Final z function, and it's the v twin of ztrmv_64. Congratulations, you've met the whole alphabet. π
β¨ Author β¨
Generated automatically by Doxygen for LAPACK from the source code.
No human wrote this section, bestie β Doxygen did. Respect the pipeline. π€π
And that's a wrap on CBLAS/include/cblas_64.h(3)! ππ«Ά You just read the entire complex-double lineup plus everything above it β genuinely iconic of you. This page came from LAPACK, Version 3.12.0, dated CBLAS/include/cblas_64.h(3) in the footer, so if anything up there ever looks sus, that's the source and version to go check. Now go forth and pass your int64_t args correctly, my love. πβ¨
π¦ where this page comes from
- arch rolling: lapack-doc 3.12.1-2 Β· custom
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms