【发布时间】:2014-09-25 12:28:58
【问题描述】:
情况
我们有一块带有 TI DM3730 处理器(也可从 Beagleboard 中得知)的开发板,它带有一个 Cortex A8 内核 (r3p2),使用的参数如下:
- Beagleboard 参考设计:Beagleboard-xM Rev-C
- 内核版本:3.2.8
- 打开 CV 库:2.4.6
- U-Boot:uboot-2013.04
- 工具链:Sourcery CodeBench ARM 2011.03
- Buildroot:2012.02
- 设置来自this blog
现在我们编写了一个程序(用 C++ 编写并使用 GCC 版本 4.5.2 编译。)它使用 OpenCV 库(使用支持向量机计算一些分数)并且行为方式有些奇怪:
- 程序使用定义的测试数据在自己的进程中在板上运行:它反复产生正确的结果。
- 程序在两个或多个进程中运行(具有相同的定义测试数据):每个进程的结果开始变得错误,进程因段错误而死。最后剩下的进程再次正常运行。
- 程序在自己的进程中运行(再次使用相同的定义测试数据)。此外,另一个过程会更改连接的相机的一些曝光设置:程序开始产生错误的结果。
所以我们假设这是一个非常低级的浮点问题。
我们尝试了什么
-
完整的系统(所有库、内核、引导加载程序等)已按照 pandorawiki.org 上关于 Floating_Point_Optimization 的建议使用编译器标志进行编译
-O3 -mcpu=cortex-a8 -mfpu=neon -ftree-vectorize -mfloat-abi=softfp -ffast-math -fsingle-precision-constant
我们尝试根据Beagle board FAQ 在 Cortex-A8 辅助 ctrl 寄存器中启用 L1NEON,并尝试了其中提到的其他选项,但遗憾的是无济于事。
所有三种不同的行为都是可重现的,但不是以最小工作示例的形式。
相同的程序源以及第一个和第二个场景在 Windows(使用 Visual Studio)和运行 Linux (GCC) 的桌面上都能正常运行,所以这可能不是我们的代码所做的。
所以现在的问题是:
- 此设置和浮点运算是否还有其他我们不知道的已知错误?
- 是否有任何已知的编译器选项应该设置或省略,从而导致观察到的结果?
如果 MWE 有帮助,我们会考虑提供一个。
欢迎提供任何线索。
【问题讨论】:
-
我最初会尝试禁用
-ftree-vectorize和-ffast-math,因为这两个都可能导致代码生成错误。我也会尝试在 Linux 下进行压力测试,例如在 valgrind 下运行,以防您有任何与潜在内存相关的错误。 -
这个问题听起来好像 FP(霓虹灯)状态在上下文切换时没有正确保存和恢复。
-
@PaulR 我们试图禁用这两个开关,但是 OpenCV 的编译失败。更多信息何时我们将解决该问题...
标签: c++ opencv floating-point segmentation-fault beagleboard