Pull to refresh
0

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

Reading time 4 min
Views 7.1K
Original author: Alexander Weggerle
Компилятор Intel C++ предоставляет много возможностей для оптимизации приложений под самые различные задачи, в том числе для мобильных устройств. В этой статье мы затронем два аспекта оптимизации: во-первых, поговорим об использовании выполняемого модуля Intel Cilk Plus в Android для реализации многопоточности приложений, во-вторых, коснемся темы использования Profile-guided Optimization (PGO) для повышения производительности приложений в ОС Android. Ссылки для более глубокого изучения этих тем даны в конце статьи.

Использование выполняемого модуля Intel Cilk Plus в 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»);


Использование PGO для повышения производительности приложений в ОС Android


Профильная оптимизация (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:
<uses-permission android:name=«android.permission.WRITE_EXTERNAL_STORAGE» />.

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

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

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


В. Вариант 3. Использование переменных среды для регулярной записи данных производительности на носитель sdcard при запущенном приложении. Чтобы сделать переменные среды доступными для всех приложений, добавьте их в файл init.rc образа Android:
export INTEL_PROF_DUMP_INTERVAL 5000
export 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 Plus
Intel Cilk Plus
Руководство пользователя и справочное руководство компилятора Intel C++ 15.0
Android* NDK для архитектуры Intel
Использование Android* x86 NDK с Eclipse* и пример портирования NDK приложения

Дополнительные сведения о средствах Intel для разработчиков Android см. на сайте Intel Developer Zone для Android.
Tags:
Hubs:
+9
Comments 0
Comments Leave a comment

Articles

Information

Website
www.intel.ru
Registered
Founded
Employees
5,001–10,000 employees
Location
США
Representative
Анастасия Казантаева