付録 B: その他のスレッドパッケージとの併用

インテル® スレッディング・ビルディング・ブロック (インテル® TBB) は、他のスレッドパッケージと併用できます。他製品のスレッドパッケージとともに、インテル® TBB の機能を使用するために、特別な作業は必要ありません。[9]

OpenMP* で外ループを並列化し、インテル® TBB で内ループを並列化する例を次に示します。

int M, N;
 
struct InnerBody {
    ...
};
 
void TBB_NestedInOpenMP() {
#pragma omp parallel
    {
#pragma omp for
        for( int i=0; i<M; ++ ) {
            parallel_for( blocked_range<int>(0,N,10), InnerBody(i) );
        }
    }
}

InnerBody の詳細は、ここでは省略します。#pragma omp parallel 文では、OpenMP* はスレッドのチームを作成し、各スレッドはプラグマに関連付けられているブロック文を実行します。#pragma omp for 文は、コンパイラーが直前の OpenMP* 並列領域で作成されたスレッドチームを使用してループを並列に実行することを示します。

次の例は、上の例を POSIX* スレッドを使用して記述したものです。

int M, N;
 
struct InnerBody {
    ...
};
 
void* OuterLoopIteration( void* args ) {
    int i = (int)args;
    parallel_for( blocked_range<int>(0,N,10), InnerBody(i) );
}
 
void TBB_NestedInPThreads() {
    std::vector<pthread_t> id( M );
    // それぞれの外ループ反復用のスレッドを生成
    for( int i=0; i<M; ++i )
        pthread_create( &id[i], NULL, OuterLoopIteration, NULL );
    // Wait for outer loop threads to finish
    for( int i=0; i<M; ++i )
        pthread_join( &id[i], NULL );
} 

[9] インテル® TBB 2.1 では、並列化アルゴリズムやタスク・スケジューラーを使用する各スレッドで、tbb::task_scheduler_init オブジェクトを構築する必要がありました。インテル® TBB 2.2 以降では、タスク・スケジューラーが自動的に作成されます。