Компиляторы 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
в расчетах, где вам не нужна точность последнего (в том числе с использованием C99float
версииmath.h
функции); - Минимизируйте преобразования между целыми числами и типами с плавающей точкой.
"Другие xscale компиляторы"
Открытый исходный код: llvm и pcc, из которых llvm является наиболее дружественным к Linux и функциональным, а также имеет интерфейс gcc; pcc, потомок почтенного Portable C Compiler, кажется более ориентированным на bsd.
Коммерческий: Компилятор Keil (принадлежащий ARM Ltd), кажется, производит более быстрый код, чем GCC, но не окажет значительного влияния на отсутствие у вас FPU.