【发布时间】:2019-09-04 18:31:37
【问题描述】:
我正在使用预构建的 opencv lib & dll,版本 3.4.3 Winpack(从官方网站https://opencv.org/releases.html 下载)。
到目前为止一切正常,但最近我的代码开始崩溃。
这是导致此崩溃的一个特定函数:cv::split()。提取通道是常用的实用功能
来自 cv::Mat 数组。崩溃仅发生在 Xeon 处理器 Windows Server 2012 上。无论之前的调用或上下文如何,它都会在此调用时立即崩溃,并且应用程序会关闭。
在其他处理器上,相同的 .exe 可以正常工作,该代码通常在 Windows 10 上使用普通处理器进行测试。我手头没有 Xeon 处理器来测试每个功能,但是提到的崩溃可以在 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;
}
编译器命令(Microsoft (R) C/C++ Optimizing Compiler Version 19.15.26732.1 for 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
【问题讨论】:
-
提供minimal reproducible example 来重现这个。 |定义“至强”——英特尔已经使用这个名称制造芯片已有 20 年了,您必须更加具体。 |调试版本会发生这种情况吗?您能否获得有关确切错误的回溯和其他详细信息?其他版本会发生这种情况吗?您是否在 OpenCV 问题跟踪器上报告了问题并提供了所有详细信息?
-
@DanMašek 添加了代码示例。就我而言,它是 Xeon Gold 处理器。我不拥有这台机器,也没有永久访问权限,但它可以通过常见的系统崩溃重现,应用程序只是关闭而没有更多信息。
-
Xeon Gold.. 所以 Skylake 是 5xxx 或 6xxx... 知道确切的型号吗?这些都是最近的,所以除非有错误,否则 8 个月大的版本应该可以使用它们。真的,除了在你愿意支持的所有平台上进行测试之外,要保证一切正常是非常困难的……尽管不能保证的情况很可能是难以调试的奇怪的极端情况……你确实需要有关错误性质和位置的更多详细信息。就像我说的,检查它是否特定于这个特定版本。尝试调试构建以获取堆栈跟踪。 “崩溃”信息不足。
-
其中一个 OpenCV 文件在该系统的磁盘上损坏的可能性要高得多。在您的情况下,如果可能的话,我会在下一步完全重新安装 OpenCV。
-
我在使用 3.4.3 时在 Xeon Gold 中遇到了同样的问题 你应该稍后将 OpenCV 升级到 3.4.5 stackoverflow.com/questions/54071839/…