2017-03-15 21 views
0

openMPを使用してマルチスレッドを適用したいと思います。 ここに書いた簡単なコードです。OpenMP double for loop

vector<Vector3f> a; 
int i, j; 
for (i = 0; i<10; i++) 
{ 
    Vector3f b; 
#pragma omp parallel for private(j) 

    for (j = 0; j < 3; j++) 
    { 
     b[j] = j; 
    } 
    a.push_back(b); 
} 

for (i = 0; i < 10; i++) 
{ 
    cout << a[i] << endl; 
} 

私は作品のリクにそれを変更したい:の#pragma行が削除された場合に

parallel for1 
{ 
    for2 
} 

または

for1 
{ 
    parallel for2 
} 

コードは動作します。私はそれを使用すると動作しません。どうしたの?

/////////追加

は、実際に私は ダブルループ質問のためのより複雑な例にOpenMPのを使用しています。

ここにも、私はMPを適用しないとき、それはうまく動作します。 しかし、私はそれを適用すると、 ベクトルpush_back行でエラーが発生します。

vector<Class> B; 
for 1 
{ 
    #pragma omp parallel for private(j) 
    parallel for j 
    { 
     Class A; 
     B.push_back(A); // error!!!!!!! 
    } 
} 

B.push_back(A)行を消去すると、MPを適用すると同様に動作します。

正確なエラーメッセージが見つかりませんでしたが、ベクトルに関する例外エラーのようです。デバッグは、スレッドセーフではありません

void _Reallocate(size_type _Count) 
    { // move to array of exactly _Count elements 
    pointer _Ptr = this->_Getal().allocate(_Count); 

    _TRY_BEGIN 
    _Umove(this->_Myfirst, this->_Mylast, _Ptr); 
+1

エラーメッセージを追加してください。また、なぜC++を使用している間にC89スタイルの変数を宣言していますか? –

+0

[mcve]を作成してください。あなたの例の並列化について議論することは、コード全体が数マイクロ秒かかるため、実際には有用ではありません。並列化が実際に意味をなさない場所に何かを提示することができれば、はるかに生産的になるでしょう。 – Zulan

+0

私はもっと多くの行を追加しました! – Wooni

答えて

1

std::vector::push_backで停止し、あなたが複数のスレッドからの競合状態に対する任意の保護なしでそれを呼び出すことはできません。

代わりに、サイズがすでに正しいようにベクトルを準備し、operator[]で要素を挿入します。

また、重要な領域に挿入を保護することができます。一度に一つのスレッド

#pragma omp critical 
B.push_back(A); 

この方法では、エラーを修正しますが、コードを遅くする挿入を行います。

一般的には、並列化には適切な方法でアプローチしないと思いますが、より明確でより代表的な問題記述がない限り、より良いアドバイスを与える方法はありません。

+0

ありがとうございます。これは機能します。また、言及したように、並列化としては完全には機能しません。もっと勉強する必要があります。 – Wooni

+0

答えがあなたの元の問題を解決した場合は、チェックマークclickingをクリックしてそれを合格とマークしてください。パラレル・スピードアップに関するフォローアップの質問については、[mcve]を作成し、使用しているパフォーマンスとコンパイラとシステムを記述してください。 – Zulan