Ситуация
У нас есть плата с процессором 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 (для вычисления некоторых оценок с помощью машин опорных векторов) и которая ведет себя каким-то странным образом:
- Программа работает на плате в своем собственном процессе, используя определенные тестовые данные: она постоянно дает правильные результаты.
- Программа работает в двух или более процессах (с одними и теми же определенными тестовыми данными): результаты для каждого процесса начинают становиться неправильными, процессы умирают с ошибками сегментации. Последний оставшийся процесс снова работает правильно.
- Программа работает в своем собственном процессе (опять же с теми же определенными тестовыми данными). Кроме того, другой процесс изменяет некоторые настройки экспозиции подключенной камеры: программа начинает выдавать неправильные результаты.
Итак, мы предполагаем, что это очень низкоуровневая задача с плавающей запятой.
Что мы пробовали
Полная система (все библиотеки, ядро, загрузчик и т. д.) была скомпилирована с флагами компилятора, как это предлагается на 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 будет полезен, мы рассмотрим возможность его предоставления.
Любые подсказки приветствуются.
-ftree-vectorize
и-ffast-math
, так как оба они могут привести к ошибкам генерации кода. Я бы также попробовал стресс-тестирование под Linux, например. запустите под valgrind, если у вас есть какие-либо скрытые ошибки, связанные с памятью. - person Paul R   schedule 25.09.2014