Android:インテル®スレッディングビルディングブロックを使用したマルチスレッドアプリケーションの作成

最近では、Intel Threading Building Blocks( Intel TBB )を使用して、Windowsストア用のマルチスレッドアプリケーションを作成することを検討しました 。 クロスプラットフォームのTBBライブラリを使用すると、コンピューティングパーツを他のプラットフォームに簡単に転送できるようになります。 Androidは、「その他のプラットフォーム」の1つの良い例として機能しますが、詳細は省略されています。



threadingbuildingblocks.org Webサイトからダウンロードできる最近リリースされたIntel TBBライブラリtbb41_20121112ossは、Androidアプリケーションの実験的サポートを追加しました。 JNIインターフェイスを介してAndroidアプリケーションで使用するネイティブライブラリを構築します。



ライブラリを構築するには、Android SDK Tools Rev.21およびAndroid NDK Rev 8Cを使用します。 ただし、ここでは、資料の準備中に判明したように、ライブラリ自体の実験性と構築がこのリリースに影響したことを予約する必要があります。 そのまま使用できるのは、LinuxのNDKでのみです。 次のアップデートのいずれかでこれを修正します。 Windows用の小さなメイクファイルを作成し、そこにライブラリを構築しましたが、簡単にするために、ライブラリ自体はLinux上で構築され、他のすべてはWindows上で行われると仮定します。 一般に、クロスプラットフォームライブラリにはもう1つの利点があります。



そのため、Intel TBBを使用して簡単なアプリケーションを構築するために何をする必要がありますか。

このリリースはソースでのみ配布されるため、最初にライブラリを解凍してコンパイルする必要があります。 gnu makeがあり、NDKの公開された環境のコマンドラインでコマンドを実行することが理解されます。



gmake tbb tbbmalloc target=android
      
      





ライブラリの側から、Eclipseに移動します。 テンプレートを使用して、単純なアプリケーションを作成し、簡単にするために、前のケースのようにapp1と呼びます。





アクティビティはFullscreenActivityを選択します。 これでテンプレートの作業は完了です。 com.example *アプリはGoogleストアでは歓迎されないことに注意してください。 しかし、たとえば、大丈夫です。



次に、メインフレームにいくつかのボタンを追加します。 その後、メインフレームのXMLファイル(app1 / res / layout / activity_fullscreen.xml)は次のようになります。



 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#0099cc" tools:context=".FullscreenActivity" > <TextView android:id="@+id/fullscreen_content" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:keepScreenOn="true" android:text="@string/dummy_content" android:textColor="#33b5e5" android:textSize="50sp" android:textStyle="bold" /> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" > <LinearLayout android:id="@+id/fullscreen_content_controls" style="?buttonBarStyle" android:layout_width="match_parent" android:layout_height="74dp" android:layout_gravity="bottom|center_horizontal" android:background="@color/black_overlay" android:orientation="horizontal" tools:ignore="UselessParent" > <Button android:id="@+id/dummy_button1" style="?buttonBarButtonStyle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/dummy_button1" android:onClick="onClickSR" /> <Button android:id="@+id/dummy_button2" style="?buttonBarButtonStyle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/dummy_button2" android:onClick="onClickDR" /> </LinearLayout> </FrameLayout> </FrameLayout>
      
      





そして、行を含むファイル(app1 / res / values / strings.xml)は次のようになります。

 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Sample</string> <string name="dummy_content">Reduce sample</string> <string name="dummy_button1">Simple Reduce</string> <string name="dummy_button2">Deterministic Reduce</string> </resources>
      
      





ボタンハンドラも追加する

 // JNI functions private native float onClickDRCall(); private native float onClickSRCall(); public void onClickDR(View myView) { TextView tv=(TextView)(this.findViewById(R.id.fullscreen_content)); float res=onClickDRCall(); tv.setText("Result DR is \n" + res); } public void onClickSR(View myView) { TextView tv=(TextView)(this.findViewById(R.id.fullscreen_content)); float res=onClickSRCall(); tv.setText("Result SR is \n" + res); }
      
      





