私は自分自身にいくつかのOpenMPを教えました。これはばかげているかもしれません。基本的に私は、各ノードが処理に長い時間を費やしながら、幅広い最初の検索プログラムをC++で並列化しようとしています。ここにコード例があります:forループで1つの関数だけを並列化するようにOpenMPに指示するにはどうすればよいですか?
queue<node*> q;
q.push(head);
while (!q.empty()) {
qSize = q.size();
for (int i = 0; i < qSize; i++) {
node* currNode = q.front();
q.pop();
doStuff(currNode);
q.push(currNode);
}
}
処理関数doStuff()は非常に高価で、並列化したいと思います。しかし、forループの直前に#pragma omp parallel for
を置くことによって、forループを並列化すると、実行時にあらゆる種類の奇妙なエラーがポップアップします。私はその理由は、q.front()
とq.push()
が並列化され、q.front()
によって複数のスレッドが同じノードを取得する可能性があることを推測しています(q.push
が処理される前にすべて処理されているためです)。
どうすればこの問題を回避できますか?
幅優先検索は、本質的には順次アルゴリズムです。これは、各ステップが前のステップの結果に依存するためです。それを並列化するためのいくつかのテクニックがあります - "並列木越え"のためのウェブ検索を行いますが、それはOpenMPの 'parallel for'ほどシンプルではありません。 – Wyzard
@WyzardあなたはDFSとBFSを混同しなければなりません。並列でBFSの前面を計算するだけでも問題ありません。 – Zulan