Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 3个平行区域_C++_Openmp_Parallel Processing - Fatal编程技术网

C++ 3个平行区域

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 {

如何确保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或2的
G
S
值?代码似乎没有达到预期的效果——这是在OpenMP中编写代码的正确方法吗?我以前只对循环进行过并行化。

您要做的是管道并行,并且很难正确地同步。如果您想要任何并行性,您将需要一个队列(可能是一个循环缓冲区)来存储来自a和B部分的数据,直到C部分准备就绪。例如,请看第147页,但这是一个生产者,一个消费者。

我想我缺少了
#pragma omp flush
您可能还希望看看最近的讨论:使用flush并不像看起来那么容易。