Inhalt
- Verwenden der Intel® Cilk™ Plus Runtime unter Android für den Einsatz von Multithreading in Ihrer Anwendung
- Verbesserung der Leistung von Android*-Anwendungen durch PGO
Verwendung der Intel® Cilk™ Plus Runtime unter Android für die Nutzung von Multithreading in Ihrer Anwendung
Intel® Cilk™ Plus ist eine Erweiterung für C und C++, mit der sich das Potenzial der Multicore- und Vektorverarbeitung schnell und einfach nutzen lässt. Die drei Schlüsselwörter, die Intel Cilk Plus definiert, bieten ein einfaches und gleichzeitig überraschend leistungsfähiges Modell für die Parallelprogrammierung, während Runtime- und Vorlagenbibliotheken eine gut abgestimmte Umgebung für das Erstellen parallelisierter Anwendungen bereitstellen.
Wenn Sie für die Nutzung von Multithreading in Ihrer Anwendung Intel Cilk Plus verwenden möchten, ist eine Verlinkung mit der Cilk Runtime Library (libcilkrts.so) erforderlich.
Entwicklung mit dem Intel C++-Compiler und dem NDK-Build-System (ndk-build)
Das NDK-Build-System verlinkt keine C++-Bibliotheken für Module, die in C programmiert sind. Aus diesem Grund kann der Compiler während der Verlinkung nicht die korrekte Intel Cilk Plus Bibliothek wählen, was zu Verlinkungsfehlern führen kann.
1. Um im NDK-Build-System eine C++-Verlinkung zu ermöglichen, fügen Sie eine leere C++-Datei zum Projekt hinzu.
2. Geben Sie die kompatible C++-Implementierung in der Datei Application.mk an:
'APP_STL:=stlport_shared' or
'APP_STL:=gnustl_static' or
'APP_STL:=gnustl_shared'
3. Ändern Sie Ihren Java-Code entsprechend der Beschreibung unten (siehe Abschnitt „Vorbereitung von JNI-Aufrufen“).
Gesonderte Entwicklung mit dem Intel C++-Compiler ohne NDK-Build-System (ndk-build)
Wenn Ihre Entwicklungsumgebung aus C++-Code besteht, müssen Sie eine explizite Verlinkung mit der GNU_STL- oder stlport-Bibliothek definieren.
Führen Sie hierzu bitte die folgenden Schritte aus:
1. Geben Sie die folgenden Flags zur Verlinkung und Kompilierung der entsprechenden im NDK enthaltenen C++-Implementierung an:
- Kompilierungsflags:
-I$ANDROID_GNU_LIBSTDCPP/include -I$ANDROID_GNU_LIBSTDCPP/libs/x86/include - Verlinkungsflags (gnustl_shared):
-L$ANDROID_GNU_LIBSTDCPP/libs/x86 -lgnustl_shared -lsupc++ - Verlinkungsflags (gnustl_static):
-L$ANDROID_GNU_LIBSTDCPP/libs/x86 -lgnustl_static -lsupc++
wobei gilt
ANDROID_GNU_LIBSTDCPP=$NDK/sources/cxx-stl/gnu-libstdc++/4.6. 4.6 sollte durch die GCC-Version, auf die ANDROID_GNU_X86_TOOLCHAIN verweist, ersetzt werden. Beispiel: Wenn ANDROID_GNU_X86_TOOLCHAIN auf $NDK/toolchains/x86-4.8/prebuilt/linux-x86 verweist, sollte 4.6 durch 4.8 ersetzt werden.
Wenn Sie Intel Cilk Plus verwenden, muss eine Verlinkung mit der libcilkrts.so-Bibliothek bestehen. Diese Bibliothek befindet sich im Verzeichnis /compiler/lib/ia32/gnustl.
2. Bei Verwendung der C++-Bibliothek stlport_shared (erfordert mindestens NDK r9) fügen Sie bitte die folgenden Flags hinzu:
- Kompilierungsflags:
-I$ANDROID_STLPORT_LIBSTDCPP/stlport - Verlinkungsflags:
-L$ANDROID_STLPORT_LIBSTDCPP/libs/x86 -lstlport_shared
wobei gilt
ANDROID_STLPORT_LIBSTDCPP=$NDK/sources/cxx-stl/stlport
Bei Verwendung von Intel Cilk Plus befindet sich die entsprechende libcilkrts.so-Bibliothek im Verzeichnis /compiler/lib/ia32/stlport.
Vorbereitung von JNI-Aufrufen
Die Verwendung von Intel Cilk Plus setzt die Vorbereitung von JNI-Aufrufen voraus. Die Bibliothek „libcilkrts.so“ muss über den folgenden API-Aufruf aus dem Java-Code geladen werden:
System.loadLibrary("cilkrts");
Falls Ihre Anwendung eine dynamische C++-Implementierung erfordert, müssen Sie neben libcilkrts.so eine weitere zugehörige Bibliothek laden:
System.loadLibrary("gnustl_shared"); System.loadLibrary("cilkrts");
oder
System.loadLibrary("stlport_shared"); System.loadLibrary("cilkrts");
Verbesserung der Leistung von Android*-Anwendungen durch PGO
Profilgesteuerte Optimierung (Profile-Guided Optimization, PGO) verbessert die Anwendungsleistung, indem das Codelayout umgestaltet und dadurch Probleme mit dem Anweisungscache, falsche Voraussagen für Verzweigungen und der Codeumfang reduziert werden. PGO informiert den Compiler über die Anwendungsbereiche, die am häufigsten ausgeführt werden. Wenn diese Bereiche bekannt sind, kann der Compiler eine Anwendung genauer und gezielter optimieren.
Im Unterschied zu anderen Betriebssystemen erfordert die PGO-Verwendung unter Android einige Zusatzschritte.
1. Fügen Sie die folgenden Optionen zu den C-Flags in der Datei jni/Android.mk hinzu:
LOCAL_CFLAGS:= -prof-gen -prof-dir /sdcard
2. Fügen Sie die Berechtigung WRITE_EXTERNAL_STORAGE hinzu, damit die Anwendung die PGO-Ausgabe in den Ordner sdcard schreiben kann. Fügen Sie die folgende Zeile zur Datei AndroidManifest.xml hinzu:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
3. Stellen Sie sicher, dass die Profilerstellungsdaten geschrieben werden. Die Profilerstellungsdaten werden im Standardmodus nur dann geschrieben, wenn die Anwendung beendet wird. Unter Android* wird eine Anwendung in der Regel nicht beendet. Verwenden Sie die folgenden Optionen, um das Beenden der Anwendung zu erzwingen oder dieses Problem zu umgehen:
a. Option 1: Das Beenden aus JAVA-Code aufrufen:
System.exit(0);
b. Option 2: PGO-Daten explizit aus nativem Code auslesen:
#include <pgouser.h> _PGOPTI_Prof_Dump_All();
c. Option 3: Während die Anwendung läuft, die Leistungsdaten über Umgebungsvariablen regelmäßig in sdcard schreiben. Um die Umgebungsvariablen allen Anwendungen zur Verfügung zu stellen, fügen Sie sie zur Datei init.rc des Android-Images hinzu:
export INTEL_PROF_DUMP_INTERVAL 5000 export INTEL_PROF_DUMP_CUMULATIVE 1
HINWEIS: Der Wert INTEL_PROF_DUMP_INTERVAL wird in Mikrosekunden gemessen und sollte nicht größer sein als INT_MAX.
4. Kopieren Sie die erzeugten dyn-Dateien vom Ziel zum Host in das Quellverzeichnis der Anwendung:
adb pull ...
5. Damit die erzeugten dyn-Dateien verwendet werden, ändern Sie die C-Flags in der Datei Android.mk. Mit dem Parameter -prof-dir können Sie auf einen anderen Dateispeicherort verweisen.
LOCAL_CFLAGS := -prof-use
Informationen zur Verwendung von PGO für die Optimierung von Anwendungen, die mit dem Intel® C++-Compiler unter Linux*, Windows* und OS X* erstellt wurden, finden Sie im Abschnitt Profile-Guided Optimization in den im Paket enthaltenen Benutzer- und Referenzhandbüchern für den Intel® C++-Compiler XE 14.0.
Weitere Artikel und Ressourcen zu diesem Thema
Intel® C++-Compiler 14.0 für Android*
Intel® System Studio – Multicore-Programmierung mit Intel® Cilk™ Plus
Intel® Cilk™ Plus
Benutzer- und Referenzhandbücher für den Intel® C++-Compiler 14.0
Android*-NDK für die Intel® Architektur
Verwenden des Android*-x86-NDK mit Eclipse* und Portieren einer NDK-Beispiel-App
Weitere Informationen über Intel® Tools für Android-Entwickler siehe Intel® Developer Zone für Android.