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

cv::split() crashes on Xeon processor but works elsewhere

本文关键字:崩溃 其他 地方工作 split cv 处理器      更新时间:2023-10-16

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

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

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

问题:我如何提前知道某些 openCV 功能在至强处理器上是否有效?

目前,我刚刚从代码中删除了cv::split()调用,并通过cv::extractChannel()方法对其进行了重新处理,该方法在所有测试平台上都可以正常工作。我怀疑一种选择是编译库的自定义版本并禁用特定指令,但这需要了解要禁用的内容等,所以坦率地说,我没有心情参与 自定义编译版本,用于看似相对"标准架构"(至强处理器)。

您有什么建议可以避免这些错误?

也许有一个已知是"特殊"的 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;
}

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

cl.exe "minim.cpp" /EHsc /W2 /I "c:VCLIBopenCV-3.4.3" "c:VCLIBopenCV-3.4.3libopencv_world343.lib" /link /SUBSYSTEM:CONSOLE

我如何提前知道某些 openCV 功能在至强处理器上是否有效?

你没有。 编译器将使用它认为最适合编译任何特定代码段的任何指令,但须遵守命令行上给出的约束。

因此,为了安全起见(假设这是一个"非法指令"错误),您可能确实需要为需要支持的功能最差的处理器编译 openCV,然后检查其他处理器的性能影响。 要么检查安装程序中的CPU,然后安装针对该处理器量身定制的openCV版本。 哎呀,我不羡慕你。