FullscreenActivity.javaにライブラリをロードする

  @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); … System.loadLibrary("tbb"); System.loadLibrary("jni-engine"); }
      
      





tbbライブラリを使用してすべてをクリアする必要がある場合は、jni-engineをさらに詳しく調べる必要があります。



「Jni-engine」は、コンピューティング部分を実装し、JNI呼び出しonClickSRCall()およびonClickDRCall()のCインターフェイスを公開するC ++ライブラリです。



プロジェクト内の開発ルールに従って、「jni」ディレクトリを作成し、jni-engineライブラリに固有の3つのファイルを作成します。 これは:

Android.mk(<>内は、現在の値を置き換える必要のあるデータを囲みます)

 LOCAL_PATH := $(call my-dir) TBB_PATH := <path_to_the_package> include $(CLEAR_VARS) LOCAL_MODULE := jni-engine LOCAL_SRC_FILES := jni-engine.cpp LOCAL_CFLAGS += -DTBB_USE_GCC_BUILTINS -std=c++11 -I$(TBB_PATH)/include LOCAL_LDLIBS := -ltbb -L./ -L$(TBB_PATH)/<path_to_libtbb_so> include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libtbb LOCAL_SRC_FILES := libtbb.so include $(PREBUILT_SHARED_LIBRARY)
      
      





Application.mk

 APP_ABI := x86 APP_GNUSTL_FORCE_CPP_FEATURES := exceptions rtti APP_STL := system
      
      





jni-engine.cpp:

 #include <jni.h> #include "tbb/parallel_reduce.h" #include "tbb/blocked_range.h" float SR_Click() { int N=10000000; float fr = 1.0f/(float)N; float sum = tbb::parallel_reduce( tbb::blocked_range<int>(0,N), 0.0f, [=](const tbb::blocked_range<int>& r, float sum)->float { for( int i=r.begin(); i!=r.end(); ++i ) sum += fr; return sum; }, []( float x, float y )->float { return x+y; } ); return sum; } float DR_Click() { int N=10000000; float fr = 1.0f/(float)N; float sum = tbb::parallel_deterministic_reduce( tbb::blocked_range<int>(0,N), 0.0f, [=](const tbb::blocked_range<int>& r, float sum)->float { for( int i=r.begin(); i!=r.end(); ++i ) sum += fr; return sum; }, []( float x, float y )->float { return x+y; } ); return sum; } extern "C" JNIEXPORT jfloat JNICALL Java_com_example_app1_FullscreenActivity_onClickDRCall(JNIEnv *env, jobject obj) { return DR_Click(); } extern "C" JNIEXPORT jfloat JNICALL Java_com_example_app1_FullscreenActivity_onClickSRCall(JNIEnv *env, jobject obj) { return SR_Click(); }
      
      





ご覧のとおり、前のブログと同じアルゴリズムを使用しています。



NDKを使用してビルドする場合、彼はライブラリをlibjni-engine.soやlibtbb.soなどの必要なディレクトリに分解します。



次に、Eclipseに戻り、.apkファイルをビルドします。 アプリケーションはAVDまたはデバイスにインストールする準備ができています。 これはAVDでどのように見えるかです:







以上です! 簡単なアプリケーションが書かれています! そして、前のブログのコードを使用した人のために、アプリケーションは正常にAndroidに移植されました。



興味がある人のために、試してみてください:



インテルスレッディングビルディングブロックライブラリ(オープンソースバージョン)をダウンロードします。

threadingbuildingblocks.org

Intel TBBの商用バージョン(機能的に違いはありません):

software.intel.com/en-us/intel-tbb



Intel TBBに関する英語およびロシア語のブログ

software.intel.com/en-us/tags/17207

software.intel.com/en-us/tags/17220

そしてもちろん、私たちのフォーラム、

software.intel.com/en-us/forums/intel-threading-building-blocks



All Articles