Существуют ли какие-либо специальные методы программирования на уровне C для архитектуры ARM (EABI)? - PullRequest
1 голос
/ 28 января 2011

Меня интересуют любые советы по специальным методам C-программирования для целей ARM-CPU, использующих GCC с EABI. Мои приложения содержат интенсивные вычисления с плавающей точкой для больших массивов данных. Основная цель - получить самый быстрый исполняемый файл. В основном, я использую кодовые ресурсы и версии arm-eabi-gcc для android-ndk. Я также не хочу использовать neon-intrinsics или делать какие-либо изменения в C-коде, которые несовместимы с другими компиляторами для других архитектур (например, компилятор Intel для IA32).

Ответы [ 4 ]

4 голосов
/ 28 января 2011

Поскольку большинство целей ARM не имеют FPU, если вы хотите «самый быстрый исполняемый файл», вам следует рассмотреть возможность использования библиотеки с фиксированной запятой.Эта статья доктора Добба: Оптимизация математических приложений с арифметикой с фиксированной точкой содержит хорошее объяснение алгоритмов CORDIC и предоставляет полный исходный код для библиотеки, обсуждаемой в статье.Эта статья посвящена ускорению математического кода на устройствах ARM без FPU.Результаты, о которых сообщают, как правило, были 4-кратным ускорением по сравнению с реализацией с плавающей запятой, которая, учитывая, что VFP без использования векторизации (которую компилятор вряд ли будет поддерживать, кроме как посредством библиотечного кода) дает 5-кратное ускорение, довольно хороша для программной реализации.1003 *

Примечание. Я использовал эту библиотеку и обнаружил ошибку в функции log ().Это исправляется добавлением 0x0LL в конец инициализатора массива log_two_power_n_reversed [].Я подтвердил это исправление с автором.Ссылка на код в статье не работает, найдите ее по адресу: ftp: //ftp.drdobbs.com/sourcecode/ddj/2008/0804.zip

[РЕДАКТИРОВАТЬ] Ой, извините, в статье и коде обсуждается реализация C ++, широко используемая перегрузка операторов и функций, чтобы сделать тип fixed максимально прозрачным.Возможно, это хорошая причина использовать компиляцию C ++, но не то, что вы просили.

3 голосов
/ 28 января 2011

Если вы хотите сохранить переносимость, мой совет: «не используйте с плавающей запятой». Большинство чипов ARM не имеют FPU и должны эмулировать операции в программном обеспечении.

В общем, тест, изменение и тест снова. Любая оптимизация производительности без тщательного до / после измерения производительности бесполезна.

0 голосов
/ 28 января 2011

Увы, для лучшей производительности обработки чисел на всех процессорах ARM, используемых в настоящее время для смартфонов, наилучшим методом может быть создание чего-то совершенно другого для каждой архитектуры ARM: масштабированная целочисленная арифметика или более медленное плавное плавание для чипов без fpu,перекрывающаяся плавающая точка для микросхем с конвейерным аппаратным обеспечением VFP и распараллеленные непереносимые свойства NEON для микросхем с поддержкой NEON.Возможно, вам придется закодировать все это и использовать процедуру выбора вычислений во время выполнения после определения архитектуры ЦП.

0 голосов
/ 28 января 2011

Чтобы максимизировать производительность на процессоре без FPU, следует также выбрать «мягкую с плавающей точкой» вместо «жесткой с плавающей точкой».Таким образом, ваш исполняемый файл будет связан с библиотеками с плавающей запятой вместо того, чтобы полагаться на то, что ядро ​​перехватывает недопустимые инструкции и эмулирует их в ядре (что занимает больше времени из-за переключения контекста).у вас есть процессор с аппаратным модулем с плавающей точкой, вы должны использовать его с жесткой плавающей точкой.

К счастью, EABI позволяет мирно сосуществовать как типам исполняемых файлов, так и библиотек.

...