2017-02-11 16 views
0

通常、VBAで動作するdllに必要なstdcallの要件は、32ビットのdllにのみ適用されます。 64ビットdllでは呼び出し規約が1つしかないと私は思うので、理論的にはmkl_rt.dllから関数を宣言できるはずです。VBA ExcelのインテルMKL DLLからBLAS関数を宣言する

と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) 

しかし、どちらの方法I同じ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

DLL Dependecy Walkerは、mkl_rt.dllが他のDLLに依存していないことを示していましたが、すべてのMKL dllを1つのディレクトリに集めました。 たとえば、cblas_drotgを呼び出すときにロードされる他のDLLを調べると、次のようになります。

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