OpenMP似乎没有并行运行

时间:2017-07-09 05:18:32

标签: c++ openmp

我正在用c ++尝试我的第一个openmp程序,我的代码是:

#pragma omp parallel for num_threads(2)
for (int i=0;i<16;++i)
{
    printf( "Thread %d works with idx %d\n", omp_get_thread_num(), i);
}

我使用g ++ -O3 -fopenmp -std = c ++ 11编译

然而,当我运行该程序时,我得到了:

Thread 0 works with idx 0
Thread 0 works with idx 1
Thread 0 works with idx 2
Thread 0 works with idx 3
Thread 0 works with idx 4
Thread 0 works with idx 5
Thread 0 works with idx 6
Thread 0 works with idx 7
Thread 1 works with idx 8
Thread 1 works with idx 9
Thread 1 works with idx 10
Thread 1 works with idx 11
Thread 1 works with idx 12
Thread 1 works with idx 13
Thread 1 works with idx 14
Thread 1 works with idx 15

是否并行运行?我期待像thread0 - thread1 - thread0 - thread1这样的东西,一个接一个。

这里会出现什么问题?提前谢谢!

1 个答案:

答案 0 :(得分:3)

是的,它正在并行运行。您可以看到正在打印的两个不同线程的ID。

  

我期待类似thread0 - thread1 - thread0 - thread1,   一个接一个。

由于您没有定义并行循环的调度,因此默认情况下它会将循环迭代划分为块并将它们分配给线程。在您的情况下,thread 0会阻止from 0 to 7阻止thread 18 - 15阻止#pragma omp parallel for schedule (static,1)

如果您希望线程以循环方式工作(一个接一个),则必须为chunk = 1的调度声明静态并行,例如:#pragma omp parallel for schedule (static,1) num_threads(2) for (int i=0;i<16;++i) { printf( "Thread %d works with idx %d\n", omp_get_thread_num(), i); }

corr = data.corr()

有关openMP循环静态调度的更多信息:

  

将循环划分为相等大小的块或尽可能相等   循环迭代次数不能被整除的情况   线程数乘以块大小。默认情况下,块   size是loop_count / number_of_threads.Set chunk为1来交错   迭代。

来源:OpenMP* Loop Scheduling

相关问题