6

Is the C++ code below legal, or is there a problem with my compiler? The code was complied into a shared library using

gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC)

and openMP and then called via R 2.15.2.

int it=0;
#pragma omp parallel sections shared(it)
   {
      #pragma omp section
      {
           std::cout<<"Entering section A"<<std::endl;
           for(it=0;it<10;it++)
           {
                   std::cout<<"Iteration "<<it<<std::endl;

           }
           std::cout<<"Leaving section A with it="<<it<<std::endl;
      }

      #pragma omp section
      {
           std::cout<<"Entering section B with it="<<it<<std::endl;
           while(it<10)
           {
                   1;
           }
           std::cout<<"Leaving section B"<<std::endl;
  }
}

I obtain the following output (apologies for interweaving output from 2 threads but I think it is interpretable):

Entering section A
Iteration Entering section B with it=0
0
Iteration 1
Iteration 2
Iteration 3
Iteration 4
Iteration 5
Iteration 6
Iteration 7
Iteration 8
Iteration 9
Leaving section A with it=10

The program then stalls: section B seems to get stuck in the while loop. Since the variable 'it' is shared I do not understand why the while loop doesn't terminate when section A is complete.

4

1 に答える 1

4

これは、shared変数はすべてのスレッドで同じであることを意味するだけですが、プログラマーは手動でアクセスを同期する必要があるためです。

SHARED句

複数のスレッドが (CRITICAL セクションなどを介して) SHARED 変数に適切にアクセスできるようにすることは、プログラマの責任です。

したがって、たとえば、最初のセクションが完了した後に変数をフラッシュできます。

      #pragma omp section
      {
           std::cout<<"Entering section A"<<std::endl;
           for(it=0;it<10;it++)
           {
                   std::cout<<"Iteration "<<it<<std::endl;

           }
           #pragma omp flush(it)
           std::cout<<"Leaving section A with it="<<it<<std::endl;
      }

      #pragma omp section
      {
           std::cout<<"Entering section B with it="<<it<<std::endl;
           while(it<10)
           {
            #pragma omp flush(it)
                   1;
           }
           std::cout<<"Leaving section B"<<std::endl;
      }
于 2013-04-30T18:22:32.450 に答える