3

我正在尝试在使用Embarcadero C++ Builder 2010 编写的程序中使用英特尔 MKL 库中的一些函数。我遇到了一些奇怪的行为,即调用任何一种 MKL 方法都会静默终止应用程序。事实证明,TerminateProcess()当调用任何方法时,库正在调用。我在找到应用程序终止的确切位置时遇到了一些麻烦,因为每次进入 MKL 方法并在 CPU 视图中逐条指令跟踪都会调用TerminateProcess不同位置的方法。

我的猜测是这是库捕获的错误情况。 据我所知,它是从 MKL 库中调用的,而不是从 RTL 的任何其他部分或外部错误例程或其他任何地方调用的。

什么可能导致这种情况?有没有人成功地将 MKL 与 C++Builder 程序一起使用?

症状

我有以下代码,基于二维 FFT(C 接口)示例:

DFTI_DESCRIPTOR_HANDLE hDesc;
MKL_LONG alDimensions[2];
alDimensions[0] = 32; // Array dimensions
alDimensions[1] = 100;
MKL_LONG lStatus = DftiCreateDescriptor(&hDesc, DFTI_SINGLE, DFTI_COMPLEX, 2, alDimensions);

当调用DftiCreateDescriptor. 因此,为了进行调查,我踏入了功能并走过了大会。它跳转到MKL_RT.DftiCreateDescriptor_s_md,然后我可以翻阅十页或更多页的程序集。在某些时候,它call的地址会变成TerminateProcess. 但是,它执行此操作的点感觉是随机的。例如,在某一时刻,我将它缩小到一个调用语句和地址,只是在我下次运行程序时它崩溃了。 编辑:ExitProcess自从我第一次问这个问题以来,我在, TerminateProcess,等处放置了断点TerminateThread,发现它正在调用TerminateProcess. (最初我不知道它为什么会无声地终止。)它这样做的点仍然在变化。没有有用的调用堆栈(这是测试程序,来源如下):

:7540d79a kernel32.TerminateProcess
:5be911c9 ; C:\projects\mkl crash\Debug\MKL_RT.DLL
:5be837bd ; C:\projects\mkl crash\Debug\MKL_RT.DLL
:004013C5 main(argc=1, argv=:008B9908)
:32ad2342 ; C:\Windows\SysWOW64\CC32100.DLL

(这两个 MKL_RT.dll 行,在 CPU 视图中检查时,似乎没有使用正确的方法。这可能是因为它是发布代码并且调试器没有正确跟踪调用堆栈......或者它可能与问题有关。)

我也用其他几种 MKL 方法重现了这一点。使用FFTW3 兼容接口,有时会出现调用fftwf_malloc(有时不会),调用时总是出现fftwf_plan_dft_2d

更多细节

  • 我正在使用最新版本,2013 SP1。我只安装了 IA32 组件(因为 CB2010 是一个仅限 3​​2 位的编译器。)
  • 我正在使用单 DLL 链接选项进行链接,链接到mkl_rt.dll.
  • 但是,由于 mkl_rt.lib 是一个 COFF 文件,我使用 .lib 生成了一个新的 .lib implib -a mkl_rt.lib mkl_rt.dll。它创建了一个看起来不错的库,尽管警告了数百个重复符号。
  • 下面的评论者 greatwolf 建议了一个不同的implib命令implib -a -c mkl_rt.lib mkl_rt.dll,来保留方法名称的大小写。这导致的重复名称警告要少得多,但不会链接:[ILINK32 Error] Fatal: Exceeded memory limit for block Import symbols in module _vsrnggumbel
  • 我还尝试动态加载库和函数,以防 .lib 文件、方法原型等出现问题(例如,加载并直接DftiCreateDescriptor_s_md从 DLL 调用)。行为没有改变。
  • DLL的C 接口使用cdecl调用约定,这是项目选项设置为默认使用的内容,并单步执行方法的调用代码,我看到所有参数都被压入堆栈。每个函数似乎都被正确调用。
  • 将我的动态加载原型更改为stdcall(即使它应该找到cdecl版本)也会导致同样的问题 - 但值得检查。DLL mkl_rt.dll 主要只支持cdecl版本。
  • IDE 未设置为忽略任何异常。在 Tools > Options > Debugger Options > Embarcadero Debuggers > Native OS Exceptions 部分中,所有异常都设置为由调试器处理。

