2

Windows 7 マシンで Visual Studio 2010 と OpenMP を使用しています。次のコード スニペットを作成しました。

#pragma omp parallel for
for(int jj=0;jj<2;jj++){
MSG msg;
// do something in parallel for jj
int i_loopcounter = 0;
bool b_continue = true;
while(GetMessage(&msg, NULL, 0, 0)&&b_continue){
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    i_loopcounter++;    
    if(i_loopcounter==50){
        b_continue = false;
        //abort(); <- ugly, since a window appears  
        //exit(0); <- rest of the code is not executed
        //break;  <- not allowed
        //goto end; <- not allowed
    }
}
end:;
// do some other stuff in parallel for jj
} //end of parallel for

私の問題は次のとおりです。

変数を使用するb_continueと、最初の while ループがアボート条件に達したときにプログラムがハングアップし (これは競合状態ですか?)、その結果、プログラムは残りの部分を実行しません。コード。

では、どうすればこれを機能させることができますか?

openmp の構造化ブロックの解除で提案されている解決策を試しましたが、状況は変わりません。

ハードウェアからファイルをダウンロードするには、自己破壊する while ループが必要です。終了後、プログラムはそのファイルに対して何らかの作業を行う必要があります。コードの並列化を開始する前は、while ループで break ステートメントを使用してうまく機能していました。

この問題を解決するためのヒントをくれたコメントに感謝します。

更新:コードを次のように変更しました

int i_loopcounter = 0;
    while(_i_NoDownloads!=2){
        GetMessage(&msg, NULL, 0, 0);
        TranslateMessage(&msg);
        DispatchMessage(&msg);
        i_loopcounter++;    
        if(_b_control){
            cout<<i_loopcounter <<" of Thread "<<omp_get_thread_num()<<endl;
        }       
    }

グローバル変数_i_NoDownloadsは、ダウンロードされたファイルの数をカウントします。2 に達すると、メッセージ ループは不要になります。ただし、これを変更してもプログラムの動作は変わりません。while ループが必ずしも 50 回繰り返されるとは限りません。問題は、メッセージ ループを同時に破壊することだと思います。

更新 2: Windows メッセージの概念について多くのことを読んだ後、機能する解決策を見つけました。並列セクションが終了しなかった理由は、GetMessage の動作です。

繰り返しになりますが、この問題に貢献してくれたすべての人に感謝します。

乾杯TL

4

2 に答える 2

1

並列領域で中止することはできません 。 http://www.thinkingparallel.com/2007/06/29/breaking-out-of-loops-in-openmp/

可能な解決策、 http://openmp.org/forum/viewtopic.php?f= 3&t=1431

于 2013-05-08T09:44:15.627 に答える
0

少数のハードコードされた反復回数を使用しているように見えるので:

#pragma omp parallel for
for(int jj = 0; jj < 2; jj++){
 /* ... */
} //end of parallel for

sections次のディレクティブに基づいて解決策を検討することをお勧めします。

#pragma omp parallel
{
#pragma omp sections
  {
#pragma omp section
    {
      /* jj = 0 */
    }         
#pragma omp section
    {
      /* jj = 1 */
    }             
  } // End sections
#pragma omp single
  { 
    /* While loop */
  }
  /* ... */      
} // End parallel
于 2013-05-13T14:04:42.323 に答える