C++ 3个平行区域
如何确保3段代码与OpenMP并行执行?在下面的玩具问题中,A和B部分生成一些数据,C部分轮询数据并对其进行操作C++ 3个平行区域,c++,openmp,parallel-processing,C++,Openmp,Parallel Processing,如何确保3段代码与OpenMP并行执行?在下面的玩具问题中,A和B部分生成一些数据,C部分轮询数据并对其进行操作 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 {
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的
G
或S
值?代码似乎没有达到预期的效果——这是在OpenMP中编写代码的正确方法吗?我以前只对循环进行过并行化。您要做的是管道并行,并且很难正确地同步。如果您想要任何并行性,您将需要一个队列(可能是一个循环缓冲区)来存储来自a和B部分的数据,直到C部分准备就绪。例如,请看第147页,但这是一个生产者,一个消费者。我想我缺少了#pragma omp flush
您可能还希望看看最近的讨论:使用flush并不像看起来那么容易。