cv :: split () падает на процессоре Xeon, но работает в другом месте - PullRequest
0 голосов
/ 14 апреля 2019

Я использую готовый opencv lib & dll, версия 3.4.3 Winpack (скачано с официального сайта https://opencv.org/releases.html).

До сих пор все работало нормально, но недавно мой код начал падать. Это одна конкретная функция, которая вызывает этот сбой: cv :: split () . Это обычная утилита для извлечения каналов из массива cv :: Mat. Сбой происходит только на процессоре Xeon, Windows Server 2012. Независимо от предшествующих вызовов или контекста, он просто сразу падает на этот вызов, и приложение просто закрывается.
На других процессорах тот же .exe работает без проблем, код обычно тестируется на Windows 10 с обычными процессорами. У меня нет процессора Xeon под рукой, чтобы протестировать каждую функцию, но упомянутый сбой может быть воспроизведен на 100% на машине Xeon Gold , и я использовал довольно много различных библиотечных функций, и они работали там, так что это первый сбой.

Похоже, что во время выполнения некоторых функций просто содержатся команды, несовместимые с процессором Xeon, поэтому он просто падает там.

Вопрос: как заранее узнать, будет ли определенная функция openCV работать на процессоре Xeon или нет?

В настоящее время я только что удалил вызовы cv :: split () из своего кода и заменил их методами cv :: extractChannel (), что прекрасно работает на всех протестированных платформах. Я подозреваю, что одним из вариантов будет компиляция пользовательской версии библиотеки и отключение определенных инструкций, но для этого потребуются знания о том, что отключить и т. Д., Так что, честно говоря, я не в настроении Пользовательская скомпилированная версия для того, что кажется относительно «стандартной архитектурой» (процессор Xeon).

Что вы можете предложить, чтобы избежать этих ошибок?

Может быть, есть список функций openCV, которые, как известно, являются «специальными» (не для процессора Xeon, поэтому я могу их просто избежать)?

Пример кода:

# include  <opencv2/opencv.hpp>
int main ( int  argc,  char*  argv[] ) 
{
cv::Mat Patch = cv::imread ( "image.png", -1 );
cv::Mat Patch_planes[4];
cv::split ( Patch, Patch_planes );
return 0;
}

Команда компилятора (Microsoft (R) C / C ++, оптимизирующая версия компилятора 19.15.26732.1 для x64):

cl.exe "minim.cpp" /EHsc /W2 /I "c:\VCLIB\openCV-3.4.3" "c:\VCLIB\openCV-3.4.3\lib\opencv_world343.lib" /link /SUBSYSTEM:CONSOLE

1 Ответ

0 голосов
/ 14 апреля 2019

Как я заранее знаю, будет ли определенная функция openCV работать на процессоре Xeon или нет?

Нет.Компилятор будет использовать любые инструкции, которые он сочтет наиболее подходящими для компиляции любого конкретного фрагмента кода, с учетом ограничений, заданных в командной строке.

Таким образом, чтобы быть в безопасности (предполагая, что это ошибка «недопустимой инструкции»),вам, вероятно, нужно скомпилировать openCV для наименее способного процессора, который вам необходимо поддерживать, а затем проверить снижение производительности на других процессорах.Либо это, либо проверьте процессор в вашем установщике и установите версию openCV с учетом этого процессора.Юк, я тебе не завидую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...