【问题标题】:TI DM3730 (Design reference: beagleboard) computes wrong floating point operation resultsTI DM3730(设计参考:beagleboard)计算错误的浮点运算结果
【发布时间】: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 库(使用支持向量机计算一些分数)并且行为方式有些奇怪:

  1. 程序使用定义的测试数据在自己的进程中在板上运行:它反复产生正确的结果。
  2. 程序在两个或多个进程中运行(具有相同的定义测试数据):每个进程的结果开始变得错误,进程因段错误而死。最后剩下的进程再次正常运行。
  3. 程序在自己的进程中运行(再次使用相同的定义测试数据)。此外,另一个过程会更改连接的相机的一些曝光设置:程序开始产生错误的结果。

所以我们假设这是一个非常低级的浮点问题。

我们尝试了什么

  • 完整的系统(所有库、内核、引导加载程序等)已按照 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


【解决方案1】:

好的,我们现在使用最新的 buildroot (2014.08) 和包含的工具链 (arm-buildroot-linux-uclibcgueabi-)、Linux-kernel 3.9.11、boost 1.55、Qt 4.8.6,并且仍然OpenCV 2.4.6。

在编译时,我们针对大小进行优化 (–Os),针对目标优化我们只使用–pipe。

目前不再使用以下编译器标志: -mcpu=cortex-a8 -mfpu=neon -ftree-vectorize -mfloat-abi=softfp -ffast-math -fsingle-precision-constant

很遗憾,我们仍然不知道最初问题的确切原因,但我们很高兴这个设置解决了问题。

所以也许这个答案在将来会帮助一些可怜的灵魂...... ;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 2013-01-31
    • 1970-01-01
    相关资源
    最近更新 更多