AndroidでIntel Cilk Plus実行可能ファイルを使用してマルチスレッドアプリケーションを実装する
Intel Cilk PlusはCおよびC ++の拡張機能であり、マルチコアアーキテクチャとベクター処理を簡単かつ便利に使用できます。 3つのインテルCilk Plusキーワードは、並列プログラミングのためのシンプルだが驚くほど強力なモデルを提供し、ランタイムモジュールとテンプレートライブラリは、並列アプリケーションを作成するための便利な環境を提供します。
Intel Cilk Plusを使用してアプリケーションにマルチスレッドを実装する場合、Cilkランタイムライブラリ(libcilkrts.so)へのリンクが必要です。
Intel C ++コンパイラとNDKビルドシステム(ndk-build)を使用した開発
NDKビルドシステムは、Cで記述されたモジュールのC ++ライブラリをリンクしません。その結果、コンパイラーはリンク中に必要なIntel Cilk Plusライブラリを選択できず、リンクエラーが発生する可能性があります。
1.空のC ++ファイルをプロジェクトに追加して、NDKビルドシステムでC ++リンクを有効にします。
2. Application.mkファイルで互換性のあるC ++実装を指定します。
'APP_STL:= stlport_shared'または
'APP_STL:= gnustl_static'または
「APP_STL:= gnustl_shared」
3.以下の「JNI呼び出しの準備」セクションの指示に従ってJavaコードを変更します。
NDKビルドシステム(ndk-build)を使用しないIntel C ++コンパイラーを使用した開発
開発環境にC ++コードが含まれている場合は、GNU_STLまたはstlportライブラリに明示的にリンクする必要があります。
以下の手順に従ってください。
1. NDKのC ++の対応する実装のコンパイルとリンクのために、次のフラグを指定します。
コンパイルフラグ:
-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は、ANDROID_GNU_X86_TOOLCHAINが指すGCCバージョンに置き換える必要があります。 たとえば、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コールの準備は、Android 4.3(Jelly Bean MR2)までのすべてのAndroidバージョンでIntel Cilk Plusを使用するために必要です。 libcilkrts.soライブラリは、次のAPI呼び出しを使用してJavaコードからロードする必要があります。
System.loadLibrary( "cilkrts");
アプリケーションに動的C ++実装が必要な場合、libcilkrts.soに加えて適切なライブラリをダウンロードする必要があります。
System.loadLibrary( "gnustl_shared");
System.loadLibrary( "cilkrts");
または
System.loadLibrary( "stlport_shared");
System.loadLibrary( "cilkrts");
PGOを使用してAndroidのアプリケーションパフォーマンスを向上させる
プロファイルに基づく最適化(PGO)は、コードを並べ替えて非効率的なキャッシングを排除し、コードサイズを縮小し、誤った分岐予測を検出することにより、アプリケーションのパフォーマンスを向上させます。 PGOは、アプリケーションで最も頻繁に実行される領域に関する情報をコンパイラーに提供します。 これらの領域に関する情報を使用して、コンパイラはアプリケーションを最適化できます。
Androidで(他のOSと比較して)PGOを使用するには、特定の追加手順が必要です。
1.次のパラメーターをjni / Android.mkファイルのCフラグに追加します。
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 *アプリは通常シャットダウンしません。 次のオプションを使用して、アプリケーションを強制的に終了するか、この問題を回避します。
A.オプション1. Javaコードからexitを呼び出します。
System.exit(0);
B.オプション2。ネイティブコードからPGOデータを強制的にダンプします。
#include <pgouser.h>
_PGOPTI_Prof_Dump_All();
B.オプション3.環境変数を使用して、アプリケーションの実行中にパフォーマンスデータをSDカードメディアに定期的に書き込む。 すべてのアプリケーションで環境変数を使用できるようにするには、それらをAndroidイメージのinit.rcファイルに追加します。
INTEL_PROF_DUMP_INTERVAL 5000をエクスポート
INTEL_PROF_DUMP_CUMULATIVEをエクスポート1
ご注意 INTEL_PROF_DUMP_INTERVALの値はマイクロ秒単位で測定され、INT_MAXを超えてはなりません。
4.作成されたdynファイルをアプリケーションソースフォルダーのホストにコピーします。
adb pull ...
5. Android.mkファイルのCフラグを変更して、作成されたdynファイルを使用します。 -prof-dirオプションを使用して、別のファイルの場所を指定できます。
LOCAL_CFLAGS:= -prof-use
Linux *、Windows *、およびOS X *でIntel C ++コンパイラーを使用して作成されたアプリケーションを最適化するためにPGOを使用する方法については、パッケージに付属のインテルC ++ XE 15.0コンパイラーユーザーガイドおよびリファレンスガイドのプロファイル最適化セクションを参照してください。
その他の関連記事とリソース
Intel System Studio-Intel Cilk Plusを使用したマルチコアプログラミング
Intel Cilk Plus
Intel C ++ 15.0コンパイラユーザーガイドとリファレンス
Android * Intelアーキテクチャ向けNDK
Eclipse *でAndroid * x86 NDKを使用し、NDKアプリケーションを移植する例
Android開発者向けのIntelのツールの詳細については、Android開発者向けIntel Developer Zoneをご覧ください。