复制

这是一个简单的命令行 C 程序,足以演示崩溃:

#include <stdio.h>
#pragma hdrstop

#include <tchar.h>
// Intel MLK
#include "mkl/include/mkl.h"
#pragma comment(lib, "mkl/mkl_rt.lib") // Generated with implib

int _tmain(int argc, _TCHAR* argv[]) {
    DFTI_DESCRIPTOR_HANDLE hDesc;
    MKL_LONG lStatus;
    MKL_LONG alDimensions[2];
    alDimensions[0] = 32; 
    alDimensions[1] = 100;
    lStatus = DftiCreateDescriptor(&hDesc, DFTI_SINGLE, DFTI_COMPLEX, 2, alDimensions);

    // Here, you would normal declare your arrays (32x100) of _Complex, and call DftiCommitDescriptor,
    // DftiComputeForward, DftiFreeDescriptor - but it will have already terminated
    // on the line above.

    return 0;
}

IDE 用来构建它的 BCB 命令行是:

c:\program files (x86)\embarcadero\rad studio\7.0\bin\bcc32.exe -D_DEBUG -D_RTLDLL;_NO_VCL -I"..." -y -Q -k -r- -c -tWC -C8 - oDebug\mkltest.obj -w-par -Od -v -vi- -H=Debug\MKLTest.pch -H mkltest.c

和链接:

c:\program files (x86)\embarcadero\rad studio\7.0\bin\ilink32.exe -LDebug;"...";"..." -lDebug -v -G8 c0x32 Debug\mkltest.obj , Debug\ MKLTest.exe , Debug\MKLTest.map , import32.lib cw32i.lib , ,

我省略了大量的包含路径。为了完整起见,整行是:

c:\program files (x86)\embarcadero\rad studio\7.0\bin\bcc32.exe -D_DEBUG -D_RTLDLL;_NO_VCL -I"C:\Program Files (x86)\EurekaLab\EurekaLog 6\Cbuilder14";C:\ projects\Misc\DirectX\Direct3D\Tutorials\Tut05_Textures;"C:\Program Files (x86)\Embarcadero\RAD Studio\7.0\include\boost_1_39\boost\tr1\tr1";"c:\program files (x86)\ embarcadero\rad studio\7.0\include";"c:\program files (x86)\embarcadero\rad studio\7.0\include\dinkumware";"c:\program files (x86)\embarcadero\rad studio\7.0\include \vcl";"C:\Program Files (x86)\Embarcadero\RAD Studio\7.0\include\boost_1_39";"c:\program files (x86)\embarcadero\rad studio\7.0\include";"c:\程序文件 (x86)\embarcadero\rad studio\7.0\include\vcl";"c:\program files (x86)\embarcadero\rad studio\7.0\ObjRepos\Cpp";"c:\program files (x86)\embarcadero\rad studio\7.0\include\Indy10";"c:\program files (x86)\embarcadero\rad studio\7.0\Virtual Treeview\Common ";"c:\program files (x86)\embarcadero\rad studio\7.0\Virtual Treeview\Source";"c:\program files (x86)\embarcadero\rad studio\7.0\Virtual Treeview\Delphi";"c :\program files (x86)\embarcadero\rad studio\7.0\include\boost_1_39";"c:\program files (x86)\embarcadero\rad studio\7.0\Toolbar2000\TB2K\Lib\D12";"c:\程序文件 (x86)\embarcadero\rad studio\7.0\Toolbar2000\SpTBXLib\Source";"c:\program files (x86)\embarcadero\rad studio\7.0\AutomatedQADocking\Source";"C:\Program Files (x86 )\TMS 高级多边形列表";"C:\Program Files (x86)\TMS 高级多边形列表\Builder2010";"C:\Program Files (x86)\EurekaLab\EurekaLog 6\CBuilder14";"c:\program files (x86)\embarcadero\rad studio\7.0\Abbrevia\source" -y -Q -k -r- -c -tWC -C8 -oDebug\mkltest.obj -w-par -Od -v -vi- -H=Debug\MKLTest.pch -H mkltest.c

和链接:

