Как определить в Cython внешнюю функцию C++, которая имеет входные параметры в виде перечислений? МКЛ

Итак, пытаясь обернуть это в 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.


person Matt    schedule 08.07.2017    source источник