在VBA Excel中声明来自英特尔MKL dll的BLAS功能

时间:2017-02-11 21:41:23

标签: excel vba dll blas intel-mkl

dll在VBA中工作通常需要的stdcall要求仅适用于32位dll。在64位dll中,我认为只有一个调用约定,所以理论上我应该能够从mkl_rt.dll声明函数。

事实上,使用64位OpenBLAS(libopenbas.dll),我能够声明对fortran BLAS函数(而不是cblas)的调用,并且它可以正常工作:

Public Declare PtrSafe Sub dgemm Lib "libopenblas.dll" (ByVal transa As String, _
                                                    ByVal transb As String, _
                                                    ByRef m As Long, _
                                                    ByRef n As Long, _
                                                    ByRef k As Long, _
                                                    ByRef alpha As Double, _
                                                    ByRef a As Double, _
                                                    ByRef lda As Long, _
                                                    ByRef b As Double, _
                                                    ByRef ldb As Long, _
                                                    ByRef beta As Double, _
                                                    ByRef c As Double, _
                                                    ByRef ldc As Long)

但无论我尝试相同的方法都不适用于64位mkl_rt.dll,或者至少我找不到正确的方式来声明对mkl_rt.dll的调用。 Excel只是在打电话时悄然退出。

原因是什么?

MKL标题与OpenBLAS略有不同,不确定它是否与此有关。

MKL:

void DGEMM(const char *transa, const char *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);

OpenBLAS:

void BLASFUNC(dgemm)(char *, char *, blasint *, blasint *, blasint *, double *, double *, blasint *, double *, blasint *, double *, double *, blasint *);

任何提示?

1 个答案:

答案 0 :(得分:0)

DLL Dependecy Walker表明mkl_rt.dll不依赖于其他dll,但无论如何我将所有MKL dll聚集在一个目录中。 在调用例如cblas_drotg时查看其他dll加载时,会显示以下内容:

libiomp5md.dll
mkl_avx2.dll
mkl_core.dll
mkl_intel_thread.dll
mkl_rt.dll