2

i7CPUのopenMPに問題があります。

'for'ループを並列化するためだけにopenMPを使用しました。アルゴリズムはいくつかの異なるPCで使用され、問題なく機能しました。最近、i7システムで実行しようとしましたが、問題が発生しました。ソフトウェアは通常しばらく実行され、数サイクル後に「メモリ不足」と報告され、メモリリークを見つけようとしましたが、代わりに、ソフトウェアの使用済みスタックサイズが大きすぎることがわかりました。1Mbスレッドが多くありませんでした。閉まっている。どういうわけか、openMPによって作成されたスレッドはすべてスタックにスタックし、メモリはそれらでいっぱいになりました。

誰かがそのような行動を経験したことがありますか?コードは非常に単純で、他のPCでも問題なく動作する、あるサイクルを伴う「プラグマomp並列」です。

組み込みのopenMPライブラリを備えたMicrosoftVisualC++9.0コンパイラを使用しています。

ありがとうセルゲイ

4

4 に答える 4

3

回答ありがとうございます。OpenMP がいくつかの並列ループを開始すると、いくつかのスレッドが開き、最後に停止せず、別の並列ループで再利用されることがわかりました。i7 の場合、それらは再利用されませんが、並列ループごとに常に新しいものが作成されるため、安定した 1Mb スタックの成長があります。

また、いくつかのループを並列化するために openMP を使用するだけの非常に単純なアプリケーションを作成しようとしましたが、i7 では問題は見られませんでした。メインソフトウェアには、並列化でこのような問題が発生する条件がいくつかあるようです。さらに検索しようとしています...

于 2009-09-01T08:18:32.267 に答える
0

Intel Thread Building Blocksライブラリ(TBB)を使用してみると、OpenMPと非常によく似ており、説明した方法でforループを並列化するのが非常に簡単です。違いがあるかどうかを確認してください。

于 2009-08-31T00:33:30.487 に答える
0

私はあなたのコードを見ることができないので、私は推測しようとします...

#pragma omp for を使用すると、入れ子になったループの問題のように思えます。

ネストされたループがある場合は、内側のループのカウンター変数をプライベートとして設定する必要があります。

このサンプルを見てください:

#pragma omp for private(j)
for(i=0; i<100; i++)
{
    for(j=0; j<10; j++)
    {
       A[i] = A[i] * 2;
    }
}

変数 j は、すべてのスレッドで同じインスタンスではなく、すべてのスレッドでそのインスタンスを持つために private に設定されています。

コードでこれを確認してください。おそらくそれが問題です。

そして(あなたのコンパイラはそれを教えてくれるはずです)ブレークを使用しないでください。並列化されたループで。それはうまくいきません。

幸運を!

于 2012-06-14T12:43:49.740 に答える
0

アプリケーションの問題ではなく、OSの問題のように聞こえます。コンパイラが同じコードに対して同じアセンブリを生成すると仮定します。古いハイパースレッド CPU を使用している場合は、コードを試して、そこで同じ問題が発生するかどうかを確認してください。

于 2009-08-31T00:40:09.507 に答える