我正在使用预构建的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
答案 0 :(得分:0)
我如何事先知道某些openCV功能在Xeon处理器上是否可以工作?
你不知道。编译器将使用它认为最适合的任何指令来编译任何特定的代码段,但要遵循命令行中给出的约束。
因此,为了安全起见(假设这是一个“非法指令”错误),您可能确实需要为需要支持的功能最差的处理器编译openCV,然后检查其他处理器的性能是否达到标准。要么检查安装程序中的CPU,然后安装适合该处理器的openCV版本。 k,我不羡慕你。