cv::split() 在至强处理器上崩溃,但在其他地方工作
cv::split() crashes on Xeon processor but works elsewhere
我正在使用预构建的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版本。 哎呀,我不羡慕你。
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 当回溯以零开始时,如何调试崩溃
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 程序崩溃并显示"std::out_of_range"错误
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 在其他文件中创建类时在 c++ 项目中不起作用
- 类与私有变量的其他类之间的线程安全性
- CNTK:->转发或 ->评估某些电脑上的崩溃,而不是其他电脑上的崩溃
- cv::split() 在至强处理器上崩溃,但在其他地方工作
- 助推.测试崩溃,***异常:MSVC上的其他
- 创建 COM 接口指针在开发计算机上有效,但会导致其他计算机上的应用程序崩溃
- 带有Qt的程序在其他计算机上执行时崩溃
- 为什么从子类访问超类的其他示例的字段会导致该字段崩溃
- boost::program_options在其他地方使用implicit_value时在帮助中崩溃
- C++猜数字游戏在其他计算机上崩溃并无限循环修复
- OpenGL应用程序在其他计算机上崩溃