Компиляторы Xscale для Linux? (также вопрос флагов компиляции Xscale)

В настоящее время я использую кросс-компилятор на основе GCC 3.3.3 для компиляции платы разработки Xscale PXA270. Однако мне было интересно, есть ли другие компиляторы Xscale, работающие на Linux (или Windows в этом отношении)? Кросс-компилятор, который я использую, имеет ужасную производительность на целевом устройстве, поскольку некоторые программы, выполняющие приличное количество математических операций, выполняют в процессоре Xscale в 10–20 раз хуже, чем на Pentium 2 с аналогичной тактовой частотой. там или конкретные флаги компилятора, которые я должен установить с моим компилятором на основе GCC, который может помочь с производительностью?

Спасибо Бен

3 ответа

Решение

Да, у вас нет FPU, поэтому нужно выполнять вычисления с плавающей запятой в целочисленной математике. Однако для этого есть два механизма, один из которых в 11 раз быстрее другого.

GCC target arm-linux-gnu обычно включает в себя реальные инструкции с плавающей запятой в коде для первого FPU ARM, "FPA", который теперь настолько редок, что его не существует. Это вызывает недопустимые ловушки инструкций, которые затем перехватываются и эмулируются в ядре. Это очень медленно из-за переключения контекста.

-msoft-float вместо этого вставляет вызовы библиотечных функций (в libgcc.a). Это позволяет избежать переключения в пространство ядра и в 11 раз быстрее, чем эмулируемые инструкции FPA.

Вы не говорите, какую модель с плавающей запятой вы используете - возможно, вы уже строите всю область пользователя с помощью -msoft-float - но, возможно, стоит проверить, что ваши объектные файлы не содержат инструкций FPA. Вы можете проверить с помощью:

objdump -d file | grep '<space><tab>f' | less
где file любой объектный файл, исполняемый файл или библиотека, которые выводит ваш компилятор. Все инструкции FPA начинаются с f, в то время как никакие другие инструкции ARM не делают. Это настоящие символы пробела и табуляции, и вам, возможно, придется сказать <control-V><tab> чтобы получить символ табуляции мимо вашей оболочки.

Если он использует inspa для FPA, вам нужно скомпилировать всю пользовательскую область, используя -msoft-float.

Наиболее полное дальнейшее чтение по этим вопросам - http://wiki.debian.org/ArmEabiPort которое в первую очередь касается третьей альтернативы: использования arm-linux-gnueabi compiler, более новый альтернативный ABI, который доступен с gcc-4.1.1 и более поздних версий и имеет другие характеристики. Смотрите документ для более подробной информации.

В отличие от Pentium 2, архитектура XScale не имеет встроенных инструкций с плавающей запятой. Это означает, что математика с плавающей запятой должна эмулироваться с помощью целочисленных инструкций - примерно в 10-20 раз звучит замедление.

Чтобы улучшить производительность, вы можете попробовать несколько вещей:

  • Там, где это возможно, минимизируйте использование чисел с плавающей запятой - в некоторых местах вы можете заменить вычисления с простым целым числом или с фиксированной запятой;
  • Компромисс памяти для скорости, путем предварительного вычисления таблиц значений, где это возможно;
  • использование floatс вместо doubleв расчетах, где вам не нужна точность последнего (в том числе с использованием C99 float версии math.h функции);
  • Минимизируйте преобразования между целыми числами и типами с плавающей точкой.

"Другие xscale компиляторы"

Открытый исходный код: llvm и pcc, из которых llvm является наиболее дружественным к Linux и функциональным, а также имеет интерфейс gcc; pcc, потомок почтенного Portable C Compiler, кажется более ориентированным на bsd.

Коммерческий: Компилятор Keil (принадлежащий ARM Ltd), кажется, производит более быстрый код, чем GCC, но не окажет значительного влияния на отсутствие у вас FPU.

Другие вопросы по тегам