OpenMP for循环部分

时间:2013-09-06 15:10:30

标签: multithreading for-loop openmp sections

如果之前有人询问我很抱歉,我找不到它。 这是一个简单的问题,我试图使用OpenMP使每个线程运行for循环中的所有语句。

示例:假设有两个CPU,因此使用两个线程。

#pragma omp for schedule(dynamic) 
    for(int n=0; n<n_size; ++n) { 
foo1();
foo2();
}

我希望Thread [1]顺序处理foo1()和foo2(),Thread [2]来处理另一个迭代,但是使用foo1()和foo2(),依此类推。在声明for语句之后,我试图使用部分,但是,程序变得松散了。

任何帮助都将不胜感激。

干杯, -Rawi

######################################################

在下面的评论和讨论之后,我将给出一个简单的程序:

// put inside main()
int k;
#pragma omp parallel num_threads(2)
    {
#pragma omp for schedule(dynamic) // or using this: schedule(dynamic); I don't know which one is faster
        for( int n=0; n<4; ++n) {
 // #pragma omp single
            { k=0;
                foo1(k);
                foo2(k);
            }
        }

    }

// main ends here

// foo1 increments k which is passed as a reference, then prints it, then, foo2, increments k. So the upper value should be 2. Here's how they look like:
void foo1(int &n){
    cout<<"calling foo1"<<" k= "<<n<<" T["<<omp_get_thread_num()<<endl;
    ++n;

}

void foo2(int &n){
    cout<<"calling foo2"<<" k= "<<n<<" T["<<omp_get_thread_num()<<endl;
    ++n;
}

这是输出:

calling foo1 k= calling foo1 k= 0 T[00 T[1
calling foo2 k= 1 T[0
calling foo1 k= 0 T[0
calling foo2 k= 1 T[0

calling foo2 k= 2 T[1
calling foo1 k= 0 T[1
calling foo2 k= 1 T[1

正如我们所见,foo2处的T [1]为3,而应为1.

为什么我收到此错误? foo2取决于foo1找到的值(在我的应用程序中,我将实际参数传递给函数)。

所以,使用'#pragma omp single'有点帮助,但是,有一条评论说这不应该嵌套!这是使用'#pragma omp single'后的输出:

calling foo1 k= 0 T[0
calling foo2 k= 1 T[0
calling foo1 k= 0 T[1
calling foo2 k= 1 T[1

但是,还应该有4个输出(奇数n个值)?

1 个答案:

答案 0 :(得分:0)

只是不要并行化for循环,但仍然将它放在并行区域内。

#pragma omp parallel
{
  for(int n=0; n<n_size; ++n)  // every thread will run all iterations
  { 
    foo1();
    foo2();
  }
  // threads are not synchronised here! (no implicit barrier)
}