3个平行区域

时间:2011-03-09 03:00:01

标签: 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
        {
            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}}或G值为1或2?代码似乎没有达到预期的效果---这是在OpenMP中编码的正确方法吗?我之前只进行了并行循环。

1 个答案:

答案 0 :(得分:2)

您要做的是管道并行,并且很难正确同步。如果你想要任何并行性,你需要一个队列(可能是一个循环缓冲区)来存储来自A和B部分的数据,直到C部分为它准备好。例如,请查看http://www.openmp.org/mp-documents/omp-hands-on-SC08.pdf的第147页,但这是一个生产者,一个消费者。