我正在尝试使用来自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
的地址。然而,它做到这一点的感觉是随机的。例如,有一次,我把它缩小到一个调用语句和地址,只是在我下次运行程序之前让它崩溃。 修改:自从我第一次提出这个问题以来,我在ExitProcess
,TerminateProcess
,TerminateThread
等处设置了断点,并发现它正在调用{{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
时总是会发生。
fftwf_plan_dft_2d
。mkl_rt.dll
生成了一个新的.lib。它创造了一个看似很好的图书馆,虽然警告了数百个重复的符号。implib -a mkl_rt.lib mkl_rt.dll
命令implib
来保留方法名称大小写。这导致重复名称警告的次数减少,但不会链接:implib -a -c mkl_rt.lib mkl_rt.dll
[ILINK32 Error] Fatal: Exceeded memory limit for block Import symbols in module _vsrnggumbel
。)行为是不变。cdecl
calling convention,这是项目选项默认设置使用的内容,并踩到方法的调用代码,我看到所有参数都被推送到堆栈上。似乎正在正确调用每个函数。DftiCreateDescriptor_s_md
(即使它应该找到stdcall
版本)也会导致同样的问题 - 但值得检查。 The DLL, mkl_rt.dll, supports mostly only the cdecl
versions. 这是一个简单的命令行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。
答案 0 :(得分:0)
我在mkl_rt.dll
和Borland
上遇到了完全相同的问题,而你猜对了,DftiCreateDescriptor
。
我怀疑它与 mkl线程有关。
无论如何,我的解决方案都是将 mkl 调用包装在32位Visual Studio
DLL 中。我会让自己知道Borland
可以运行。 Visual Studio
DLL 将静态链接 mkl ,但需要libiomp5md.dll
。我知道这行得通,因为我已经基本上在这样做了。