8#include <kernel/lafem/arch/apply.hpp>
15#include <mkl_spblas.h>
20using namespace FEAT::LAFEM::Arch;
22void 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)
24 MKL_INT mrows = (MKL_INT)rows;
25 MKL_INT mcolumns = (MKL_INT)columns;
31 scopy(&mcolumns, (
const float*)y, &one, r, &one);
33 scopy(&mrows, (
const float*)y, &one, r, &one);
36#ifndef FEAT_USE_MKL_LEGACY_SPMV
38 sparse_operation_t opt;
40 opt = SPARSE_OPERATION_TRANSPOSE;
42 opt = SPARSE_OPERATION_NON_TRANSPOSE;
46 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);
48 if (status != SPARSE_STATUS_SUCCESS)
49 XABORTM(
"MKL Sparse Error occurred in execution!\n");
51 md.type = SPARSE_MATRIX_TYPE_GENERAL;
52 status = mkl_sparse_s_mv(opt, a, A, md, x, b, r);
53 if (status != SPARSE_STATUS_SUCCESS)
54 XABORTM(
"MKL Sparse Error occurred in execution!\n");
55 mkl_sparse_destroy(A);
72 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);
78void 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)
80 MKL_INT mrows = (MKL_INT)rows;
81 MKL_INT mcolumns = (MKL_INT)columns;
87 dcopy(&mcolumns, (
const double*)y, &one, r, &one);
89 dcopy(&mrows, (
const double*)y, &one, r, &one);
92#ifndef FEAT_USE_MKL_LEGACY_SPMV
94 sparse_operation_t opt;
96 opt = SPARSE_OPERATION_TRANSPOSE;
98 opt = SPARSE_OPERATION_NON_TRANSPOSE;
101 FEAT_DISABLE_WARNINGS
102 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);
103 FEAT_RESTORE_WARNINGS
104 if (status != SPARSE_STATUS_SUCCESS)
105 XABORTM(
"MKL Sparse Error occurred in execution!\n");
107 md.type = SPARSE_MATRIX_TYPE_GENERAL;
108 status = mkl_sparse_d_mv(opt, a, A, md, x, b, r);
109 if (status != SPARSE_STATUS_SUCCESS)
110 XABORTM(
"MKL Sparse Error occurred in execution!\n");
111 mkl_sparse_destroy(A);
127 FEAT_DISABLE_WARNINGS
128 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);
129 FEAT_RESTORE_WARNINGS
134void 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)
136 MKL_INT mrows = (MKL_INT)rows;
137 MKL_INT mcolumns = (MKL_INT)columns;
138 MKL_INT mblocksize = (MKL_INT)blocksize;
139 MKL_INT mcopysize = mrows * mblocksize;
144 scopy(&mcopysize, (
const float*)y, &one, r, &one);
148#ifndef FEAT_USE_MKL_LEGACY_SPMV
150 sparse_operation_t opt = SPARSE_OPERATION_NON_TRANSPOSE;
153 FEAT_DISABLE_WARNINGS
154 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);
155 FEAT_RESTORE_WARNINGS
157 md.type = SPARSE_MATRIX_TYPE_GENERAL;
158 mkl_sparse_s_mv(opt, a, A, md, x, b, r);
159 mkl_sparse_destroy(A);
170 FEAT_DISABLE_WARNINGS
171 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);
172 FEAT_RESTORE_WARNINGS
177void 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)
179 MKL_INT mrows = (MKL_INT)rows;
180 MKL_INT mcolumns = (MKL_INT)columns;
181 MKL_INT mblocksize = (MKL_INT)blocksize;
182 MKL_INT mcopysize = mrows * mblocksize;
187 dcopy(&mcopysize, (
const double*)y, &one, r, &one);
191#ifndef FEAT_USE_MKL_LEGACY_SPMV
193 sparse_operation_t opt = SPARSE_OPERATION_NON_TRANSPOSE;
196 FEAT_DISABLE_WARNINGS
197 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);
198 FEAT_RESTORE_WARNINGS
200 md.type = SPARSE_MATRIX_TYPE_GENERAL;
201 mkl_sparse_d_mv(opt, a, A, md, x, b, r);
202 mkl_sparse_destroy(A);
213 FEAT_DISABLE_WARNINGS
214 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);
215 FEAT_RESTORE_WARNINGS
220void 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)
222 MKL_INT mrows = (MKL_INT)rows;
223 MKL_INT mcolumns = (MKL_INT)columns;
224 MKL_INT mblocksize = (MKL_INT)blocksize;
225 MKL_INT mcopysize = mcolumns * mblocksize;
230 scopy(&mcopysize, (
const float*)y, &one, r, &one);
233#ifndef FEAT_USE_MKL_LEGACY_SPMV
235 sparse_operation_t opt = SPARSE_OPERATION_NON_TRANSPOSE;
238 FEAT_DISABLE_WARNINGS
239 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);
240 FEAT_RESTORE_WARNINGS
242 md.type = SPARSE_MATRIX_TYPE_GENERAL;
243 mkl_sparse_s_mv(opt, a, A, md, x, b, r);
244 mkl_sparse_destroy(A);
255 FEAT_DISABLE_WARNINGS
256 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);
257 FEAT_RESTORE_WARNINGS
262void 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)
264 MKL_INT mrows = (MKL_INT)rows;
265 MKL_INT mcolumns = (MKL_INT)columns;
266 MKL_INT mblocksize = (MKL_INT)blocksize;
267 MKL_INT mcopysize = mcolumns * mblocksize;
272 dcopy(&mcopysize, (
const double*)y, &one, r, &one);
275#ifndef FEAT_USE_MKL_LEGACY_SPMV
277 sparse_operation_t opt = SPARSE_OPERATION_NON_TRANSPOSE;
280 FEAT_DISABLE_WARNINGS
281 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);
282 FEAT_RESTORE_WARNINGS
284 md.type = SPARSE_MATRIX_TYPE_GENERAL;
285 mkl_sparse_d_mv(opt, a, A, md, x, b, r);
286 mkl_sparse_destroy(A);
297 FEAT_DISABLE_WARNINGS
298 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);
299 FEAT_RESTORE_WARNINGS
304void 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)
306 MKL_INT mrows = (MKL_INT)rows;
307 MKL_INT mcolumns = (MKL_INT)columns;
312 scopy(&mrows, (
const float*)y, &one, r, &one);
314 cblas_sgemv(CblasRowMajor, CblasNoTrans, mrows, mcolumns, alpha, val, mcolumns, x, 1, beta, r, 1);
317void 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)
319 MKL_INT mrows = (MKL_INT)rows;
320 MKL_INT mcolumns = (MKL_INT)columns;
325 dcopy(&mrows, (
const double*)y, &one, r, &one);
327 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.