#include "dclhelpers.h" #define FLOAT DCL_FLOAT #define DYNAMIC_INDEX #include "dclapack.h" #include #include #include #include void dclPrint(const DCL_FLOAT *PMATRIX, int PMATRIXc, int n, int m) { PRINT(PMATRIX, n, m); } void dclIdentity(DCL_FLOAT *I, int Ic, int m, int n) { IDENTITY(I, m, n); } /* Returns the zero matrix */ void dclZero(DCL_FLOAT *Z, int Zc, int m, int n) { memset(Z, 0, m * n * sizeof(DCL_FLOAT)); } void dclTransp(DCL_FLOAT *R, int Rc, const DCL_FLOAT *A, int Ac, int n, int m) { TRANSP(R, A, n, m); } void dclLU(DCL_FLOAT *L, int Lc, DCL_FLOAT *U, int Uc, const DCL_FLOAT *A, int Ac, int *Piv, int n) { LU(L, U, A, Piv, n); } void dclPivot(DCL_FLOAT *R, int Rc, const DCL_FLOAT *A, int Ac, int *Piv, int n, int m) { PIVOT(R, A, Piv, n, m); } void dclLSub(DCL_FLOAT *X, int Xc, const DCL_FLOAT *L, int Lc, const DCL_FLOAT *B, int Bc, int n, int m) { L_SUB(X, L, B, n, m); } void dclUSub(DCL_FLOAT *X, int Xc, const DCL_FLOAT *U, int Uc, const DCL_FLOAT *B, int Bc, int n, int m) { U_SUB(X, U, B, n, m); } void dclInv(DCL_FLOAT *Ainv, int Ainvc, const DCL_FLOAT *A, int Ac, int n) { INV(Ainv, A, n, n); } void dclMul(DCL_FLOAT *R, int Rc, const DCL_FLOAT *A, int Ac, const DCL_FLOAT *B, int Bc, int n, int m, int p) { MUL(R, A, B, n, m, p); } void dclMulAdd(DCL_FLOAT *R, int Rc, const DCL_FLOAT *A, int Ac, const DCL_FLOAT *B, int Bc, const DCL_FLOAT *C, int Cc, int n, int m, int p) { MULADD(R, A, B, C, n, m, p); } void dclGMulAdd(DCL_FLOAT *R, int Rc, const DCL_FLOAT *A, int Ac, const DCL_FLOAT *B, int Bc, const DCL_FLOAT *C, int Cc, DCL_FLOAT alpha, DCL_FLOAT beta, int n, int m, int p) { GMULADD(R, A, B, C, alpha, beta, n, m, p); } /* dclGMulAdd( R, ((transA)?TRANS(A):A, (transB)?TRANS(B):B), C, alpha, beta, n, m, p ); */ void dcldgemm(char transA, char transB, int m, int n, int k, DCL_FLOAT alpha, const DCL_FLOAT *A, int Ac, // must be n const DCL_FLOAT *B, int Bc, // must be m DCL_FLOAT beta, DCL_FLOAT *C, int Cc // must be n ) { const DCL_FLOAT *ta; const DCL_FLOAT *tb; int tac = Ac; int tbc = Bc; if (transA) { DCL_FLOAT *la = alloca(sizeof(DCL_FLOAT) * n * m); const int lac = m; TRANSP(la, A, n, m); ta = la; tac = lac; } else ta = A; if (transB) { DCL_FLOAT *lb = alloca(sizeof(DCL_FLOAT) * n * m); const int lbc = m; TRANSP(lb, B, n, m); tb = lb; tbc = lbc; } else tb = B; GMULADD(C, ta, tb, C, alpha, beta, m, n, k); }