同一プログラムでの OpenMP* とインテル(R) Cilk(TM) Plus の入れ子での使用

インテル® Cilk™ Plus 構造に OpenMP* 構造 (またはその逆) が含まれています。

OpenMP* とインテル® Cilk™ Plus は、並列処理を表現できる 2 つのフレームワークです。両テクノロジーとも、同じ発想に基づいています。並列処理を適用できる場所を示すソース・コーディング・パターンがあり、 作業単位に動的に適用できるワーカースレッドのプールがあります。一般に、プールにあるワーカースレッドの数は、利用可能な物理プロセシング・ユニットの数によって決まります。

インテル® Cilk™ Plus と OpenMP* で同じスレッドプールを共有することが理想です。共有しない場合、 オーバー・サブスクリプション、 つまりプロセシング・ユニットの競合が発生する可能性があります。これにより、効率性が損なわれます。一般に、インテル® Cilk™ Plus と OpenMP* の両方でオーバー・サブスクリプションを回避するよう考慮されていますが、これは、2 つのスレッド化サブシステムが互いを認識しているか、あるいは少なくとも同時にアクティブにならない場合のみ有効です。

インテル® Cilk™ Plus と OpenMP* ランタイムシステムが、このアプリケーションで使用される実装に統合されていることがわかっている場合は、この診断を無視しても安全です。

ID

問題箇所

説明

1

インテル® Cilk™ Plus 宣言または OpenMP* 宣言

内側の構造

2

インテル® Cilk™ Plus 宣言または OpenMP* 宣言

外側の構造


#include <cilk.h>
#include <omp.h>

int a[100][100] = {1, 3, 5, 7, 9};

int do_a_chunk(int row, int start, int end)
{
    int chunksum = 0;
    for (int j = start; j < end; j++) {
        chunksum += a[row][j];
    }
    return chunksum;
}

int main(int argc, char **argv)
{
    int i,j,sum;
    sum = 0;

    #pragma omp parallel for reduction(+:sum)
    for (i = 0; i < 100; i++) {
         int sum1,sum2,sum3,sum4;
         // use Intel(R) Cilk(TM) Plus to execute the inner loop on
         // (up to) four threads; not a good idea
         sum1 = cilk_spawn do_a_chunk(i, 0, 25);
         sum2 = cilk_spawn do_a_chunk(i, 25, 50);
         sum3 = cilk_spawn do_a_chunk(i, 50, 75);
         sum4 = do_a_chunk(i, 75, 100);
         cilk_sync;
         sum += sum1 + sum2 + sum3 + sum4;
    }
    return sum;
}
        

© 2010 Intel Corporation. 無断での引用、転載を禁じます。