2011-03-09 27 views
0

如何确保3段代码与OpenMP同时执行?在以下玩具问题中,部分A & B生成一些数据,部分C轮询数据并对其执行操作。3平行区域

int main(int argc, char* argv[]) 
{ 
    int G = -1,S = -1; 
    #pragma omp parallel sections default(none) shared(G,S,cout) 
    { 
     // Section A 
     #pragma omp section 
     { 
      for(;;) 
      { 
       G = G_Generator(); 
       if(G == 0) break; 
      } 
     } 
     // Section B 
     #pragma omp section 
     { 
      for(;;) 
      { 
       S = S_Generator(); 
       if(S == 0) break; 
      } 
     } 
     // Section C 
     #pragma omp section 
     { 
      for(;;) 
      { 
       if(G == 1 || S == 1) Do_1(); 
       if(G == 2 || S == 2) Do_2(); 
       if(G == 0 || S == 0) break; 
      } 
     } 
    } 
return 0; 
} 

这不起作用,我无法调试它。轮询部分C可能“错过”1或2的GS值吗?代码似乎没有达到预期的效果---这是在OpenMP中编写代码的正确方法吗?我只有以前并行循环。

回答

2

你想要做的是流水线并行,并且很难正确同步。如果你想要任何并行性,你将需要一个队列(可能是一个循环缓冲区)来存储A和B节的数据,直到C节准备就绪。举一个例子来看http://www.openmp.org/mp-documents/omp-hands-on-SC08.pdf的第147页,但这是一个生产者,一个消费者。

+0

我想我缺少'#pragma omp flush' – Jacob 2011-03-09 03:48:28

+2

您可能还想看看最近的这个讨论:http://stackoverflow.com/questions/5110816/pragma-omp-flush-to-make-exchange-线程间数据使用flush不像看起来那么容易。 – ejd 2011-03-09 13:11:47