2016-11-18 7 views
2

を用いてベクターにアクセスします。計算/ Iは、マトリックスを有する並列プログラミングC++

pMatCache->at(1).push_back((*pValVec1)[j+1]); 
pMatCache->at(2).push_back((*pValVec1)[j]); 

(*pValVec2)[j] = fmax(*mpK - CalculateS(i, j), *mpD *(0.5 * (*pValVec1)[j+1] + 
         0.5*(*pValVec1)[j])); 

pMatCache->at(0).push_back((*pValVec2)[j]); 

pValVec1とpMatCacheはローカル名に対応しています。時点で私は次のことが発生した関数を適用します。 pValVec2は、長さ 'mpStages-1'の別のベクトルです。 「を算出する」以下の通りです:

double AbstractOptionSolver::CalculateS(int n, int i) 
{ 
    return pow(*mpUp,i) * pow(*mpDown, n-i) * *mpS; 
} 

どこプライベート変数「* MPS」、「* mpUp」と「* mpDown」コードの実装時に変更されません。私は何をしようとしていますが、私は以下のように行うことができると仮定並行して、この部分を実行している:

#pragma omp parallel 
{ 
    pMatCache->at(1).push_back((*pValVec1)[j+1]); 
    pMatCache->at(2).push_back((*pValVec1)[j]); 

    (*pValVec2)[j] = fmax(*mpK - CalculateS(i, j), *mpD *(0.5 * (*pValVec1)[j+1] + 
          0.5*(*pValVec1)[j])); 
} 

pMatCache->at(0).push_back((*pValVec2)[j]); 

しかし、このコードは、原因「OMP並列」のほかにクラッシュ私はちょうどOMPを持って続けても、プッシュバックのみを含む並列。誰が何が起こっているのか分からないのだろうか?

パラレルプログラミングをさらに理解して、時には特定のアスペクトをパラレルにすると、このコードが不明な理由でクラッシュしたときにいつ/いつ使用できないかを知りたいと思います。誰もがそれについて私を助けるための任意の情報源を持っていれば素晴らしいだろう。

+0

競合状態ここに –

+0

私はちょうど@appleappleの行列の2つの異なる場所にプッシュバックを適用していますか? – mwtmurphy

答えて

0

#pragma omp parallelは、スコープされた部分でまったく同じ操作を行うスレッドの束を生成するだけで、スレッドごとに一意のjまたはiを割り当てません。インデックスに基づいて並列化する方法については、http://bisqwit.iki.fi/story/howto/openmp/#ParallelismConditionalityClauseIfを参照してください。しかし、コードスニペットは、あなたがしたいことを正確に伝えるのは難しいです。

次に大きな問題は、.push_backを同時に呼び出す複数のスレッドがあることです。値を事前に割り当てて代入する必要があります。

なぜstd :: vectorでポインタと新しい構文を使用しているのかわかりません。通常、RAIIでベクトルを使用し、新規/削除呼び出しを避けます。

+0

私は、私がどこにいるのか、私が知覚的に達成しようとしているのかを示す2つの異なるコードを使って、質問にしたいことを提供しました。私はそれが私により良い洞察を与えるかどうかを見るためにリンクを見ていきます。 また、ベクトルは削除できないオブジェクトの一部であるメソッドに置かれていますが、メソッドが数千から数十万回繰り返されるため、新しい構文が使用されます。そのため、新しい/削除構文なしでベクトルを設定する割り当てエラーが発生します。 – mwtmurphy

+0

主に#pragma omp parallel部分のスニペットと混乱します。あなたが投稿したものから、個々のpush_backステートメントを並列化しようとしているように見えますが、これはうまくいきません。しかし、スレッドを多くしてバッファをあらかじめ割り当てておけば、コードを全体的に並列化できるはずですが、投稿したスニペットの外で何が起こっているのかを知らずには分かりません。 – aah

+0

私はプッシュバックとベクトル計算を並列化しようとしています。すべての情報がわかっており、読み書きに重複はありません。単に機能しないのでしょうか?それとも、うまくいかない理由がありますか?あらかじめ割り当てをしてから値を割り当てなければならない場合、この行列にいくつの列があるかわからないので、この部分を並列化しようとするのは間違いありません。このフォーラムでは、この機能以外で何が起こっているのかを見るために、いくつかの相互作用するクラスを持つ大きなプロジェクトの一部です。それは表示するコードの巨大なチャンクだろう。 – mwtmurphy

0

並列プログラミングを行うときは、「データをロックする」ことに注意しなければなりません。この技術は、2つ(またはそれ以上)のスレッドが同じデータを同時に変更して破損するのを防ぎます。

+0

同じベクトル/マトリックス内のデータを修正する並列forループが私のために働いています。なぜこれ以外のロックを適用するのでしょうか? – mwtmurphy

+0

理論化するのではなく、私はロックを設定しようとしているので、ロックがクラッシュを解決するかどうかを確認します。 – Ripi2

+0

試してみます。ヘルプをよろしくお願いいたします。 – mwtmurphy

関連する問題