[Перевод] Использование расширенных возможностей компилятора Intel® C++ для приложений Android

Компилятор Intel® C++ предоставляет много возможностей для оптимизации приложений под самые различные задачи, в том числе для мобильных устройств. В этой статье мы затронем два аспекта оптимизации: во-первых, поговорим об использовании выполняемого модуля Intel® Cilk™ Plus в Android для реализации многопоточности приложений, во-вторых, коснемся темы использования Profile-guided Optimization (PGO) для повышения производительности приложений в ОС Android. Ссылки для более глубокого изучения этих тем даны в конце статьи.Intel® Cilk™ Plus — это расширение C и C++, дающее возможность легко и удобно задействовать многоядерную архитектуру и векторную обработку. Три ключевых слова Intel Cilk Plus предоставляют простую, но удивительно мощную модель для параллельного программирования, а модуль рантайма и библиотеки шаблонов образуют удобную среду для создания параллельных приложений.При использовании Intel Cilk Plus для реализации многопоточности в приложениях требуется линковка с библиотекой времени выполнения Cilk (libcilkrts.so).Разработка с помощью компилятора Intel C++ и системы сборки NDK (ndk-build)Система сборки NDK не линкует библиотеки C++ для модулей, написанных на C, в результате чего компилятор не может выбрать нужную библиотеку Intel Cilk Plus при линковке, что может привести к ошибкам линковки.1. Добавьте пустой файл C++ в проект, чтобы включить линковку C++ в системе сборки NDK.2. Укажите совместимую реализацию C++ в файле Application.mk.'APP_STL:=stlport_shared' или'APP_STL:=gnustl_static' или'APP_STL:=gnustl_shared'

3. Измените код Java согласно инструкциям в разделе «Подготовка вызовов JNI» ниже.

Разработка с помощью компилятора Intel C++ без системы сборки NDK (ndk-build) Если ваша среда разработки содержит код C++, нужно явным образом выполнить линковку с библиотекой GNU_STL или stlport.Выполните следующие действия.1. Укажите следующие флаги для компиляции и линковки для соответствующей реализации C++ в NDK.Флаги компиляции:-I$ANDROID_GNU_LIBSTDCPP/include -I$ANDROID_GNU_LIBSTDCPP/libs/x86/includeФлаги линковки (gnustl_shared):-L$ANDROID_GNU_LIBSTDCPP/libs/x86 -lgnustl_shared -lsupc++Флаги линковки (gnustl_static):-L$ANDROID_GNU_LIBSTDCPP/libs/x86 -lgnustl_static -lsupc++гдеANDROID_GNU_LIBSTDCPP=$NDK/sources/cxx-stl/gnu-libstdc++/4.6. 4.6 следует заменить на версию GCC, на которую указывает ANDROID_GNU_X86_TOOLCHAIN. Например, если ANDROID_GNU_X86_TOOLCHAIN указывает на $NDK/toolchains/x86–4.8/prebuilt/linux-x86, то замените 4.6 на 4.8.При использовании Intel Cilk Plus требуется линковка с библиотекой libcilkrts.so. Эта библиотека находится в папке /compiler/lib/ia32/gnustl.2. Если используется библиотека C++ stlport_shared (требуется NDK r9 или более поздней версии), добавьте следующие флаги.Флаги компиляции:-I$ANDROID_STLPORT_LIBSTDCPP/stlportФлаги линковки:-L$ANDROID_STLPORT_LIBSTDCPP/libs/x86 -lstlport_sharedГдеANDROID_STLPORT_LIBSTDCPP = $NDK/sources/cxx-stl/stlport.При использовании Intel Cilk Plus соответствующая библиотека находится в папке /compiler/lib/ia32/stlport.

Подготовка вызовов JNI Подготовка вызовов JNI необходима для использования Intel Cilk Plus для всех версий Android вплоть до Android 4.3 (Jelly Bean MR2). Библиотеку libcilkrts.so нужно загружать из кода Java с помощью следующего вызова API: System.loadLibrary («cilkrts»); Если приложению требуется динамическая реализация C++, нужно загрузить соответствующую библиотеку в дополнение к libcilkrts.so: System.loadLibrary («gnustl_shared»); System.loadLibrary («cilkrts»); илиSystem.loadLibrary («stlport_shared»); System.loadLibrary («cilkrts»);

Профильная оптимизация (Profile-guided Optimization, PGO) повышает производительность приложений путем переупорядочения кода, чтобы исключить неэффективное кеширование, уменьшить объем кода и выявить неверное предсказание при ветвлении. PGO предоставляет компилятору информацию о наиболее часто исполняемых областях приложения. Обладая информацией об этих областях, компилятор может оптимизировать работу приложения.Для использования PGO в Android (по сравнению с другими ОС) требуются определенные дополнительные действия.1. Добавьте следующие параметры во флаги C в файле jni/Android.mk: LOCAL_CFLAGS:= -prof-gen -prof-dir /sdcard.2. Добавьте разрешение WRITE_EXTERNAL_STORAGE, чтобы разрешить приложению запись выходных данных PGO в папку sdcard. Добавьте следующую строку в файл AndroidManifest.xml: .

3. Убедитесь, что данные профилирования записываются. Данные профилирования записываются в режиме по умолчанию только при завершении работы приложения. Приложения в Android* обычно не завершают работу. Используйте следующие варианты для принудительного завершения работы приложения или обхода этой проблемы.

А. Вариант 1. Вызов выхода из кода Java.System.exit (0);

Б. Вариант 2. Принудительный вывод дампа данных PGO из нативного кода.#include _PGOPTI_Prof_Dump_All ();

В. Вариант 3. Использование переменных среды для регулярной записи данных производительности на носитель sdcard при запущенном приложении. Чтобы сделать переменные среды доступными для всех приложений, добавьте их в файл init.rc образа Android: export INTEL_PROF_DUMP_INTERVAL 5000export INTEL_PROF_DUMP_CUMULATIVE 1Примечание. Значение INTEL_PROF_DUMP_INTERVAL измеряется в микросекундах, оно не должно превышать INT_MAX.

4. Копирование созданных файлов dyn на хост в папку исходного кода приложения: adb pull …

5. Изменение флагов C в файле Android.mk, чтобы использовать созданные файлы dyn. Можно использовать параметр -prof-dir, чтобы указать другое расположение файлов.LOCAL_CFLAGS:= -prof-use

См. раздел Профильная оптимизация в руководстве пользователя и справочном руководстве компилятора Intel® C++ XE 15.0, поставляемых вместе с пакетом, для получения сведений об использовании PGO для оптимизации приложений, созданных с помощью компилятора Intel® C++ в ОС Linux*, Windows* и OS X*.

Intel® System Studio — многоядерное программирование с помощью Intel® Cilk™ PlusIntel® Cilk™ PlusРуководство пользователя и справочное руководство компилятора Intel® C++ 15.0Android* NDK для архитектуры Intel®Использование Android* x86 NDK с Eclipse* и пример портирования NDK приложенияДополнительные сведения о средствах Intel для разработчиков Android см. на сайте Intel® Developer Zone для Android.

© Habrahabr.ru