我正在用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这样的东西,一个接一个。
这里会出现什么问题?提前谢谢!
答案 0 :(得分:3)
是的,它正在并行运行。您可以看到正在打印的两个不同线程的ID。
我期待类似thread0 - thread1 - thread0 - thread1, 一个接一个。
由于您没有定义并行循环的调度,因此默认情况下它会将循环迭代划分为块并将它们分配给线程。在您的情况下,thread 0
会阻止from 0 to 7
阻止thread 1
和8 - 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来交错 迭代。