8#include <kernel/lafem/arch/apply.hpp> 
   15#include <mkl_spblas.h> 
   20#ifdef FEAT_COMPILER_MICROSOFT 
   21#pragma warning(disable: 4996) 
   26using namespace FEAT::LAFEM::Arch;
 
   28void Apply::csr_mkl(
float * r, 
const float a, 
const float * 
const x, 
const float b, 
const float * 
const y, 
const float * 
const val, 
const Index * 
const col_ind, 
const Index * 
const row_ptr, 
const Index rows, 
const Index columns, 
const Index, 
const bool transposed)
 
   30  MKL_INT mrows = (MKL_INT)rows;
 
   31  MKL_INT mcolumns = (MKL_INT)columns;
 
   37      scopy(&mcolumns, (
const float*)y, &one, r, &one);
 
   39      scopy(&mrows, (
const float*)y, &one, r, &one);
 
   42#ifdef FEAT_USE_MKL_SPARSE_EXECUTOR 
   44  sparse_operation_t opt;
 
   46    opt = SPARSE_OPERATION_TRANSPOSE;
 
   48    opt = SPARSE_OPERATION_NON_TRANSPOSE;
 
   52  sparse_status_t status = mkl_sparse_s_create_csr(&A, SPARSE_INDEX_BASE_ZERO, mrows, mcolumns, (MKL_INT*)row_ptr, (MKL_INT*)(row_ptr + 1), (MKL_INT*)col_ind, (
float*) val);
 
   54  if (status != SPARSE_STATUS_SUCCESS)
 
   55    XABORTM(
"MKL Sparse Error occurred in execution!\n");
 
   57  md.type = SPARSE_MATRIX_TYPE_GENERAL;
 
   58  status = mkl_sparse_s_mv(opt, a, A, md, x, b, r);
 
   59  if (status != SPARSE_STATUS_SUCCESS)
 
   60    XABORTM(
"MKL Sparse Error occurred in execution!\n");
 
   61  mkl_sparse_destroy(A);
 
   78  mkl_scsrmv(&trans, &mrows, &mcolumns, (
const float*)&a, matdescra, (
const float*) val, (
const MKL_INT*)col_ind, (
const MKL_INT*)row_ptr, (
const MKL_INT*)(row_ptr) + 1, (
const float*)x, (
const float*)&b, r);
 
   84void Apply::csr_mkl(
double * r, 
const double a, 
const double * 
const x, 
const double b, 
const double * 
const y, 
const double * 
const val, 
const Index * 
const col_ind, 
const Index * 
const row_ptr, 
const Index rows, 
const Index columns, 
const Index, 
const bool transposed)
 
   86  MKL_INT mrows = (MKL_INT)rows;
 
   87  MKL_INT mcolumns = (MKL_INT)columns;
 
   93      dcopy(&mcolumns, (
const double*)y, &one, r, &one);
 
   95      dcopy(&mrows, (
const double*)y, &one, r, &one);
 
   98#ifdef FEAT_USE_MKL_SPARSE_EXECUTOR 
  100  sparse_operation_t opt;
 
  102    opt = SPARSE_OPERATION_TRANSPOSE;
 
  104    opt = SPARSE_OPERATION_NON_TRANSPOSE;
 
  107  FEAT_DISABLE_WARNINGS
 
  108  sparse_status_t status = mkl_sparse_d_create_csr(&A, SPARSE_INDEX_BASE_ZERO, mrows, mcolumns, (MKL_INT*)row_ptr, (MKL_INT*)(row_ptr + 1), (MKL_INT*)col_ind, (
double*) val);
 
  109  FEAT_RESTORE_WARNINGS
 
  110  if (status != SPARSE_STATUS_SUCCESS)
 
  111    XABORTM(
"MKL Sparse Error occurred in execution!\n");
 
  113  md.type = SPARSE_MATRIX_TYPE_GENERAL;
 
  114  status = mkl_sparse_d_mv(opt, a, A, md, x, b, r);
 
  115  if (status != SPARSE_STATUS_SUCCESS)
 
  116    XABORTM(
"MKL Sparse Error occurred in execution!\n");
 
  117  mkl_sparse_destroy(A);
 
  133  FEAT_DISABLE_WARNINGS
 
  134  mkl_dcsrmv(&trans, &mrows, &mcolumns, (
const double*)&a, matdescra, (
const double*) val, (
const MKL_INT*)col_ind, (
const MKL_INT*)row_ptr, (
const MKL_INT*)(row_ptr) + 1, (
const double*)x, (
const double*)&b, r);
 
  135  FEAT_RESTORE_WARNINGS
 
  140void Apply::bcsr_mkl(
float * r, 
const float a, 
const float * 
const x, 
const float b, 
const float * 
const y, 
const float * 
const val, 
const Index * 
const col_ind, 
const Index * 
const row_ptr, 
const Index rows, 
const Index columns, 
const Index, 
const int blocksize)
 
  142  MKL_INT mrows = (MKL_INT)rows;
 
  143  MKL_INT mcolumns = (MKL_INT)columns;
 
  144  MKL_INT mblocksize = (MKL_INT)blocksize;
 
  145  MKL_INT mcopysize = mrows * mblocksize;
 
  150    scopy(&mcopysize, (
const float*)y, &one, r, &one);
 
  154#ifdef FEAT_USE_MKL_SPARSE_EXECUTOR 
  156  sparse_operation_t opt = SPARSE_OPERATION_NON_TRANSPOSE;
 
  159  FEAT_DISABLE_WARNINGS
 
  160  mkl_sparse_s_create_bsr(&A, SPARSE_INDEX_BASE_ZERO, SPARSE_LAYOUT_ROW_MAJOR, mrows, mcolumns, mblocksize, (MKL_INT*)row_ptr, (MKL_INT*)(row_ptr + 1), (MKL_INT*)col_ind, (
float*) val);
 
  161  FEAT_RESTORE_WARNINGS
 
  163  md.type = SPARSE_MATRIX_TYPE_GENERAL;
 
  164  mkl_sparse_s_mv(opt, a, A, md, x, b, r);
 
  165  mkl_sparse_destroy(A);
 
  176  FEAT_DISABLE_WARNINGS
 
  177  mkl_sbsrmv(&trans, &mrows, &mcolumns, &mblocksize, (
const float*)&a, matdescra, (
const float*) val, (
const MKL_INT*)col_ind, (
const MKL_INT*)row_ptr, (
const MKL_INT*)(row_ptr) + 1, (
const float*)x, (
const float*)&b, r);
 
  178  FEAT_RESTORE_WARNINGS
 
  183void Apply::bcsr_mkl(
double * r, 
const double a, 
const double * 
const x, 
const double b, 
const double * 
const y, 
const double * 
const val, 
const Index * 
const col_ind, 
const Index * 
const row_ptr, 
const Index rows, 
const Index columns, 
const Index, 
const int blocksize)
 
  185  MKL_INT mrows = (MKL_INT)rows;
 
  186  MKL_INT mcolumns = (MKL_INT)columns;
 
  187  MKL_INT mblocksize = (MKL_INT)blocksize;
 
  188  MKL_INT mcopysize = mrows * mblocksize;
 
  193    dcopy(&mcopysize, (
const double*)y, &one, r, &one);
 
  197#ifdef FEAT_USE_MKL_SPARSE_EXECUTOR 
  199  sparse_operation_t opt = SPARSE_OPERATION_NON_TRANSPOSE;
 
  202  FEAT_DISABLE_WARNINGS
 
  203  mkl_sparse_d_create_bsr(&A, SPARSE_INDEX_BASE_ZERO, SPARSE_LAYOUT_ROW_MAJOR, mrows, mcolumns, mblocksize, (MKL_INT*)row_ptr, (MKL_INT*)(row_ptr + 1), (MKL_INT*)col_ind, (
double*) val);
 
  204  FEAT_RESTORE_WARNINGS
 
  206  md.type = SPARSE_MATRIX_TYPE_GENERAL;
 
  207  mkl_sparse_d_mv(opt, a, A, md, x, b, r);
 
  208  mkl_sparse_destroy(A);
 
  219  FEAT_DISABLE_WARNINGS
 
  220  mkl_dbsrmv(&trans, &mrows, &mcolumns, &mblocksize, (
const double*)&a, matdescra, (
const double*) val, (
const MKL_INT*)col_ind, (
const MKL_INT*)row_ptr, (
const MKL_INT*)(row_ptr) + 1, (
const double*)x, (
const double*)&b, r);
 
  221  FEAT_RESTORE_WARNINGS
 
  226void Apply::bcsr_transposed_mkl(
float * r, 
const float a, 
const float * 
const x, 
const float b, 
const float * 
const y, 
const float * 
const val, 
const Index * 
const col_ind, 
const Index * 
const row_ptr, 
const Index rows, 
const Index columns, 
const Index, 
const int blocksize)
 
  228  MKL_INT mrows = (MKL_INT)rows;
 
  229  MKL_INT mcolumns = (MKL_INT)columns;
 
  230  MKL_INT mblocksize = (MKL_INT)blocksize;
 
  231  MKL_INT mcopysize = mcolumns * mblocksize;
 
  236    scopy(&mcopysize, (
const float*)y, &one, r, &one);
 
  240#ifdef FEAT_USE_MKL_SPARSE_EXECUTOR 
  242  sparse_operation_t opt = SPARSE_OPERATION_NON_TRANSPOSE;
 
  245  FEAT_DISABLE_WARNINGS
 
  246    mkl_sparse_s_create_bsr(&A, SPARSE_INDEX_BASE_ZERO, SPARSE_LAYOUT_ROW_MAJOR, mrows, mcolumns, mblocksize, (MKL_INT*)row_ptr, (MKL_INT*)(row_ptr + 1), (MKL_INT*)col_ind, (
float*) val);
 
  247  FEAT_RESTORE_WARNINGS
 
  249  md.type = SPARSE_MATRIX_TYPE_GENERAL;
 
  250  mkl_sparse_s_mv(opt, a, A, md, x, b, r);
 
  251  mkl_sparse_destroy(A);
 
  262  FEAT_DISABLE_WARNINGS
 
  263    mkl_sbsrmv(&trans, &mrows, &mcolumns, &mblocksize, (
const float*)&a, matdescra, (
const float*) val, (
const MKL_INT*)col_ind, (
const MKL_INT*)row_ptr, (
const MKL_INT*)(row_ptr) + 1, (
const float*)x, (
const float*)&b, r);
 
  264  FEAT_RESTORE_WARNINGS
 
  269void Apply::bcsr_transposed_mkl(
double * r, 
const double a, 
const double * 
const x, 
const double b, 
const double * 
const y, 
const double * 
const val, 
const Index * 
const col_ind, 
const Index * 
const row_ptr, 
const Index rows, 
const Index columns, 
const Index, 
const int blocksize)
 
  271  MKL_INT mrows = (MKL_INT)rows;
 
  272  MKL_INT mcolumns = (MKL_INT)columns;
 
  273  MKL_INT mblocksize = (MKL_INT)blocksize;
 
  274  MKL_INT mcopysize = mcolumns * mblocksize;
 
  279    dcopy(&mcopysize, (
const double*)y, &one, r, &one);
 
  283#ifdef FEAT_USE_MKL_SPARSE_EXECUTOR 
  285  sparse_operation_t opt = SPARSE_OPERATION_NON_TRANSPOSE;
 
  288  FEAT_DISABLE_WARNINGS
 
  289    mkl_sparse_d_create_bsr(&A, SPARSE_INDEX_BASE_ZERO, SPARSE_LAYOUT_ROW_MAJOR, mrows, mcolumns, mblocksize, (MKL_INT*)row_ptr, (MKL_INT*)(row_ptr + 1), (MKL_INT*)col_ind, (
double*) val);
 
  290  FEAT_RESTORE_WARNINGS
 
  292  md.type = SPARSE_MATRIX_TYPE_GENERAL;
 
  293  mkl_sparse_d_mv(opt, a, A, md, x, b, r);
 
  294  mkl_sparse_destroy(A);
 
  305  FEAT_DISABLE_WARNINGS
 
  306    mkl_dbsrmv(&trans, &mrows, &mcolumns, &mblocksize, (
const double*)&a, matdescra, (
const double*) val, (
const MKL_INT*)col_ind, (
const MKL_INT*)row_ptr, (
const MKL_INT*)(row_ptr) + 1, (
const double*)x, (
const double*)&b, r);
 
  307  FEAT_RESTORE_WARNINGS
 
  312void Apply::dense_mkl(
float * r, 
const float alpha, 
const float beta, 
const float * 
const y, 
const float * 
const val, 
const float * 
const x, 
const Index rows, 
const Index columns)
 
  314  MKL_INT mrows = (MKL_INT)rows;
 
  315  MKL_INT mcolumns = (MKL_INT)columns;
 
  320    scopy(&mrows, (
const float*)y, &one, r, &one);
 
  322  cblas_sgemv(CblasRowMajor, CblasNoTrans, mrows, mcolumns, alpha, val, mcolumns, x, 1, beta, r, 1);
 
  325void Apply::dense_mkl(
double * r, 
const double alpha, 
const double beta, 
const double * 
const y, 
const double * 
const val, 
const double * 
const x, 
const Index rows, 
const Index columns)
 
  327  MKL_INT mrows = (MKL_INT)rows;
 
  328  MKL_INT mcolumns = (MKL_INT)columns;
 
  333    dcopy(&mrows, (
const double*)y, &one, r, &one);
 
  335  cblas_dgemv(CblasRowMajor, CblasNoTrans, mrows, mcolumns, alpha, val, mcolumns, x, 1, beta, r, 1);
 
#define XABORTM(msg)
Abortion macro definition with custom message.
std::uint64_t Index
Index data type.