17#include <libxs/libxs_gemm.h>
24void dgemm_(
const char *transa,
const char *transb,
const int *m,
const int *n,
25 const int *k,
const double *alpha,
const double *a,
const int *lda,
26 const double *b,
const int *ldb,
const double *beta,
double *c,
33static inline void dbm_dgemm(
const char transa,
const char transb,
const int m,
34 const int n,
const int k,
const double alpha,
35 const double *a,
const int lda,
const double *b,
36 const int ldb,
const double beta,
double *c,
38 dgemm_(&transa, &transb, &m, &n, &k, &alpha, a, &lda, b, &ldb, &beta, c,
51 const unsigned int m = task.
m, n = task.
n, k = task.
k;
52 const unsigned int mn = (m >= n) ? m * m + m + n : m + n * n;
53 const unsigned int mnk = (mn >= k) ? mn * mn + mn + k : mn + k * k;
70 int batch_order[ntasks];
74 for (
int itask = 0; itask < ntasks; ++itask) {
79 buckets[
i] += buckets[
i - 1];
82 for (
int itask = 0; itask < ntasks; ++itask) {
85 batch_order[buckets[
i]] = itask;
88 for (
int itask = 0; itask < ntasks; ++itask) {
89 batch_order[itask] = itask;
94 const libxs_gemm_config_t *gemm_config = NULL;
95 int kernel_m = 0, kernel_n = 0, kernel_k = 0;
100 for (
int itask = 0; itask < ntasks; ++itask) {
102 task_next = batch[batch_order[(itask + 1) < ntasks ? (itask + 1) : itask]];
106 (task.
m != kernel_m || task.
n != kernel_n || task.
k != kernel_k)) {
107 const double beta = 1.0;
108 gemm_config = libxs_gemm_dispatch(LIBXS_DATATYPE_F64,
'N',
'T', task.
m,
109 task.
n, task.
k, task.
m, task.
n, task.
m,
110 &alpha, &beta, NULL);
122 if (NULL != gemm_config) {
123 libxs_gemm_call(gemm_config, data_a, data_b, data_c);
127 dbm_dgemm(
'N',
'T', task.
m, task.
n, task.
k, alpha, data_a, task.
m, data_b,
128 task.
n, 1.0, data_c, task.
m);
#define DBM_BATCH_NUM_BUCKETS
static void dbm_dgemm(const char transa, const char transb, const int m, const int n, const int k, const double alpha, const double *a, const int lda, const double *b, const int ldb, const double beta, double *c, const int ldc)
Private convenient wrapper to hide Fortran nature of dgemm_.
static unsigned int hash(const dbm_task_t task)
Private hash function based on Szudzik's elegant pairing. Using unsigned int to return a positive num...
void dbm_multiply_cpu_process_batch(int ntasks, const dbm_task_t batch[ntasks], double alpha, const dbm_pack_t *pack_a, const dbm_pack_t *pack_b, dbm_shard_t *shard_c, int options)
Internal routine for executing the tasks in given batch on the CPU.
void dgemm_(const char *transa, const char *transb, const int *m, const int *n, const int *k, const double *alpha, const double *a, const int *lda, const double *b, const int *ldb, const double *beta, double *c, const int *ldc)
Prototype for BLAS dgemm.
@ DBM_MULTIPLY_BLAS_LIBRARY
@ DBM_MULTIPLY_TASK_REORDER
void dbm_shard_allocate_promised_blocks(dbm_shard_t *shard)
Internal routine for allocating and zeroing any promised block's data.
static void const int const int i
Internal struct for storing a pack - essentially a shard for MPI.
Internal struct for storing a matrix shard.
Internal struct for storing a task, ie. a single block multiplication.