TI DM3730 (ссылка на проектирование: beagleboard) вычисляет неверные результаты операций с плавающей запятой

У нас есть плата с процессором 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
  • Настройка получена из этот блог

Теперь мы написали программу (написанную на C ++ и скомпилированную с GCC версии 4.5.2.), Которая использует библиотеку OpenCV (для вычисления некоторых результатов с использованием машин опорных векторов) и которая ведет себя странным образом:

  1. Программа работает на плате в своем собственном процессе, используя определенные тестовые данные: она выдает многократно правильные результаты.
  2. Программа работает в двух или более процессах (с одними и теми же определенными тестовыми данными): результаты начинают становиться неправильными для каждого процесса, процессы умирают с ошибками сегмента. Последний оставшийся процесс снова выполняется правильно.
  3. Программа работает в своем собственном процессе (снова с теми же заданными тестовыми данными). Кроме того, другой процесс изменяет некоторые настройки экспозиции подключенной камеры: программа начинает давать неправильные результаты.

Поэтому мы предполагаем, что это проблема с плавающей точкой очень низкого уровня.

Что мы пробовали

  • Полная система (все библиотеки, ядро, загрузчик и т. Д.) Была скомпилирована с флагами компилятора, как это было предложено на сайте pandorawiki.org относительно Floating_Point_Optimization

    -O3 -mcpu = cortex-a8 -mfpu = неон -двух-векторизация -mfloat-abi = softfp
    -ffast-math -fsingle-точность-константа

  • Мы попытались включить L1NEON в регистре Cortex-A8 aux ctrl в соответствии с FAQ по Beagle Board и попробовал другие варианты, упомянутые там, но, к сожалению, безрезультатно.

Все три различных поведения воспроизводимы, но не в форме минимального рабочего примера.

Один и тот же исходный код программы, а также первый и второй сценарии работают правильно в Windows (с использованием Visual Studio) и на настольном компьютере под управлением Linux (GCC), поэтому, вероятно, это не то, что делает наш код.

Итак, вопросы сейчас:

  • Есть ли другие известные ошибки с этой настройкой и операциями с плавающей запятой, о которых мы не знаем?
  • Существуют ли какие-либо известные параметры компилятора, которые должны быть установлены или опущены, что может привести к наблюдаемым результатам?

Если MWE будет полезен, мы рассмотрим возможность его предоставления.

Любые подсказки приветствуются.

0

Решение

Хорошо, теперь мы используем обновленный сборочный рут (2014.08) с включенным набором инструментов (arm-buildroot-linux-uclibcgueabi-), Linux-ядро 3.9.11, boost 1.55, Qt 4.8.6 и все еще OpenCV 2.4. 6.

При компиляции мы оптимизируем по размеру (–Os) и для оптимизации цели мы используем только –pipe.

Следующие флаги компилятора в настоящее время больше не используются:
-mcpu = cortex-a8 -mfpu = неон -ftree-векторизация -mfloat-abi = softfp -ffast-math -fsingle-точность-константа

К сожалению, мы до сих пор не знаем точную причину первоначальной проблемы, но мы очень рады, что проблема ушла с этой настройкой.

Так что, возможно, этот ответ поможет какой-нибудь бедной душе в будущем …;)

0

Другие решения