Итак, пытаясь обернуть это в Cython из MKL и копаясь в mkl_cblas.h
, я вижу, что это перечисления:
typedef enum {CblasRowMajor=101, CblasColMajor=102} CBLAS_ORDER;
typedef enum {CblasNoTrans=111, CblasTrans=112, CblasConjTrans=113} CBLAS_TRANSPOSE;
А вот и объявление функции:
void cblas_dgemm(const CBLAS_LAYOUT Layout, const CBLAS_TRANSPOSE TransA,
const CBLAS_TRANSPOSE TransB, const MKL_INT M, const MKL_INT N,
const MKL_INT K, const double alpha, const double *A,
const MKL_INT lda, const double *B, const MKL_INT ldb,
const double beta, double *C, const MKL_INT ldc);
Документация Cython отсутствует в этой области, так как кажется, что предлагается преобразовать все в int
, но затем функция MKL жалуется, что я не передал ей правильный тип (enums
CBLAS_LAYOUT
и CBLAS_TRANSPOSE
не являются типом int
).
Каков правильный способ определить их из Cython? То есть:
cimport cython
cdef extern from "mkl.h" nogil:
ctypedef enum CBLAS_LAYOUT:
CblasRowMajor
CblasColMajor
ctypedef enum CBLAS_TRANSPOSE:
CblasNoTrans
CblasTrans
CblasConjTrans
void dgemm "cblas_dgemm"(CBLAS_LAYOUT Layout,
CBLAS_TRANSPOSE TransA,
CBLAS_TRANSPOSE TransB,
int M,
int N,
int K,
double alpha,
double *A,
int lda,
double *B,
int ldb,
double beta,
double *C,
int ldc
)
Вышеприведенное компилируется без ошибок. Но я не получил результатов в C
(пока я не изменил его на CblasColMajor
, вызвав dgemm
после того, как опубликовал это). Поэтому интересно, подтвердит ли кто-нибудь, правильно ли это сделать.
Я профилировал вышеуказанное по сравнению со встроенной версией SciPy
Использование интерфейса Scipy cython_blas от Cython не работает с векторами Mx1 1xN, и они имеют примерно одинаковую скорость (мой SciPy
связан с MKL), поэтому я предполагаю, что вышеизложенное верно, но если есть лучший/быстрый способ сделать это, пожалуйста, напишите предложения. Тем не менее, я оставлю это опубликованным для других, так как это не выглядит хорошо задокументированным в Cython.