gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:58:12 25 4
gpt4 key购买 nike

我正在尝试使用Embarcadero C++ Builder 2010编写的程序使用Intel's MKL library中的某些函数。我遇到了一些奇怪的行为,其中调用MKL方法中的任何一个都会静默地终止应用程序。事实证明,调用任何方法时,库都在调用 TerminateProcess() 。我很难找到应用程序的确切终止位置,因为每次进入MKL方法并在CPU View 中逐条指令地跟踪指令时,都会在不同位置每次调用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等处放置了断点,并发现它正在调用 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

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

我也用其他几种MKL方法重现了这一点。使用 FFTW3 compatibility interface,有时会调用 fftwf_malloc(有时不会),并且总是在调用 fftwf_plan_dft_2d时发生。

更多细节
  • 我正在使用最新版本的2013 SP1。我只安装了IA32组件(因为CB2010是仅32位的编译器。)
  • 我正在链接single-DLL linking option,链接到mkl_rt.dll
  • 但是,由于mkl_rt.lib是一个COFF文件,因此我使用implib -a mkl_rt.lib mkl_rt.dll生成了一个新的.lib。尽管警告了数百个重复的符号,但它创建了一个看起来不错的库。
  • 下面的注释者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文件,方法原型(prototype)等出现问题(例如,从DLL加载并直接调用DftiCreateDescriptor_s_md)。行为未发生变化。
  • C interface for the DLL uses cdecl calling convention,这是默认情况下设置为使用的项目选项,然后进入方法的调用代码,我看到所有参数都被压入堆栈。每个函数似乎被正确调用。
  • 将动态加载的原型(prototype)更改为stdcall(即使应该找到cdecl版本)也会导致相同的问题-但值得检查。 The DLL, mkl_rt.dll, supports mostly only the cdecl versions.
  • 未将IDE设置为忽略任何异常。在“工具”>“选项”>“调试器选项”>“Embarcadero调试器”>“本机操作系统异常”部分中,所有异常都设置为由调试器处理。

  • 重现

    这是一个简单的命令行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:\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";"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:\program files (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 Advanced Poly List";"C:\Program Files (x86)\TMS Advanced Poly List\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:\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" -lDebug -v -G8 c0x32 Debug\mkltest.obj , Debug\MKLTest.exe , Debug\MKLTest.map , import32.lib cw32i.lib , ,



    最后的注意:我只是添加了δ标记,因为在相关的情况下它使用相同的RTL。我正在使用RAD Studio 2010,其中包括C++ Builder和Delphi。我将MKL放入的主要应用程序是用两种语言编写的。上面的测试应用是纯C语言。

    最佳答案

    我在使用mkl_rt.dllBorland时遇到了完全相同的问题,而您猜到了DftiCreateDescriptor

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

    关于c++ - 英特尔MKL函数在内部调用TerminateProcess(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19728499/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com