Androidアプリケーション用の高度なインテル®C ++コンパイラーの使用

インテルC ++コンパイラーは、モバイルデバイスを含むさまざまなタスクのためにアプリケーションを最適化する多くの可能性を提供します。 この記事では、最適化の2つの側面に触れます:最初に、AndroidでIntel Cilk Plus実行可能モジュールを使用してマルチスレッドアプリケーションを実装する方法について説明します。 これらのトピックの詳細な研究へのリンクは、記事の最後にあります。



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をご覧ください。



All Articles