c:\program files (x86)\embarcadero\rad studio\7.0\bin\ilink32.exe -LDebug;"c:\program files (x86)\embarcadero\rad studio\7.0\lib\debug";"C:\ Program Files (x86)\EurekaLab\EurekaLog 6\Cbuilder14";C:\projects\Misc\DirectX\Direct3D\Tutorials\Tut05_Textures;"c:\program files (x86)\embarcadero\rad studio\7.0\lib";" c:\program files (x86)\embarcadero\rad studio\7.0\lib\obj";"c:\program files (x86)\embarcadero\rad studio\7.0\lib\psdk";"C:\Program Files ( x86)\EurekaLab\EurekaLog 6\CBuilder14";"c:\program files (x86)\embarcadero\rad studio\7.0\lib";"c:\program files (x86)\embarcadero\rad studio\7.0\lib\ psdk";"c:\program files (x86)\embarcadero\rad studio\7.0\lib\Indy10";"c:\program files (x86)\embarcadero\rad studio\7.0\Toolbar2000\TB2K\Lib\D12";"c:\program files (x86)\embarcadero\rad studio\7.0\AutomatedQADocking\Source";"C:\Program Files (x86)\TMS Advanced Poly List";" C:\Program Files (x86)\TMS Advanced Poly List\Builder2010";"C:\Program Files (x86)\EurekaLab\EurekaLog 6\CBuilder14";"C:\Users\Public\Documents\RAD Studio\7.0\ DCP" -jDebug;"c:\program files (x86)\embarcadero\rad studio\7.0\lib\debug";"C:\Program Files (x86)\EurekaLab\EurekaLog 6\Cbuilder14";C:\projects\ Misc\DirectX\Direct3D\Tutorials\Tut05_Textures;"c:\program files (x86)\embarcadero\rad studio\7.0\lib";"c:\program files (x86)\embarcadero\rad studio\7.0\lib\obj ";"c:\程序文件 (x86)\embarcadero\rad studio\7.0\lib\psdk";"C:\Program Files (x86)\EurekaLab\EurekaLog 6\CBuilder14";"c:\program files (x86)\embarcadero\rad studio\7.0\lib";"c:\program files (x86)\embarcadero\rad studio\ 7.0\lib\psdk";"c:\program files (x86)\embarcadero\rad studio\7.0\lib\Indy10";"c:\program files (x86)\embarcadero\rad studio\7.0\Toolbar2000\TB2K\ Lib\D12";"c:\program files (x86)\embarcadero\rad studio\7.0\AutomatedQADocking\Source";"C:\Program Files (x86)\TMS Advanced Poly List";"C:\Program Files ( x86)\TMS Advanced Poly List\Builder2010";"C:\Program Files (x86)\EurekaLab\EurekaLog 6\CBuilder14";"C:\Users\Public\Documents\RAD Studio\7.0\DCP" -lDebug -v -G8 c0x32 Debug\mkltest.obj , Debug\MKLTest.exe , Debug\MKLTest.map , import32.lib cw32i.lib , ,\program files (x86)\embarcadero\rad studio\7.0\lib";"c:\program files (x86)\embarcadero\rad studio\7.0\lib\psdk";"c:\program files (x86)\embarcadero \rad studio\7.0\lib\Indy10";"c:\program files (x86)\embarcadero\rad studio\7.0\Toolbar2000\TB2K\Lib\D12";"c:\program files (x86)\embarcadero\rad studio\7.0\AutomatedQADocking\Source";"C:\Program Files (x86)\TMS Advanced Poly List";"C:\Program Files (x86)\TMS Advanced Poly List\Builder2010";"C:\Program Files ( x86)\EurekaLab\EurekaLog 6\CBuilder14";"C:\Users\Public\Documents\RAD Studio\7.0\DCP" -lDebug -v -G8 c0x32 Debug\mkltest.obj , Debug\MKLTest.exe , Debug\MKLTest .map , import32.lib cw32i.lib , ,\program files (x86)\embarcadero\rad studio\7.0\lib";"c:\program files (x86)\embarcadero\rad studio\7.0\lib\psdk";"c:\program files (x86)\embarcadero \rad studio\7.0\lib\Indy10";"c:\program files (x86)\embarcadero\rad studio\7.0\Toolbar2000\TB2K\Lib\D12";"c:\program files (x86)\embarcadero\rad studio\7.0\AutomatedQADocking\Source";"C:\Program Files (x86)\TMS Advanced Poly List";"C:\Program Files (x86)\TMS Advanced Poly List\Builder2010";"C:\Program Files ( x86)\EurekaLab\EurekaLog 6\CBuilder14";"C:\Users\Public\Documents\RAD Studio\7.0\DCP" -lDebug -v -G8 c0x32 Debug\mkltest.obj , Debug\MKLTest.exe , Debug\MKLTest .map , import32.lib cw32i.lib , ,\program files (x86)\embarcadero\rad studio\7.0\lib\psdk";"c:\program files (x86)\embarcadero\rad studio\7.0\lib\Indy10";"c:\program files (x86) \embarcadero\rad studio\7.0\Toolbar2000\TB2K\Lib\D12";"c:\program files (x86)\embarcadero\rad studio\7.0\AutomatedQADocking\Source";"C:\Program Files (x86)\TMS高级多边形列表";"C:\Program Files (x86)\TMS 高级多边形列表\Builder2010";"C:\Program Files (x86)\EurekaLab\EurekaLog 6\CBuilder14";"C:\Users\Public\Documents \RAD Studio\7.0\DCP" -lDebug -v -G8 c0x32 Debug\mkltest.obj , Debug\MKLTest.exe , Debug\MKLTest.map , import32.lib cw32i.lib , ,\program files (x86)\embarcadero\rad studio\7.0\lib\psdk";"c:\program files (x86)\embarcadero\rad studio\7.0\lib\Indy10";"c:\program files (x86) \embarcadero\rad studio\7.0\Toolbar2000\TB2K\Lib\D12";"c:\program files (x86)\embarcadero\rad studio\7.0\AutomatedQADocking\Source";"C:\Program Files (x86)\TMS高级多边形列表";"C:\Program Files (x86)\TMS 高级多边形列表\Builder2010";"C:\Program Files (x86)\EurekaLab\EurekaLog 6\CBuilder14";"C:\Users\Public\Documents \RAD Studio\7.0\DCP" -lDebug -v -G8 c0x32 Debug\mkltest.obj , Debug\MKLTest.exe , Debug\MKLTest.map , import32.lib cw32i.lib , ,0\Toolbar2000\TB2K\Lib\D12";"c:\program files (x86)\embarcadero\rad studio\7.0\AutomatedQADocking\Source";"C:\Program Files (x86)\TMS Advanced Poly List";" C:\Program Files (x86)\TMS Advanced Poly List\Builder2010";"C:\Program Files (x86)\EurekaLab\EurekaLog 6\CBuilder14";"C:\Users\Public\Documents\RAD Studio\7.0\ DCP" -lDebug -v -G8 c0x32 Debug\mkltest.obj , Debug\MKLTest.exe , Debug\MKLTest.map , import32.lib cw32i.lib , ,0\Toolbar2000\TB2K\Lib\D12";"c:\program files (x86)\embarcadero\rad studio\7.0\AutomatedQADocking\Source";"C:\Program Files (x86)\TMS Advanced Poly List";" C:\Program Files (x86)\TMS Advanced Poly List\Builder2010";"C:\Program Files (x86)\EurekaLab\EurekaLog 6\CBuilder14";"C:\Users\Public\Documents\RAD Studio\7.0\ DCP" -lDebug -v -G8 c0x32 Debug\mkltest.obj , Debug\MKLTest.exe , Debug\MKLTest.map , import32.lib cw32i.lib , ,-lDebug -v -G8 c0x32 Debug\mkltest.obj , Debug\MKLTest.exe , Debug\MKLTest.map , import32.lib cw32i.lib , ,-lDebug -v -G8 c0x32 Debug\mkltest.obj , Debug\MKLTest.exe , Debug\MKLTest.map , import32.lib cw32i.lib , ,

最后说明:我刚刚添加了 [delphi] 标签,因为它使用相同的 RTL,以防万一。我正在使用 RAD Studio 2010,它包括 C++ Builder 和 Delphi。我将 MKL 放入的主要应用程序是用两种语言编写的。上面的测试应用程序是纯 C 的。

4

1 回答 1

1

我对mkl_rt.dlland有完全相同的问题Borland,你猜对了,DftiCreateDescriptor.

我怀疑它与mkl threading有关。
无论如何,我的解决方案是将mkl调用包装在 32 位Visual Studio DLL中。我会让自己知道我Borland会跑。Visual Studio DLL将静态链接mkl,但需要libiomp5md.dll. 我知道这行得通,因为我基本上已经在这样做了。

于 2019-12-05T22:47:03.667 回答