インテル® IPP を使用して Android* NDK アプリケーションをビルドする

同カテゴリーの次の記事

インテル® IPP におけるインテル® AVX2 向け最適化

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Building Android* NDK applications with Intel® Integrated Performance Primitives (Intel® IPP)」の日本語参考訳です。


インテル® インテグレーテッド・パフォーマンス・プリミティブ (インテル® IPP) は、画像処理、信号処理、ベクトル演算、小規模な行列演算向けに高度に最適化されたビルディング・ブロック関数群です。いくつかのドメインには、インテル® ストリーミング SIMD 拡張命令 (インテル® SSE) を利用して、インテル® Atom™ プロセッサー向けにチューニングされた関数が含まれています。また、インテル® IPP Linux* 版のスレッド化されていないスタティック ・ライブラリーは Android* OS がサポートされ、Android* アプリケーションで利用できるようになりました。

この記事は、Android* NDK アプリケーションにインテル® IPP 関数を追加する方法を説明します。インテル® IPP は、プロセッサー固有の最適化を提供します。Android* の C/C++ ネイティブコードとリンクできるのはインテル® IPP だけです。ソースコードでインテル® IPP 関数をインクルードし、ビルドコマンドにインテル® IPP ライブラリーを追加します。

インテル® IPP を使用する

1. ソースにインテル® IPP 関数を追加する

  • ソースファイルで、インテル® IPP ヘッダーファイル (ipp.h) をインクルードします。
  • 最初のインテル® IPP 関数を呼び出す前に ippInit() を呼び出して、CPU ディスパッチを初期化します。インテル® IPP は、プロセッサー機能を検出し、ターゲット・プロセッサー向けに最適化されたコードパスを選択します。
  • C/C++ ソースコードでインテル® IPP 関数を呼び出します。

2. インテル® IPP ライブラリーを Android* NDK ビルドファイルに含める

  • インテル® IPP ライブラリーとヘッダーファイルをプロジェクト・フォルダーにコピーします。
  • アプリケーションに必要なインテル® IPP ライブラリーを確認します。インテル® IPP ライブラリーはドメインごとに分類されています。各ドメインには独自のライブラリーがあり、一部のドメインはほかのドメインに依存しています。すべてのドメイン・ライブラリーと依存ライブラリーをリンク行に含めます。必要なインテル® IPP ライブラリーについては、「Intel IPP Library Dependencies」 (英語) が参考になります。
  • Android* ビルド・スクリプト・ファイル “jni/Android.mk” にインテル® IPP を追加します。
    各インテル® IPP ライブラリーを事前ビルド済みライブラリー・モジュールとして宣言します。例えば、アプリケーションで 2 つのインテル® IPP ライブラリー “libipps.a” と “libippcore.a” を使用する場合、ファイルに次のコードを追加します。

    include $(CLEAR_VARS)
    LOCAL_MODULE := ipps
    LOCAL_SRC_FILES := ../ipp/lib/ia32/libipps.a
    include $(PREBUILT_STATIC_LIBRARY)
    include $(CLEAR_VARS)
    LOCAL_MODULE := ippcore
    LOCAL_SRC_FILES := ../ipp/lib/ia32/libippcore.a
    include $(PREBUILT_STATIC_LIBRARY) 

    インテル® IPP 関数を呼び出すモジュールに、ヘッダーのパスとインテル® IPP ライブラリーを追加します。

    include $(CLEAR_VARS)
    LOCAL_MODULE     := IppAdd
    LOCAL_SRC_FILES  := IppAdd.c
    LOCAL_STATIC_LIBRARIES := ipps ippcore
    LOCAL_C_INCLUDES := ./ipp/include
    include $(BUILT_SHARED_LIBRARY)

サンプルコードをビルドする

ここでは、Android* ネイティブコードでインテル® IPP を使用する簡単な例を紹介します。このコードは、インテル® IPP の ippsAdd_32f() 関数を使って 2 つの配列にデータを追加します。

次の操作を行います。

  1. こちらから サンプルコードをダウンロードして、プロジェクト・フォルダー (例: ) に展開します。
  2. ソースコードでインテル® IPP の使用法を確認します。”jni/IppAdd.c” ファイルに、インテル® IPP の ippsAdd_32f() 関数を呼び出すネイティブ関数 NativeIppAdd() の実装があります。”src/com/example/testippadd/ArrayAddActivity.java” ファイルは、JNI を介してネイティブ関数 “NativeIppAdd()” を呼び出します。
  3. jni/Andriod.mk” ファイルを確認します。このファイルは、必要なインテル® IPP ライブラリーをビルドスクリプトに追加します。サンプルで使用されている ippsAdd_32f() 関数は、インテル® IPP の信号処理ドメインに含まれています。この関数は、”libipps.a” ライブラリーと “libippcore.a” ライブラリーに依存しています。”Andriod.mk” ファイルは、それぞれ対応する 2 つの事前ビルド済みライブラリーを作成します。

サンプルコードは、SDK および NDK コマンドツールあるいは Eclipse* IDE を使ってビルドできます。

コマンドラインからサンプルをビルドする

  1. インテル® IPP ライブラリーとヘッダーファイルをプロジェクト・フォルダー (例: /ipp) にコピーします。
  2. 次のコマンドで、プロジェクト・ディレクトリーから “ndk-build” スクリプトを実行してネイティブコードをビルドします。
     >cd
     
     >/ndk-build
  3. 次のコマンドで、Android* パッケージをビルドして、アプリケーションをインストールします。
    >cd
    
    >android update project -p  .-s
    >ant debug
    >adb install bin/ArrayAddActivity-debug.apk

Eclipse* IDE からサンプルをビルドする

  1. インテル® IPP ライブラリーとヘッダーファイルをプロジェクト・フォルダー (例: /ipp) にコピーします。
  2. Eclipse* で、[File] > [New] > [Project…] > [Andriod] > [Andriod Project from Existing Code] を選択します。[Root Directory] でサンプルコード・フォルダーを指定し、[Finish] をクリックします。
  3. 次のコマンドで、プロジェクト・ディレクトリーから ‘ndk-build’ スクリプトを実行してネイティブコードをビルドします。
     >cd
     
     >/ndk-build
  4. Eclipse* IDE でアプリケーションをビルドし、.apk ファイルを展開します。

まとめ

この記事では、Android* ネイティブ・アプリケーションでインテル® IPP を使用する方法を紹介しました。インテル® IPP 関数に関する詳細は、インテル® IPP のマニュアル (英語) を参照してください。

添付ファイル サイズ
ippaddsample.tgz 2.17KB

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事