2017-01-27 7 views
2

私の要件は、このようなものです:OpenMP並列コードでリターンを処理する方法は?

typedef struct 
{ 
    ...... 
}A; 

A *p[N]; 

#pragma omp parallel 
{ 
    #pragma omp for 
    for (int i = 0; i < N; i++) { 
     p[i] = (A*)calloc(sizeof(*p[i]), N); 
     if (NULL == p[i]) { 
      return; 
     } 
     ......   
    } 
} 

しかし、コンパイラが文句を言うだろう::すべてのスレッドがメモリ自体を割り当て、それを処理#pragma omp parallel外のメモリを割り当てるコードを置く除く

error: invalid exit from OpenMP structured block 
    return; 

そうします:

for (int i = 0; i < N; i++) { 
    p[i] = (A*)calloc(sizeof(*p[i]), N); 
    if (NULL == p[i]) { 
     return; 
    }  
} 
#pragma omp parallel 
{ 
    #pragma omp for 
    ...... 
} 

もっと良い方法はありますか?

#pragma omp parallel 
{ 
    #pragma omp for 
    for (int i = 0; i < N; i++) { 
     p[i] = (A*)calloc(sizeof(*p[i]), N); 
     if (NULL == p[i]) { 
      #pragma omp cancel for 
     } 
     ......   
    } 
} 

をしかし、あなたはこれが機能するためにtrueに環境変数OMP_CANCELLATIONを設定する必要があります:あなたはこのを探している

+0

calloc()が失敗した場合、すぐに戻る必要がありますか?そうでなければ、何もする必要はありません。もしそうなら、独自のアボートを実装する必要があります。例:http://www.thinkingparallel.com/2007/06/29/breaking-out-of-loops-in-openmp/ – David

+0

実際、ワーカースレッドの1つが並列の内部から戻ることは意味がありませんブロック。パラレルブロックを含む関数を呼び出したスレッドのみが、その関数から戻ることができます。 –

+2

並列ループにメモリを割り当てることはお勧めできません。私は通常、 'calloc'と友人がロックを使うと仮定します。そうすれば、あなたはたくさんの競合を得るでしょう。だから、2番目のバージョンでは、すべてのメモリを割り当てているマスタースレッドが、実際にはより良いパフォーマンスを出すかもしれません。これは、中央のcallocがNUMA /最初のタッチポリシーを混乱させないと仮定して再び仮定しています。それは[複雑な話題](http://scicomp.stackexchange.com/q/2028)ですが、実際にはパフォーマンスにとって非常に重要です。直感的に私は*シリアルアロケーション*と測定を続けます。 – Zulan

答えて

3

あなたは、これは、各コア/ノードにローカルメモリを割り当てることができ、この

omp_set_dynamic(0); //Explicitly turn off dynamic threads 
bool cancel = false;  

#pragma omp parallel for schedule(static) 
for (int i = 0; i < N; i++) { 
    p[i] = (A*)calloc(sizeof(*p[i]),N); 
    if (NULL == p[i]) cancel = true; 
} 
if(cancel) return; 
#pragma omp parallel for schedule(static) 
for (int i = 0; i < N; i++) { 
    ...... 
} 

を試みることができます。スレッドの数を動的に調整しないで、schedule(static)を使用して、2番目のforループのスレッドが最初のforループに割り当てられた同じメモリにアクセスすることを確認しました。

この解決策が改善するかどうかわかりません。 this commentによれば、悪化する可能性があります。あなたがマルチソケット(NUMA)システムを持っているかどうかには大きな違いがあります。

5

、私は思います。

キャンセルは高価なので、これを避けるようにしてください。

+0

私は前に 'omp canel'について聞いたことがありません。 OpenMPのどのバージョンにはありますか? –

+1

@Zboson OpenMP 4.0に追加されました – Zulan

関連する問題