C++ OpenMP嵌套循环索引依赖项

C++ OpenMP嵌套循环索引依赖项,c++,for-loop,parallel-processing,openmp,C++,For Loop,Parallel Processing,Openmp,我不熟悉这个特殊的堆栈交换。对不起,我不知道如何使事情看起来漂亮 我正在努力使我的代码最大限度地用于娱乐项目。我用C++编写代码,我用OpenMP进行并行化。问题如下,这是实际代码的一个过于简化的版本,假设我有: //Lots of other stuff #pragma omp parallel for ordered num_threads(4) schedule(dynamic, 100) private(a,b) for(int a=0; a<230000; a++) {

我不熟悉这个特殊的堆栈交换。对不起,我不知道如何使事情看起来漂亮

我正在努力使我的代码最大限度地用于娱乐项目。我用C++编写代码,我用OpenMP进行并行化。问题如下,这是实际代码的一个过于简化的版本,假设我有:

 //Lots of other stuff

 #pragma omp parallel for ordered num_threads(4) schedule(dynamic, 100) private(a,b)
for(int a=0; a<230000; a++)
{
    for(int b=a+1; b<230000; b++)
    {

        //code increments b at times, example
        while(stored[b][0]==stored[a][0])
        {
                    b++;
        }

        //increment counter
        #pragma omp atomic
        ++counter;

        //counting part
        #pragma omp ordered
        if(stored[a][0]!=stored[b][0])
        {
           if(stored[a][1]!=stored[b][1])
           {
                //print counter to file
           }
         }
    }
}
//还有很多其他的东西
#用于有序num_线程的pragma omp并行(4)调度(动态,100)私有(a,b)

对于(int a=0;a我对您的代码感到有点困惑。如果您试图使代码并行,为什么要将ordered放在pragma for中?ordered将使其串行运行。如果您使用ordered得到错误的答案,则代码的其他部分可能是错误的

我发现的一个问题是,您在pragma语句之前声明了A和b。您可能不应该这样做,这样代码就不会混淆。A和b应该在for循环的范围内

这是我想你正在寻找的代码

// do not declare a or b in the code before or use different variables instead of a or b
int counter = 0;
#pragma omp parallel for num_threads(4) schedule(dynamic, 100)
for(int a=0; a<230000; a++)
{
    int tmpCounter = 0;
    for(int b=a+1; b<230000; b++)
    {

        //code increments b at times, example
        while(stored[b][0]==stored[a][0])
        {
                    b++;
        }

        //increment counter code
        ++tmpCounter;

        //counting part
       // idk if you need this code to be ordered?
          if(stored[a][0]!=stored[b][0])
          {
            if(stored[a][1]!=stored[b][1])
            {
                //print counter to file
            }
          }

    }
    #pragma omp critical
    counter += tmpCounter;
}
//不要在代码之前声明a或b,也不要使用不同的变量代替a或b
int计数器=0;
#用于num_线程的pragma omp并行(4)调度(动态,100)

对于(int a=0;a我之所以进行排序,是因为线程同时写入文本文件,因为行之间相互中断,因此不可读。我声明(a,b)在尝试修复问题的循环之前。在尝试修复有关计数的问题时。代码刚刚在串行模式下完成运行,减少了三分钟的go figure,并且给出了相同的计数。最初我将其与以前的输出进行比较,似乎在我最后几次代码编辑之前它们都错了。感谢响应我添加了一个TMPRADER,它极大地增加了并行代码的性能时间。这是因为当分配的for循环完成时,线程只需要等待访问计数器。考虑添加它。我还将考虑为输出创建一个TMP队列并将其写入后台文件中。l代码完成了。这可能会使您的程序更快。