所以试图将这个包装在MKL的Cython中,然后挖掘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
{{ 1}}和CBLAS_LAYOUT
不是CBLAS_TRANSPOSE
}类型。
从Cython中定义这些内容的正确方法是什么?即:
int
以上编译正常,没有错误。但我没有在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
内置版本Using the Scipy cython_blas interface from Cython not working on vectors Mx1 1xN的内容,并且它们的速度相同(我的SciPy
与MKL相关联),所以我想象以上是正确的,但如果有更好/更快的方式,请发布建议。尽管如此,我还是会将其发布给其他人,因为它在Cython中看起来并不合适。