Производительность 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.
Если есть какие-либо другие причины, которые могут помешать производительности, пожалуйста, дайте мне знать. Заранее спасибо.
2 ответа
Все платформы Intel Atom поддерживают как минимум SSSE3.
Чтобы узнать, что компилятор смог векторизовать, вы можете использовать -ftree-vectorizer-verbose
флаг.
1) Вы можете скомпилировать свой код, используя -mtune=atom -mssse3 -mfpmath=sse
в полной мере использовать SSSE3, в том числе для математики FP. (При компиляции в 32 бита mfpmath по умолчанию устанавливается в 387, что намного медленнее.)
для ABI x86 безопаснее предоставлять только код SSSE3. Если вам нужна только поддержка определенных платформ, все 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 довольно безопасен и приносит больше производительности, вы должны его использовать.
Корпорация Intel опубликовала общие советы по оптимизации для Android на Atom, в которых изложено несколько вещей, которые могут помешать вашему SIMD-коду работать так быстро, как вы ожидаете. Это может быть проблема с выравниванием памяти - x86 требует 16-байтового выравнивания для достижения наилучших результатов.