Снижение производительности SIMD на Android Framework

Я разрабатываю фреймворк на базе Android x86 для процессора Intel Atom. Я реализовал всю структуру, но у меня возникли проблемы с реализацией SIMD для моего кода. Когда я запускаю базовый код C, он дает значительную производительность как на эмуляторе, так и на оборудовании, однако, когда я включаю встроенную опцию для кода, нет фактического выигрыша, но незначительная потеря производительности. Я запустил свой код на процессоре Intel i7, прирост составил примерно 200%. Я, конечно, принимаю во внимание частоту и количество ядер, которые используют ПК и планшет, но все же должен быть некоторый выигрыш, когда я включаю SIMD-код на платформе Android. Возможные проблемы, которые я проанализировал до сих пор:

1) Локальные флаги C (может ли кто-нибудь предложить подходящие флаги C для процессора Intel Atom).

2) Целесообразно ли использовать файл .so вместо исходного кода во фреймворке.

3) Подходит NDK для Intel Atom, я использую 4.8.

4) Уровень оптимизации должен быть установлен на O2 или O3.

Если есть какие-либо другие причины, которые могут помешать работе, сообщите мне об этом. Заранее спасибо.


person Steve    schedule 06.06.2014    source источник
comment
Вопрос может потребовать большей ясности: не могли бы вы объяснить, что значит включить опцию встроенных функций? Вы можете написать встроенный код самостоятельно (но это не то же самое, что включить что-то; это больше похоже на написание некоторого кода с использованием ассемблера) или вы можете использовать явную/автовекторизацию компилятора.   -  person zam    schedule 07.06.2014


Ответы (2)


Все платформы Intel Atom поддерживают как минимум SSSE3.

Чтобы узнать, что компилятор смог векторизовать, вы можете использовать флаг -ftree-vectorizer-verbose.

1) Вы можете скомпилировать свой код, используя -mtune=atom -mssse3 -mfpmath=sse, чтобы полностью использовать SSSE3, в том числе для математики FP. (При компиляции в 32-битном формате mfpmath по умолчанию устанавливается на 387, что намного медленнее.)

безопаснее предоставить только код SSSE3 для x86 ABI. Если вам нужна поддержка только определенных платформ, все 64-битные Atom поддерживают SSE4.2, чтобы оптимизировать их, вы можете использовать -mtune=slm -msse4.2 -mfpmath=sse

2) Я не уверен, понимаю ли я ваш вопрос 2), но если вы используете предварительно скомпилированный файл .so, он не будет дополнительно оптимизирован при компиляции связанного с ним кода.

3) Самый последний NDK обычно самый лучший, текущая версия r9d. GCC 4.8 также обеспечивает множество оптимизаций производительности по сравнению с GCC 4.6 по умолчанию, вы можете использовать его, установив NDK_TOOLCHAIN_VERSION:=4.8 внутри Application.mk

4) -O3 вполне безопасен и приносит больше производительности, вам стоит его использовать.

person ph0b    schedule 18.06.2014
comment
Спасибо за ваш ответ. Я сделал некоторые из этих оптимизаций. Есть ли у вас какие-либо конкретные документы или статьи, помогающие оптимизировать код для архитектуры Intel Atom. В настоящее время я оптимизирую архитектуру Saltwell. - person Steve; 21.06.2014

Intel опубликовала общие советы по оптимизации для Android на Atom, в которых излагается ряд вещей, которые могут помешать вашему SIMD-коду работать так быстро, как вы ожидаете. Это могут быть проблемы с выравниванием памяти - для x86 требуется выравнивание по 16 байтам для достижения наилучших результатов.

person Brad Werth    schedule 03.09.2014