cv :: split()在Xeon处理器上崩溃,但在其他地方工作

时间:2019-04-14 17:13:47

标签: c++ windows opencv crash

我正在使用预构建的opencv lib和dll,版本3.4.3 Winpack(从官方网站https://opencv.org/releases.html下载)。

到现在,一切正常,但是最近我的代码开始崩溃。 这是导致崩溃的一个特定函数: cv :: split()。提取频道是常见的实用程序功能 来自cv :: Mat数组。该崩溃仅发生在Windows Server 2012的Xeon处理器上。无论之前的调用或上下文如何,崩溃都只会在此调用上立即崩溃,并且应用程序仅关闭。 在其他处理器上,相同的.exe可以正常工作,并且通常在Windows 10上使用普通处理器测试代码。我没有使用至强处理器来测试每个功能,但是提到的崩溃可以在 Xeon Gold 机器上100%再现,并且我使用了很多不同的库函数,并且它们在那里工作,因此它是第一个崩溃的。

似乎某些函数的运行时仅包含与Xeon处理器不兼容的指令,因此它在那里崩溃。

问题:我如何预先知道某些openCV功能在Xeon处理器上是否可以工作?

目前,我刚刚从代码中删除了cv :: split()调用,并通过cv :: extractChannel()方法替换了它,该方法在所有经过测试的平台上都可以正常工作。我怀疑一个选择是编译lib的自定义版本并禁用特定的指令,但是那将需要禁用的知识,等等,所以坦率地说,我不愿意 针对似乎相对“标准架构”(至强处理器)的定制编译版本。

您如何建议避免这些错误?

也许有一系列已知为“特殊”的openCV函数(不适用于至强处理器,所以我可以避免使用它们)?

代码示例:

# 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;
}

编译器命令(针对x64的Microsoft(R)C / C ++优化编译器版本19.15.26732.1):

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 :(得分:0)

  

我如何事先知道某些openCV功能在Xeon处理器上是否可以工作?

你不知道。编译器将使用它认为最适合的任何指令来编译任何特定的代码段,但要遵循命令行中给出的约束。

因此,为了安全起见(假设这是一个“非法指令”错误),您可能确实需要为需要支持的功能最差的处理器编译openCV,然后检查其他处理器的性能是否达到标准。要么检查安装程序中的CPU,然后安装适合该处理器的openCV版本。 k,我不羡慕你。