如何在Cython中定义一个外部C ++函数,它将输入参数作为枚举? MKL

时间:2017-07-08 19:40:57

标签: c++ enums cython intel-mkl

所以试图将这个包装在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中看起来并不合适。

0 个答案:

没有答案