英特尔MKL函数在内部调用TerminateProcess()

时间:2013-11-01 14:13:39

标签: c++ delphi c++builder intel-mkl c++builder-2010

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

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

可能是什么原因引起的?有没有人成功地将MKL与C ++ Builder程序一起使用?

症状

我有以下代码,基于Two-dimensional FFT (C Interface)示例:

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的地址。然而,它做到这一点的感觉是随机的。例如,有一次,我把它缩小到一个调用语句和地址,只是在我下次运行程序之前让它崩溃。 修改:自从我第一次提出这个问题以来,我在ExitProcessTerminateProcessTerminateThread等处设置了断点,并发现它正在调用{{1} }。 (原来我不知道为什么它会默默地终止。)它这样做的地方仍然会发生变化。没有有用的调用堆栈(这是测试程序,下面的源代码):

TerminateProcess

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

我也用其他几种MKL方法复制了这个。使用FFTW3 compatibility interface时,有时会调用: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 (有时不会),并且在调用fftwf_malloc时总是会发生。

更多详情

  • 我使用的是最新版本,2013 SP1。我只安装了IA32组件(因为CB2010只是一个32位编译器。)
  • 我正在与single-DLL linking option建立关联,并链接到fftwf_plan_dft_2d
  • 但是,由于mkl_rt.lib是COFF文件,因此我使用mkl_rt.dll生成了一个新的.lib。它创造了一个看似很好的图书馆,虽然警告了数百个重复的符号。
  • 下面的评论家大狼建议使用不同的implib -a mkl_rt.lib mkl_rt.dll命令implib来保留方法名称大小写。这导致重复名称警告的次数减少,但不会链接:implib -a -c mkl_rt.lib mkl_rt.dll
  • 我还尝试动态加载库和函数,以防.lib文件,方法原型等出现问题(例如,从DLL加载并直接调用[ILINK32 Error] Fatal: Exceeded memory limit for block Import symbols in module _vsrnggumbel。)行为是不变。
  • C interface for the DLL uses cdecl calling convention,这是项目选项默认设置使用的内容,并踩到方法的调用代码,我看到所有参数都被推送到堆栈上。似乎正在正确调用每个函数。
  • 将我动态加载的原型更改为DftiCreateDescriptor_s_md(即使它应该找到stdcall版本)也会导致同样的问题 - 但值得检查。 The DLL, mkl_rt.dll, supports mostly only the cdecl versions.
  • IDE未设置为忽略任何异常。在工具>选项>调试器选项> Embarcadero调试器>本机操作系统异常部分,所有异常都设置为由调试器处理。

再生

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

cdecl

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;" ...&#34 ;;" ..." -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&#34 ;; C:\项目\其它\的DirectX \的Direct3D \教程\ Tut05_Textures;" C:\程序   文件(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&#34 ;;" c:\ program files   (x86)\ embarcadero \ rad studio \ 7.0 \ include \ vcl";" C:\ Program Files   (x86)\ Embarcadero \ RAD Studio \ 7.0 \ include \ boost_1_39&#34 ;;" c:\ program files   (x86)\ embarcadero \ rad studio \ 7.0 \ include";" c:\ program files   (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&#34 ;;" c:\ program files(x86)\ embarcadero \ rad   studio \ 7.0 \ Virtual Treeview \ Delphi&#34 ;;" 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&#34 ;;" c:\ program   files(x86)\ embarcadero \ rad   studio \ 7.0 \ Toolbar2000 \ SpTBXLib \ Source&#34 ;;" c:\ program files   (86)\ Embarcadero的\拉德   studio \ 7.0 \ AutomatedQADocking \ Source&#34 ;;" C:\ Program Files(x86)\ TMS   高级多边形列表&#34 ;;" C:\ Program Files(x86)\ TMS Advanced Poly   List \ Builder2010";" C:\ Program Files(x86)\ EurekaLab \ EurekaLog   6 \ CBuilder14";" c:\ program files(x86)\ embarcadero \ rad   工作室\ 7.0 \ Abbrevia \源" -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&#34 ;;" C:\ Program Files(x86)\ EurekaLab \ EurekaLog   6 \ Cbuilder14&#34 ;; C:\项目\其它\的DirectX \的Direct3D \教程\ Tut05_Textures;" C:\程序   files(x86)\ embarcadero \ rad studio \ 7.0 \ lib&#34 ;;" 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&#34 ;;" c:\ program files   (x86)\ embarcadero \ rad studio \ 7.0 \ lib&#34 ;;" 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&#34 ;;" c:\ program   files(x86)\ embarcadero \ rad   studio \ 7.0 \ AutomatedQADocking \ Source&#34 ;;" C:\ Program Files(x86)\ TMS   高级多边形列表&#34 ;;" 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&#34 ;;" C:\ Program Files(x86)\ EurekaLab \ EurekaLog   6 \ Cbuilder14&#34 ;; C:\项目\其它\的DirectX \的Direct3D \教程\ Tut05_Textures;" C:\程序   files(x86)\ embarcadero \ rad studio \ 7.0 \ lib&#34 ;;" 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&#34 ;;" c:\ program files   (x86)\ embarcadero \ rad studio \ 7.0 \ lib&#34 ;;" 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&#34 ;;" c:\ program   files(x86)\ embarcadero \ rad   studio \ 7.0 \ AutomatedQADocking \ Source&#34 ;;" C:\ Program Files(x86)\ TMS   高级多边形列表&#34 ;;" 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 ,,

最后注意:我刚刚添加了[delphi]标记,因为它使用相同的RTL,以防相关。我使用的是RAD Studio 2010,其中包括C ++ Builder和Delphi。我用MKL编写的主要应用程序是用两种语言编写的。上面的测试应用程序是纯C。

1 个答案:

答案 0 :(得分:0)

我在mkl_rt.dllBorland上遇到了完全相同的问题,而你猜对了,DftiCreateDescriptor

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