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 *);
任何提示?
答案 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