Intel TBBを使用してマルチスレッドアプリケーションを作成する

TBB この記事は、主にこのライブラリについて聞いたことがある人を対象としていますが、どこから始めればよいかを意味するものではありません。



Intel Threading Building Blocksは、マルチスレッドアプリケーションの作成と展開を簡素化し、開発者にプログラムがどのアーキテクチャとプラットフォームで使用されるかを考えさせない多くのツールを提供します。 彼女はスレッドを扱う責任があります。



簡単な例でIntel TBBの使用を見てみましょう。 少し前に、 OpenMPを使用してマルチスレッドアプリケーション作成する例を示しました。これは、MD5のハッシュによってパスワードを総当たり攻撃します。 同じことを行いますが、TBBを使用します。



私はすぐに予約をします、これはMD5のハッシュによるパスワード選択のためのユーティリティを書く命令ではありません、そのようなタスクのために、そのようなタスクのために、他の、よりエレガントなソリューションがあります。



最初に、ライブラリダウンロードする必要があります 。 執筆時点では、ライブラリの最新の安定バージョンはバージョン3.0でした。 アーカイブをディスク上の任意のフォルダーに解凍します。 私の場合、フォルダD:\ Libs \ (取得したライブラリへのフルパスはD:\ Libs \ tbb30_20100406oss \でした )。



この例は、いくつかの例外を除いてMS VS 2008で作成されたもので、MS VSの他のバージョンでも同じことが言えます。



新しいコンソールプロジェクトを作成します。 プロジェクトのプロパティで、ヘッダーファイルを含むIncludeフォルダーと、リンカーライブラリを含むLibフォルダーへのパスを指定する必要があります。

プロジェクトプロパティを開き、 C / C ++-> GeneralタブAdditional Include Directories行でIncludeフォルダーにパスを追加します。私の場合、これはD:\ Libs \ tbb30_20100406oss \ includeのパスです。



画像



次に、 [リンカー]-> [一般]セクションに移動し、 [ 追加のライブラリディレクトリ]フィールドに[ Lib ]フォルダーへのパスを追加します( D:\ Libs \ tbb30_20100406oss \ lib \ ia32 \ vc9 )。



画像



ターゲットプラットフォームとMS VSのバージョンによっては、libフォルダーへのパスが変更される場合があります。たとえば、10番目のスタジオではlib \ ia32 \ vc10、64ビットプラットフォームではlib \ intel64 \ vc9になります。



設定すると、プログラムの作成を開始できます。 ヘッダーファイルを追加することから始めましょう。



#include "tbb/task_scheduler_init.h"

#include "tbb/parallel_for.h"

#include "tbb/blocked_range.h"

using namespace tbb;




* This source code was highlighted with Source Code Highlighter .






メイン関数では、使用を開始する前に、 task_scheduler_initクラスのインスタンスを作成して初期化する必要があります。



int _tmain( int argc, _TCHAR* argv[])

{

task_scheduler_init init;



return 0;

}



* This source code was highlighted with Source Code Highlighter .






ライブラリの概念は、開発者が特定のアクションを実行するタスクを作成する必要があるようなものです。たとえば、並列化できるデータ配列に対してです。 この場合、タスクは特定の範囲の数値を受け取り、その数値内で各数値のMD5ハッシュを計算し、標準と比較します。



class MD5Calculate

{

public :

//////////////////////////////////////////////////////////////////////////

// , TBB

// ,

// ""

//////////////////////////////////////////////////////////////////////////

void operator () ( const blocked_range< int >& range) const

{

string md5;

stringstream stream;



for ( int i = range.begin(); i != range.end(); i++)

{

stream.clear();



stream << i;



GetMD5Hash(stream.str(), md5);



if (md5 == g_strCompareWith)

{

cout << "Password is: " << stream.str() << endl;



exit(0);

}

}

}

};




* This source code was highlighted with Source Code Highlighter .






このコードはparallel_for関数を使用し呼び出されます



int _tmain( int argc, _TCHAR* argv[])

{

task_scheduler_init init;



//////////////////////////////////////////////////////////////////////////

// ,

// 8000000 8999999

//////////////////////////////////////////////////////////////////////////



parallel_for(blocked_range< int >(8000000, 8999999), MD5Calculate());



return 0;

}




* This source code was highlighted with Source Code Highlighter .






ご覧のとおり、すべてがシンプルで、最も注目すべき点は、TBBはクロスプラットフォームソリューションであり、特定のプラットフォームでストリームを操作する方法を考えないようにすることです。

もう1つの利点は、ライブラリ自体がターゲットプラットフォーム上の最適なスレッド数を処理することです。 スレッドの数は、プロセッサコアの数と等しくなります。



このライブラリは非常に便利で機能的であり、parallel_forループを並列化する関数に加えて、関数parallel_reduceparallel_scanparallel_do 、コンテナー、同期オブジェクトなどが含まれています。



ライブラリの公式Webサイトでは、Windows、Linux、Mac OS X、Solarisなどのさまざまなプラットフォームのライブラリアーカイブと、ドキュメントと使用例を見つけることができます。



All Articles