私の要件は、このようなものです: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
を設定する必要があります:あなたはこのを探している
calloc()が失敗した場合、すぐに戻る必要がありますか?そうでなければ、何もする必要はありません。もしそうなら、独自のアボートを実装する必要があります。例:http://www.thinkingparallel.com/2007/06/29/breaking-out-of-loops-in-openmp/ – David
実際、ワーカースレッドの1つが並列の内部から戻ることは意味がありませんブロック。パラレルブロックを含む関数を呼び出したスレッドのみが、その関数から戻ることができます。 –
並列ループにメモリを割り当てることはお勧めできません。私は通常、 'calloc'と友人がロックを使うと仮定します。そうすれば、あなたはたくさんの競合を得るでしょう。だから、2番目のバージョンでは、すべてのメモリを割り当てているマスタースレッドが、実際にはより良いパフォーマンスを出すかもしれません。これは、中央のcallocがNUMA /最初のタッチポリシーを混乱させないと仮定して再び仮定しています。それは[複雑な話題](http://scicomp.stackexchange.com/q/2028)ですが、実際にはパフォーマンスにとって非常に重要です。直感的に私は*シリアルアロケーション*と測定を続けます。 – Zulan