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

Ситуация

У нас есть плата с процессором TI DM3730 (он же из Beagleboard) с ядром Cortex A8 (r3p2) в использовании со следующими параметрами:

  • Эталонный дизайн Beagleboard: Beagleboard-xM Rev-C
  • Версия ядра: 3.2.8
  • Открытая библиотека резюме: 2.4.6
  • U-Boot: uboot-2013.04
  • Набор инструментов: исходный код CodeBench ARM 2011.03
  • Корень сборки: 2012.02
  • Установка взята из этот блог

Теперь мы написали программу (написанную на 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

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

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

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

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

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

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

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


person Theo K.    schedule 25.09.2014    source источник
comment
Я бы попробовал сначала отключить -ftree-vectorize и -ffast-math, так как оба они могут привести к ошибкам генерации кода. Я бы также попробовал стресс-тестирование под Linux, например. запустите под valgrind, если у вас есть какие-либо скрытые ошибки, связанные с памятью.   -  person Paul R    schedule 25.09.2014
comment
Проблема звучит так, как будто состояние FP (Neon) неправильно сохраняется и восстанавливается при переключении контекста.   -  person MSalters    schedule 25.09.2014
comment
@PaulR Мы пытались отключить два переключателя, но компиляция OpenCV не удалась. Больше информации, когда мы решим эту проблему...   -  person Theo K.    schedule 26.09.2014


Ответы (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

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

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

person Theo K.    schedule 18.11.2014