#include #include #include // for nan(), fabs() #include // for malloc(), free() //-- BLAS Level 1 functions ---------------------------------------------------- void dcopy(size_t n, const double *x, ptrdiff_t incX, double *y, ptrdiff_t incY) { for (size_t i=0; imax) { I = i; max = fabs(x[i*incX]); } } return I; } void dswap(size_t n, double *x, ptrdiff_t incX, double *y, ptrdiff_t incY) { for (size_t i=0; iincColA) { dger(n, m, alpha, y, incY, x, incX, A, incColA, incRowA); return; } for (size_t j=0; j0; ) { if (!unit) { x[j*incX] /= A[j*(incRowA+incColA)]; } daxpy(j, -x[j*incX], &A[j*incColA], incRowA, x, incX); } } else { // A is row major for (size_t j=n; j-- >0; ) { x[j*incX] -= ddot(n-1-j, &A[j*incRowA+(j+1)*incColA], incColA, &x[(j+1)*incX], incX); if (!unit) { x[j*incX] /= A[j*(incRowA+incColA)]; } } } } } //-- BLAS Level 3 functions ---------------------------------------------------- // GEMM #ifndef DGEMM_MC #define DGEMM_MC 4 #endif #ifndef DGEMM_NC #define DGEMM_NC 6 #endif #ifndef DGEMM_KC #define DGEMM_KC 5 #endif #ifndef DGEMM_MR #define DGEMM_MR 2 #endif #ifndef DGEMM_NR #define DGEMM_NR 3 #endif #if (DGEMM_MC % DGEMM_MR != 0) #error "DGEMM_MC must be a multiple of DEGMM_MR." #endif #if (DGEMM_NC % DGEMM_NR != 0) #error "DGEMM_NC must be a multiple of DEGMM_NR." #endif //-- packing blocks of A ------------------------------------------------------- void dpack_A(size_t mc, size_t kc, const double *A, ptrdiff_t incRowA, ptrdiff_t incColA, double *A_) { size_t mb = mc / DGEMM_MR; // pack whole panels of A for (size_t ib=0; ib