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/break-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 回答