Я пытаюсь использовать некоторые функции из Библиотека Intel MKL, в программе, написанной на Embarcadero C ++ Builder 2010. Я сталкиваюсь с каким-то странным поведением, когда вызов любого из методов MKL молча завершает приложение. Оказывается, библиотека звонит TerminateProcess()
когда любой метод вызывается. У меня возникли некоторые проблемы с поиском точно, где заканчивается приложение, потому что вход в метод MKL и инструкция трассировки по инструкции в представлении ЦП вызывает в TerminateProcess
метод в разных местах каждый раз.
мой Угадай является то, что это ошибка, обнаруженная библиотекой. Насколько я могу судить, он вызывается из библиотеки MKL, а не из какой-либо другой части RTL или подпрограммы внешней ошибки или где-либо еще.
Что может вызвать это? Кто-нибудь успешно использовал MKL с программой C ++ Builder?
У меня есть следующий код, основанный на Двумерное БПФ (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 при рассмотрении в представлении ЦП, похоже, не в правильных методах. Скорее всего, это потому, что это код выпуска и отладчик не отслеживает стек вызовов должным образом … или может быть связано с проблемой.)
Я воспроизвел это с несколькими другими методами MKL тоже. С использованием Интерфейс совместимости FFTW3, иногда происходит вызов fftwf_malloc
(а иногда нет) и всегда происходит при звонке fftwf_plan_dft_2d
,
mkl_rt.dll
,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
DftiCreateDescriptor_s_md
из DLL.) Поведение остается неизменным.cdecl
соглашение о вызовах, это то, что параметры проекта установлены по умолчанию для использования, и входя в код вызова для метода, я вижу все параметры, помещаемые в стек. Кажется, что каждая функция вызывается правильно.stdcall
(хотя это должен находить cdecl
версия) вызвала ту же проблему — но это стоило проверить. DLL, mkl_rt.dll, поддерживает в основном только cdecl
версии.Вот простая программа 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;
}
Командная строка BCB, в которой IDE создает это:
c: \ program files (x86) \ embarcadero \ rad studio \ 7.0 \ bin \ bcc32.exe
-D_DEBUG -D_RTLDLL; _NO_VCL -I «…» -y -Q -k -k-r-c -tWC -C8 -oDebug \ mkltest.obj -w-par -Od -v -vi- -H = Отладка \ 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: \ проекты \ Misc \ DirectX \ Direct3D \ Tutorials \ Tut05_Textures;» C: \ Program
Файлы (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
файлы (x86) \ embarcadero \ rad studio \ 7.0 \ Virtual
Treeview \ Source «;» c: \ program files (x86) \ embarcadero \ rad
studio \ 7.0 \ Virtual Treeview \ Delphi «;» c: \ программные файлы
(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
файлы (x86) \ embarcadero \ rad
studio \ 7.0 \ Toolbar2000 \ SpTBXLib \ Source «;» c: \ программные файлы
(X86) \ Embarcadero \ радиан
studio \ 7.0 \ AutomatedQADocking \ Source «;» C: \ Program Files (x86) \ TMS
Расширенный список поли «;» 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 = Отладка \ 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: \ проекты \ 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: \ программные файлы
(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
файлы (x86) \ embarcadero \ rad
studio \ 7.0 \ AutomatedQADocking \ Source «;» C: \ Program Files (x86) \ TMS
Расширенный список поли «;» 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: \ проекты \ 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: \ программные файлы
(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
файлы (x86) \ embarcadero \ rad
studio \ 7.0 \ AutomatedQADocking \ Source «;» C: \ Program Files (x86) \ TMS
Расширенный список поли «;» 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.
Задача ещё не решена.
Других решений пока нет …