如果之前有人询问我很抱歉,我找不到它。 这是一个简单的问题,我试图使用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个值)?
答案 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)
}